The surprise is an opening, not a free point: THE READ turned down a notch

Oliver, same day: 'die Gegner sind jetzt etwas zuu einfach.' The habit takes
four same-lane shots to learn (was three) and the wrong-foot costs about a
third less on every dial: surpRead 0.85->0.6, surpSlow 0.45->0.3, surpFlub
0.35->0.22. The whiff-window test pin rides down with it (0.25->0.15); the
slower-than-the-coach pin still holds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-28 16:34:38 +02:00
1 parent 43784c5b33
commit 4ea9af5442
4 files changed
+16 -7

No files matched your search

+5 -1
View File
@@ -493,7 +493,11 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu
## Session log: THE READ, the walk-on modal, the training court, movement reads (2026-08-28)
Four items from one phone report. PHONE VERDICT PENDING on all of them.
Four items from one phone report. PHONE VERDICT PENDING on 2-4; item 1 got its first verdict the
same day — *"die Gegner sind jetzt etwas zuu einfach"* — and was turned down a notch: `readHabit`
3 -> 4, `surpRead` 0.85 -> 0.6, `surpSlow` 0.45 -> 0.3, `surpFlub` 0.35 -> 0.22. A surprise is an
opening the player still has to play, not a point handed over. The whiff-window test pin moved
0.25 -> 0.15 with it.
### 1. THE READ — the twist for the post-COACH wall
Oliver: past the HEAD COACH *"the opponents are very fast and barely make mistakes any more — we
+1 -1
View File
@@ -675,6 +675,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat
</div>
</div>
</div>
<script type="module" src="src/main.js?v=309"></script>
<script type="module" src="src/main.js?v=310"></script>
</body>
</html>
+7 -4
View File
@@ -608,11 +608,14 @@ export const TUNE = {
// the champion — "HE RETURNS EVERYTHING" — is exactly the one you beat by setting a habit and
// breaking it on the big point. Skill, not grind, is what opens the ladder past the coach.
// Rally lanes only (doHit's aimed player shots); serves keep their own game. Solo match only.
readHabit: 3, // same-lane returns in a row before the opponent has learned the pattern
// RETUNED DOWN 2026-08-28 same day (Oliver: "die Gegner sind jetzt etwas zuu einfach"): the
// habit takes one more shot to learn and the wrong-foot costs about a third less on every dial,
// so a surprise is an opening you still have to play, not a point handed over.
readHabit: 4, // same-lane returns in a row before the opponent has learned the pattern
readAnticipate: 0.97,// what aiRead climbs toward on an EXPECTED ball at the top rung
surpRead: 0.85, // fraction of aiRead a wrong-footed opponent loses (x rung scale)
surpSlow: 0.45, // fraction of chase speed it loses on the surprise ball (x rung scale)
surpFlub: 0.35, // whiff ADDED at contact on the surprise ball at the top rung
surpRead: 0.6, // fraction of aiRead a wrong-footed opponent loses (x rung scale)
surpSlow: 0.3, // fraction of chase speed it loses on the surprise ball (x rung scale)
surpFlub: 0.22, // whiff ADDED at contact on the surprise ball at the top rung
// ---- MOVEMENT READS (2026-08-28): the sprites run, the court answers. Two cheap effects, both
// live-tunable: feet kick the surface's own dust once a body crosses trailMin, and a body moving
// that fast leaves a two-ghost speed streak behind it (the modal masthead's own trick, sampled
+3 -1
View File
@@ -2110,7 +2110,9 @@ test('THE READ: a habit is learned by repetition and a break wrong-foots the rac
'a wrong-footed champion runs slower than the head coach at full stride');
const champFlub = TUNE.matchFlub * Math.pow(TUNE.matchFlubKeep, cfg.LADDER - 1) * cfg.matchFoe(cfg.LADDER).flub;
assert.ok(champFlub < 0.02, '(the champion barely misses on his own — the wall being answered)');
assert.ok(champFlub + TUNE.surpFlub > 0.25, 'the surprise opens a real whiff window in that racket');
// 0.15, not 0.25: the same-day retune ("die Gegner sind jetzt etwas zuu einfach") took a third
// off every surprise dial — the window must stay REAL, but it is an opening, not a free point
assert.ok(champFlub + TUNE.surpFlub > 0.15, 'the surprise opens a real whiff window in that racket');
assert.ok(TUNE.readAnticipate <= 1, 'anticipation never reads better than perfect');
assert.ok(TUNE.readHabit >= 2 && TUNE.readHabit <= 6, 'a habit is learnable inside one game');
});