diff --git a/HANDOFF-MATCH.md b/HANDOFF-MATCH.md
index 8f95619..b9b4c01 100644
--- a/HANDOFF-MATCH.md
+++ b/HANDOFF-MATCH.md
@@ -61,14 +61,19 @@ communicating its own rules. Model A only works if the player can see they are b
board names it (`short`), and the kill files under it so the OPPONENTS FELLED screen can list it.
*(The word "ladder" was retired — it had come to mean the opponent list, the wound stages AND a
stats screen. One word per thing now: OPPONENTS, WOUND STAGES, and a sprite FAMILY.)*
- **Still open, and still the cheapest depth in the mode:** `shots[]` and the PARRY are fully built
- and completely unused here. A body-shot thrower is a personality no dial can express.
+ ~~**Still open:** `shots[]` and the PARRY are fully built and completely unused here.~~
+ **SCRATCHED** (2026-08-17, Oliver): a body-shot thrower in the match is not wanted. Both
+ mechanics stay where they are; do not revive this without him asking.
-3. **Wound-driven play** *(small, big payoff)* — the injuries should MEAN something: a one-armed
- opponent loses reach, a headless one flubs more. Score-is-the-body becomes score-changes-the-game.
- Read the fraction the way `drawZombie` and `bleed()` do (never literal hp).
- *The art is now there for it:* every wound stage has its own ready stance, shuffle pair and
- forehand (`z_rw1*`, `z_rw2*`), so a wounded opponent still plays rather than reverting to a walk.
+3. ~~**Wound-driven play**~~ **DONE** (2026-08-17). Two dials, both read through `racketStage` —
+ the very call the SKINS are picked with, so what you watch it lose is what it loses:
+ `config.matchWound` returns `{reach, flub}` and `racketAI` spends it on its contact radius and
+ its whiff rate. **Deliberately small** ("not too pronounced"): ~6% reach and ~17.5% more whiff
+ PER STAGE, so at headless it is 12% and 35% — texture under the ladder, never a second
+ difficulty curve, and a test pins that ceiling so a later tuner cannot quietly cross it.
+ Unhurt returns exactly `{1, 1}` and the whole thing is gated on `G.match`, which is what keeps
+ the gore duel's racket zombie untouched. Note the arithmetic: a quarter off a full pool is 0.75,
+ so **point one changes nothing** — the dials move on points two and three, with the art.
4. ~~**The fall animation**~~ **DONE** (2026-08-12). Point won → the body COLLAPSES → drags itself up
minus the limb. `beats.tickMatchFall`, on its OWN clock beside the horde's warning (a beat that
@@ -85,10 +90,18 @@ communicating its own rules. Model A only works if the player can see they are b
keeps its door (MATCH TEST still works) — the menu did not replace it, it just stopped being the
only way in.
-6. **Teaching** *(small)* — a ghost-hand lesson for the PLACEMENT FLICK. It is the counter-attack
- (flick during the swing aims the return; wrong-footing is how points are won) and it is taught
- nowhere on touch. The placement ring (`G.placeMark`) already shows the result; nothing teaches
- the cause.
+6. ~~**Teaching**~~ **DONE** (2026-08-17). The ghost-hand lesson for the PLACEMENT FLICK, in the
+ same register as PULL DOWN and TAP AS IT ARRIVES: a dotted track out of the player, the hand
+ riding it, SWIPE AS YOU HIT, mimed both ways in turn so it never teaches one corner.
+ It rides the failure it answers — `G.flatStreak`, returns that left with no aim on them
+ (`flatCount`, reset by the first aimed one) — and only after `TUNE.flickHintAfter` of them,
+ because hitting flat is a legal shot and not a mistake. **One lesson at a time:** the tap hint
+ wins if both qualify, since teaching placement to someone who cannot reach the ball is the wrong
+ lesson. Touch only (on a keyboard the aim is held keys, and SWIPE would name a gesture that does
+ not exist there), and it runs in the MATCH as well as classic — the match is `splatter` under a
+ permanent interlude, so a `G.mode === 'tennis'` gate would have missed the mode it was built for.
+ The words sit ABOVE the stroke: below them is the baseline, and 10px type over that white line
+ is unreadable.
7. ~~**Opponent serve games**~~ **DONE** (2026-08-12), and it was almost entirely switched off rather
than missing. `setupPoint`'s tennis branch already placed a non-player server behind its own
diff --git a/index.html b/index.html
index 440bd8a..f59df57 100644
--- a/index.html
+++ b/index.html
@@ -659,6 +659,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one') {
-
+