diff --git a/PROJECT.md b/PROJECT.md
index 0bbab80..eeaaeb9 100644
--- a/PROJECT.md
+++ b/PROJECT.md
@@ -5420,6 +5420,31 @@ Oliver: *"bitte bau nochmal die Funktion ein die protokolliert warum ich einen B
- Note: contact still fires on the first frame the ball is in reach, which right after a bounce is
often 15-25 cm off the grass. A visual half-volley, the old contact model; untouched.
+### Oliver's first swing log (v365, cup vs THE BRUTE) and what it changed (2026-10-14, v366)
+**His question: "am I just bad or is something off".** Read off the log:
+- 22 hits: 13 at q = 1, 9 under 0.5. Six of the nine bad ones were "deep right" (the forward-right
+ flick), which failed 6 of its 9 tries; the left flick failed 3 of 10. The bad hits split between
+ EARLY (the ball met at the edge of reach, d 1.55-1.73) and LATE (the ball already on top of him,
+ d 0.55-0.73). It is timing, with no single offset.
+- Weak balls are what the Brute (power, league-5 quality) punishes. Seven LOST "passed you", and
+ several of them follow a weak hit of his within a second.
+- Every hit said `tap 0ms`: he flicks everything. Hypothesis to check in the next log: the gore
+ slingshot habit. A pull-back before the forward flick crosses `flickMin` DOWNWARD, which fires the
+ swing early, and the live aim turns to "deep right" by contact.
+
+**Changes:**
+- **Flicks are timed from touch-down too** (`keyPressed(code, lead, flick)`; input.js passes the
+ crossing's age, capped at `flickLead` 0.1 s so a slow drag keeps a window). The timed ring means
+ "touch now" for both gestures. The log says `flick 46ms` / `tap 120ms`. Verified with real touch
+ events.
+- **The log's missing half:** a THEM line per opponent shot (kind, spin, q, pace, where it lands
+ relative to the player, OUT, "coming in"), and `whiffed it` for a CPU flub. "Never swung" is now judged
+ per incoming ball: `G.swung` and `G.rallyNear` reset at the opponent's strike. It used to be judged
+ once a point, so none of his "passed you" lines could say whether he swung or how close the ball came.
+- **An early swing on a low skidding ball no longer whiffs.** The let-it-bounce gate waits only while
+ the bounce will land inside the swing window. Otherwise it digs the ball out as a half-volley, capped
+ below the tape. His 48.14 s MISS was exactly this.
+
# 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 0b8a461..89e89ea 100644
--- a/index.html
+++ b/index.html
@@ -1140,6 +1140,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat
REC
-
+