Files
SirRoboGarage/common_libs/tests
SirStone 2daa519e15 TFIL heat field: the safety model keeps us ~400px away, which is our worst range
Offline diagnostic driving the REAL TFILModule.computeMove over the committed
DrussGT fixtures (re-derived field matched the module's own m.lava bit-for-bit,
max diff 0.000e+00). Answers "is the heat map too hot, and are the corridors to
blame?" - the user's suspicion after watching a GUI run stay far away.

PRIMARY FIXTURE (tr_drussgt_vs_modularbot, 20,026 ticks / 15 rounds):

Field saturation
  tiles == 0                 22%
  tiles > 0                  78%
  tiles > PathDangerThreshold(10)   61%   (worst tick 91%)
  median / p90 / max lava    20.06 / 44.53 / 77.51
  > 10 with NO bullets at all      44%   <- wall radiance + pillar alone
  early/mid/late frac > 10   0.61 / 0.63 / 0.60  (saturated from tick 0, not degrading)

Safe pool - THIS IS THE KEY NUMBER
  inside-hull tiles/tick     173.7
  safeTiles/tick              15.19
  ticks with ZERO tile passing the filter   58.5%   (2-tile promote fallback used 59.0%)
  ticks where the ring weighting is enabled (pool >= MinRingPool=4)   39.1%
  ticks with >=1 safe tile in the 100-200px band   11.84%
  MEAN DISTANCE TO THE CLOSEST SAFE TILE   397.8 px
  ticks both pool>=4 AND band present ("band-weightable")   10.79%

So the safety filter leaves nothing safe near the target: the closest safe tile
averages 398px away. Our measured hit rate is 27.1% at 100-200px and ~5% at
450px, so TFIL's danger model structurally parks us at our worst range. This -
not only the env-var issue - is why the bot stays far away.

Per-source attribution (share of total lava / of the over-10 set)
  wall        60.56% / 56.39%   <- saturates the RAW field
  corridor    25.43% / 21.35%   <- blocks the BAND
  pillar       7.44% /  5.06%
  bullet_aura  2.22% /  1.47%
  enemy_core   1.97% /  0.62%
  bullet_core  1.17% /  0.33%
  enemy_aura   1.21% /  0.95%
Note CorridorHeat=20 is TWICE PathDangerThreshold=10, so a single corridor can
poison a path on its own; WallHotness=30 with WallRadiance=10 puts the outer two
tile rings at/over threshold by themselves (38.6% of all tiles).

Counterfactuals (shipped constants NOT changed) - band-weightable ticks
  corridor 20 (shipped)   10.79%   band-safe 11.84%   pool 15.19
  corridor 10             16.47%                     pool 30.54
  corridor  5             23.80%   band-safe 24.21%   pool 43.93
  corridor  0             38.74%                     pool 62.14
  wall 30->10 only        pool 15.19 -> 24.80, band unchanged (12.31%)
  corridor 5 + wall 10    26.45%   band-safe 26.64%   pool 85.04

Reachability - NOT the blocker
  band inside the 50-tick reachable hull   64.94% of ticks
  0-300px inside hull                      90.34%
So the band is reachable 65% of the time but SAFE only 12%: the 53-point gap is
heat, not hull geometry.

VERDICT: heat saturation is the real blocker; the WALL is the largest raw-heat
source but the CORRIDORS are the band blocker (removing them multiplies
band-weightable ticks 3.6x, while taming walls leaves the band unchanged).
Even at corridor=0/wall=0 the band is weightable only 40% of ticks, so no
constant tweak fully unlocks the range weighting - the safe set against DrussGT
rarely reaches 100-200px at all. Recommended (NOT applied): CorridorHeat 20->5
and WallHotness 30->10, to be validated by a live A/B.

Adds common_libs/tests/measure_tfil_heat_field.nim (offline, no shipped file
touched; both movers byte-identical).
2026-09-21 23:39:14 +02:00
..