First recorded game win, and the rungs flatten

Fourth recorded session, verdict "better": he beat opponent one — the first
game won in any recorded session — and reached opponent two, which took him
apart with gaps of 1.66-2.13m (60Hz, accurate) while he swung at closest
approach every time. The gradient is real; the step was a wall, because a
rung moves three dials at once. Per-rung increments softened: matchSpeedPer
.12->.08, matchWidePer .4->.25, matchOppPacePer .05->.035. Opponent one
untouched — the bases stay, only the slope flattens.

The contact chain is now verified end to end by recorded play: legs
(matchAssist) -> destination (assistK in intercept + the anyHit short-ball
chase) -> reach (matchReach). Each link was a separate defect found by a
separate recorded session.

49 tests, seeds clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-11 23:43:57 +02:00
1 parent ac588ec6a7
commit 78292a2d53
3 files changed
+20 -4

No files matched your search

+14
View File
@@ -1020,6 +1020,20 @@ contact radius: the tap must be honest" rule stands). A rally mode lives on cont
Note for future recorder sessions: **a 20 Hz sampler overstates closest approach by up to ~0.5 m** Note for future recorder sessions: **a 20 Hz sampler overstates closest approach by up to ~0.5 m**
on a 20 m/s ball — the recorder now samples at 60 Hz. on a 20 m/s ball — the recorder now samples at 60 Hz.
**TWENTY-THIRD PASS — first game won, and the rungs flatten.** Fourth recorded session, his
verdict "better": **he beat opponent one — the first game won in any recorded session — and reached
opponent two,** which then took him apart with gaps of 1.66-2.13 m (60 Hz, accurate) while he swung
at closest approach every time. The ladder gradient is real; the STEP was a wall, because every
rung moves three dials at once (speed, width, pace, plus flub). Per-rung increments softened:
`matchSpeedPer` .12->.08, `matchWidePer` .4->.25, `matchOppPacePer` .05->.035. Opponent one is
untouched — the bases stay; only the slope flattens.
The contact chain is now verified end to end by recorded play: LEGS (matchAssist) -> DESTINATION
(assistK in intercept + the anyHit short-ball chase) -> REACH (matchReach). Each link was a separate
defect found by a separate recorded session. The flight recorder earned a permanent place in the
toolbox: passive 20-60 Hz sampling with pre-loss trails ended four rounds of "still the same" in
four sessions, where autopilot measurement had failed for three passes straight.
**Open, and every one of them is Oliver's call after he plays it:** **Open, and every one of them is Oliver's call after he plays it:**
1. ~~**A ball that carries through the lane can complete two steps at once.**~~ Largely CLOSED by 1. ~~**A ball that carries through the lane can complete two steps at once.**~~ Largely CLOSED by
the slice removal (seventh pass) — a cut ball picking its own next victim was the main way this the slice removal (seventh pass) — a cut ball picking its own next victim was the main way this
+1 -1
View File
@@ -400,6 +400,6 @@
</div> </div>
</div> </div>
</div> </div>
<script type="module" src="src/main.js?v=175"></script> <script type="module" src="src/main.js?v=176"></script>
</body> </body>
</html> </html>
+5 -3
View File
@@ -390,7 +390,9 @@ export const TUNE = {
// the broken recovery (the player never walked back to centre, so every // the broken recovery (the player never walked back to centre, so every
// wide return looked like opponent strength) — with real footwork restored // wide return looked like opponent strength) — with real footwork restored
// it starts gentler and the ladder still climbs // it starts gentler and the ladder still climbs
matchSpeedPer: 0.12, // ...growing this much per opponent felled matchSpeedPer: 0.08, // ...growing this much per opponent felled. Softened once: each rung moves
// THREE dials at once (speed, flub, width, pace), and the recorder showed
// opponent two as a wall — he beat one and lost every gap to two by ~0.3 m
matchFlub: 0.08, // the match's own whiff base — the duel's 0.2 gives away a fifth of all matchFlub: 0.08, // the match's own whiff base — the duel's 0.2 gives away a fifth of all
// returns, which across a game is an opponent that beats itself // returns, which across a game is an opponent that beats itself
matchFlubKeep: 0.82, // ...and it keeps only this much per rung — the ladder now that hp is flat matchFlubKeep: 0.82, // ...and it keeps only this much per rung — the ladder now that hp is flat
@@ -402,11 +404,11 @@ export const TUNE = {
// is the game's job. Held keys still override // is the game's job. Held keys still override
matchOppPace: 0.78, // scale on the opponent's return SPEED for opponent one (~21 m/s instead matchOppPace: 0.78, // scale on the opponent's return SPEED for opponent one (~21 m/s instead
// of ~27) — the flight time auto-run needs. THE reachability dial // of ~27) — the flight time auto-run needs. THE reachability dial
matchOppPacePer: 0.05,// ...climbing back per rung, capped at full pace matchOppPacePer: 0.035,// ...climbing back per rung, capped at full pace (softened with speedPer)
matchWideBase: 2.1, // m either side of centre the FIRST opponent's returns may land — the width an matchWideBase: 2.1, // m either side of centre the FIRST opponent's returns may land — the width an
// auto-run player can actually cover. Its scatter painted lines from game one // auto-run player can actually cover. Its scatter painted lines from game one
// ("still a LOT of unreachable balls"); now line-painting is the late ladder // ("still a LOT of unreachable balls"); now line-painting is the late ladder
matchWidePer: 0.4, // ...earning this much more width per opponent felled matchWidePer: 0.25, // ...earning this much more width per opponent felled (softened with speedPer)
matchHeal: 2, // hp back for a game won (the duel's healPerDuel rate) matchHeal: 2, // hp back for a game won (the duel's healPerDuel rate)
// The timing windows, DRAWN (the match's whole ask: "what is the possible tap window, what is the // The timing windows, DRAWN (the match's whole ask: "what is the possible tap window, what is the
// sweet spot"). Numbers shared with the mechanics they visualise, so the picture cannot lie: // sweet spot"). Numbers shared with the mechanics they visualise, so the picture cannot lie: