diff --git a/PROJECT.md b/PROJECT.md
index 6a9c01e..91936eb 100644
--- a/PROJECT.md
+++ b/PROJECT.md
@@ -4865,6 +4865,29 @@ MATCHED` / `YOU HAVE THE EDGE`) beneath the equal-size level pair. Three dials l
match tuning (`peerGap`, `peerRun`, `peerWindow`); no profile state was added. Suite 129 pins the
zero/parity bounds, material level-25-to-parity gain, cup/training scope, and arcade/netplay exits.
+## Session log: THE FINAL LEAGUE FIGHTS BACK (2026-09-04)
+
+After the peer-gift retest Oliver cleared the remaining cup with only medium struggle. Approved:
+keep all player-level/peer bonuses, strengthen league 5's placement AND return quality now, and
+allow no final-league opponent to run slower than anyone in league 4. Do not lengthen the cup.
+
+The three final opponents reuse classic tennis's existing open-court aim: Brute 20%, Director 40%,
+Champion 60% deliberately target the corner opposite the player; the remaining returns still roll
+a random lane. Their return quality ceilings rise from the shared .55 to .60 / .65 / .70, retaining
+the .45 floor. These are opponent traits, so the same bodies behave consistently in cup, training,
+and arcade. League 1–4, classic, netplay, gore, and every player/peer bonus are untouched.
+
+Brute's speed trait rises from 1.02 to 1.12; Director and Champion already clear the league-4 peak.
+The first candidate, 1.10, cleared the neutral chase but narrowly failed the equally wrong-footed
+comparison in the live movement test. 1.12 clears both. The speed invariant compares like-for-like
+conditions (normal/serve, neutral/surprised); wrong-footing itself remains a deliberate opening.
+
+Two regression tests exercise actual update()/racketAI returns and movement, not just table values:
+all league-5 bodies clear the fastest league-4 chase in all four conditions; 1,200 return attempts
+per late opponent check quality ceilings and open-court frequency, with Club Pro as the unchanged
+control. All 131 tests pass with the default seed and eight additional seeds. Build v349 targets
+staging only. Combined difficulty still needs Oliver's playtest; shot statistics are not win rates.
+
# OPEN — leftovers, in rough priority order
Nothing here is broken; these are known gaps and unverified risks.
diff --git a/index.html b/index.html
index 3c07486..444f392 100644
--- a/index.html
+++ b/index.html
@@ -1082,6 +1082,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat
-
+