Commit 89dd9af
fix(tracking): ADR-028 RC2 + RC3 + RC5 -- three orientation corrections -- silly-kicks 4.71.0 (PR-S139, ADR-051) (#188)
PR 3 of 5. Re-materialize trigger, no forced VAEP retrain, C4 count unchanged (32).
No new ADR: RC2/RC3/RC5 are all recorded in ADR-051.
*** DO NOT TAG v4.71.0. *** This version is committed and traceable but never
published. It corrects the serving geometry that GkCompletionModel's bundled
weights were fitted against; releasing it alone introduces a train/serve skew
that does not exist today. PR 4 retrains those weights and bumps to 4.72.0,
which is the version that ships.
RC2 -- _gk_geometry wrote frame coordinates into action-LTR quantities
_tracking_gk_xy and _tracking_ball_xy sampled positions from the linked frame and
returned them unreprojected, while their own sibling _tracking_gk_xy_detected had
always applied the ADR-028 point reflection.
The two halves failed differently, and the distinction is operational. In
_tracking_gk_xy the goal-area clamp (x <= 16.5) is an own-half predicate in
ACTION-LTR coords, so against a raw away-team frame x it rejects a correctly
placed keeper (action-LTR x=5 IS frame x=100) and the goal kick fell through to
the rule-point prior -- a systematic loss of the tracking tier, not a visibly bad
coordinate. The clamp now runs strictly AFTER the reflection. _tracking_ball_xy
has NO clamp, so nothing caught a mis-projected ball: restart coordinates moved
by up to a full pitch length (spec 2.2 measured 101.24 m GS / 99.58 m IDSSE).
The flip is computed ONCE per call and threaded into all five helper call sites,
so a call emits at most one OrientationUnresolvedWarning instead of five and the
redundant per-helper groupby+merge is gone.
RC3 -- the space-creation OBSO multiplier was applied unrotated
compute_space_created builds its multiplier from the attack-LTR transition/EPV
grids and applies it to a frame-LTR pitch-control surface, which EXCHANGED the
two emitted columns for away actions:
max |base.created - mirrored.denied | = 4.44e-16 (swapped pair agreed)
max |base.created - mirrored.created| = 1.20688 (like-for-like did not)
DEVIATION FROM THE PLAN, deliberate: the plan said to reflect the finished
obso_multiplier. That product also contains a ball-anchored distance_weight
computed in FRAME coords which must never be mirrored -- the rule the opponent
branch already documented. Reflecting the two GRIDS instead is correct, and
additionally fixes the opponent multiplier for free because it is constructed as
a flip of the same artifacts. Reflecting the product would have been 98.7% wrong
(the ball Gaussian relocates 19.29,10.97 -> 85.71,57.03) AND would have left the
opponent multiplier uncorrected.
compute_space_created and _compute_space_creation_for_action gain a keyword-only
attacks_rtl (default False = byte-identical for existing callers). The flag comes
from the FRAMES via acting_team_attacks_rtl; home_team_id stays in both
signatures and stays UNREAD (D3 retires it by disuse, not removal).
space_creation_xfns delegates to add_space_creation and inherits the fix.
RC5 -- the next-event destination proxy ignored team_id
_next_event_start borrows the next action's start_x/start_y, guarded only on
game_id/period_id. SPADL is per-ACTING-team LTR, so a cross-team next event
describes the same physical point in the opposite convention. Measured: a shared
point the opponent records as (45.0, 20.0) is (60.0, 48.0) in the anchor's frame
-- 15 m x, 28 m y. An UNATTESTED team id never decides: ids_differ is
NA-safe-both-present, so an NA on either side leaves the coordinate untouched
(ADR-027: 'cannot tell' must not become 'reflect').
This is action-vs-action, not frame-vs-action, so the mirror registry is
structurally blind to it; dedicated tests are the only guard. Fixed here rather
than in PR 4 on ordering grounds -- PR 4 retrains, and a retrain must run against
final geometry.
Also fixed (carried, unrelated to any RC)
- SECURITY.md advertised the long-dead 3.x support line.
- TODO.md's TF-19 row carried a 424-char verbatim duplication that added an extra
table cell via one unescaped pipe; it now matches its 16 peers at 6 unescaped
pipes, both legitimate escapes preserved.
From the pre-commit review
- resolve_restart_geometry's docstring promised it was warning-free so the
resolve_gk_geometry shim 'can never leak a warning onto the frozen
compute_xt_gk path'. RC2 makes that false; the docstring now says so. The
warning is intended -- unoriented frames mean the reprojection could not
happen, which is the condition RC2 exists to make audible.
- CLAUDE.md and ADR-051 claimed CI escalates OrientationUnresolvedWarning 'with
an opt-out list of ZERO'. Verified FALSE (pyproject escalates SyntheticEPV /
IgnoredSurfaceInputs / MissingFeatureContract only). That was intent stated as
fact; both corrected.
- transition_grid is read as orientation-neutral by add_obso and as attack-LTR
by compute_space_created. The divergence pre-dates RC3 (the opponent branch
always flipped it); now documented at both ends instead of silent.
- ADR-051's absolute '14 strict xfails' became a running count (14 at PR 1, 10
after PR 3).
Every new test was proven by planting a regression, not by passing: 2/3 ball
tests and 1/6 cross-team tests fail when the reflection is neutered, with the
same-team and home-row controls correctly still passing.
Verified: 6317 passed / 0 failed / 10 xfailed; ruff check + format clean; pyright
0 errors, run BARE over the whole repo including tests/.
Claude-Session: https://claude.ai/code/session_01GHLeED1UusyqEw5LMpfxHS
Co-authored-by: Claude <noreply@anthropic.com>1 parent 641dadf commit 89dd9af
15 files changed
Lines changed: 693 additions & 58 deletions
File tree
- docs/superpowers
- adrs
- plans
- silly_kicks
- tracking
- tests/tracking
- _mirror_entries
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
8 | 113 | | |
9 | 114 | | |
10 | 115 | | |
| |||
0 commit comments