diff --git a/PROJECT.md b/PROJECT.md
index 872c290..6b2c281 100644
--- a/PROJECT.md
+++ b/PROJECT.md
@@ -579,6 +579,24 @@ serve gesture, the duel and gore are untouched; keys unchanged. Verified with re
held-swipe contact aims exactly `swayOf`, a 360 ms swipe (previously dead) swings and aims, and a
release-before-arrival still aims through `takeFlickAim`.
+**...and an aimed shot keeps its DIRECTION** (2026-08-20, same report, second round — the crossing
+fire alone "did not feel much different", and his sharpened observation was that the flick only
+seemed to work when the opponent already stood where he aimed). Measured with the opponent
+teleported at contact: the aim never tracked the body — no magnet exists — but at rushed quality
+the SYMMETRIC scatter (±aimError·(1-q)) outweighed the quality-shrunk aim, so a mistimed left flick
+landed anywhere in a ~4 m blob around "slightly left": usually centre, sometimes right, and the eye
+anchors that on wherever the opponent stands. The opponent's position was a proxy for preparation
+time (a body parked wide = its return flew a long slow diagonal = time = quality). The dial:
+**`TUNE.aimTrust` — an OUTWARD scatter roll is untouched** (a committed mistimed swipe still sails
+at the exact tuned rate; `flickReach` stays the only out dial) **but an inward roll keeps only
+`aimTrust` (0.3) of itself**, so bad timing costs width, never the direction that was asked for.
+Player lane shots only: the opponent's symmetric scatter is its width mechanic, and gore's
+free-aim never used lanes. Verified in real rallies at worst-case q≈0.08: 14/14 rushed left flicks
+landed left (−0.8..−3.5), 9/9 right flicks right — previously the same condition was a coin toss.
+The suite pins the direction guarantee and the knob relationship (`aimTrust·aimError` must stay
+under a committed swipe's worst-case aim). Whether placement should also BEAT an unwounded body
+more often (`aiRead` on wide balls — "dial 2") is open, awaiting the phone verdict on this one.
+
**The umpire and the boy.** `aside()` refused during any interlude and the match runs on a permanent
one, so he was silently muted for the entire mode — the one mode that is literally a tennis match he
is sitting over (`G.interlude && !G.match` now, the same shape as `sendBoy`). Six dry lines: two on
diff --git a/index.html b/index.html
index 06d6b67..738a0e0 100644
--- a/index.html
+++ b/index.html
@@ -659,6 +659,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one') {
-
+