Files
SirRoboGarage/tools/ab/arms_tfil_turn.txt
T
SirStone 39c90fd930 j145 TFIL: a turn-cost tiebreak among the SAFE tiles (default-off)
The picker scored candidates on pathMaxHeat alone and then drew uniformly
among the survivors, so a mirror-side tile was as likely as a straight-ahead
one. Added a continuous turn cost as a DRAW WEIGHT applied only after the
hard heat filter:

  w = max(1, round(1 + TR_TFIL_TURN_BIAS * (1 - max(0,|turn| - REF)/180)))

- TR_TFIL_TURN_BIAS (default 0) is the odds ratio straight-ahead vs 180 deg;
  TR_TFIL_TURN_REF_DEG (default 45) is where the penalty starts. Both
  default-off-effect: the default-path golden in test_tfil_commit_env.nim is
  unchanged and still passes.
- Turn cost is NEVER folded into the heat score. The filter stays hard.
- The draw stays random (j51 measured an argmin worse); every weight is
  floored at 1, so the pool can never be emptied and bias 0 is exactly the
  shipped uniform draw.
- |turn| now travels on the ScoredTile, and the commit log gained turn /
  minturn / promote so a caller can measure the regret of the draw.

Guards: 51 -> 66 checks (an absurd 99:1 bias never rescues an over-threshold
tile; mean |turn|, draw regret, >90 and mirror-side shares all fall; path
heat does not rise). env_report + .env.example updated.
2026-09-26 21:56:54 +02:00

36 lines
2.3 KiB
Plaintext

# ─────────────────────────────────────────────────────────────────────────────
# arms_tfil_turn.txt — j145: the TFIL TURN-COST TIEBREAK, four arms on the
# frozen movement panel (tools/ab/panel_movement.txt), all with TR_MOVEMENT=tfil
# pinned EXPLICITLY.
#
# WHAT THE KNOB IS. Among the tiles that already passed the HARD heat filter
# (pathMaxHeat <= PathDangerThreshold), the draw is weighted by
#
# w = max(1, round(1 + TR_TFIL_TURN_BIAS * (1 - max(0,|turn| - REF) / 180)))
#
# so a straight-ahead safe tile is drawn `1 + bias` times as often as a 180 deg
# one. The heat score is NOT touched: a tile over the threshold still loses, at
# any bias (guard: test_tfil_commit_env.nim, "j145: with an absurd turn bias...").
# The draw stays RANDOM (job j51, 3142b70: a deterministic argmin measured worse).
#
# Pre-registered in docs/movement_campaign.md ("TFIL turn-cost tiebreak") BEFORE
# any of these battles ran. Reference is `tfil_shipped`.
#
# Format: name | ENV=value ENV=value | label
# ─────────────────────────────────────────────────────────────────────────────
# 1. THE ARM TO BEAT — the shipped tfil defaults, explicitly selected.
tfil_shipped | TR_MOVEMENT=tfil | shipped tfil defaults (control / reference)
# 2. the two knobs job j144 recommends, unchanged.
arrive_norev | TR_MOVEMENT=tfil TR_TFIL_COMMIT_ARRIVAL=1 TR_TFIL_NOREV_SPEED=4 | j144's recommended .env
# 3. j144's knobs PLUS the turn tiebreak, at the value the offline ruler picked
# (the knee of the bias curve: bias 9 ref 0 cuts mean |turn| 11% and opposite
# picks 22% with no path-heat cost; bias 39 buys almost nothing more).
arrive_norev_turn | TR_MOVEMENT=tfil TR_TFIL_COMMIT_ARRIVAL=1 TR_TFIL_NOREV_SPEED=4 TR_TFIL_TURN_BIAS=9 TR_TFIL_TURN_REF_DEG=0 | j144 + the turn tiebreak
# 4. THE TURN FIX ALONE — isolates the tiebreak with no j144 knob set, which is
# the only arm that can say whether it is worth anything by itself.
turn_only | TR_MOVEMENT=tfil TR_TFIL_TURN_BIAS=9 TR_TFIL_TURN_REF_DEG=0 | the turn tiebreak alone