diff --git a/PROJECT.md b/PROJECT.md
index 5f86de3..d6b6c28 100644
--- a/PROJECT.md
+++ b/PROJECT.md
@@ -694,6 +694,41 @@ not so close to the color gang"*.
They still converge on you afterwards, which is what they are for; this only decides where they
come in, so they stop screening the bodies you are trying to read.
+**NINTH PASS — THE ROSTER IS THE ALPHABET, and it deletes a whole subsystem.** Oliver: *"we don't
+need colors at all! we already have different zombie types.. so the sequence is the zombies
+themselves"*. He is right, and it is better on every axis the colour version was losing on.
+
+The bib, then the ground disc, were both inventions bolted on to give a body an identity **it
+already had**. A brute does not look like a runner, the game is built on reading those silhouettes
+at speed, and the strip can show the body's own walk frame instead of a swatch — no legend, no
+mapping, no new art ever. It also **deletes the accessibility problem outright** instead of
+deferring it, because a silhouette is not a hue. `DRILL_COLS`, `drawColourRing`, `drawBib`,
+`PIP_FACES`, `blip()`, `drillRingR`, `drillTones` and the seven `drill_*.m4a` call recordings are
+all now gone or unused — the mode is materially smaller than it was three passes ago.
+
+TWO RULES keep a type unambiguous and both are load-bearing:
+1. **the plain shambler is never in the alphabet** — 'a'/'b' is what the EATERS are, so "not part of
+ the puzzle" is legible at a glance and needs no marking on anything;
+2. **one of each type on court at a time**, guaranteed by the batch dealing distinct types and by
+ eaters only ever being shamblers. "The brute" always names exactly one body.
+
+**The new failure mode this created, and it is a good example of the class.** Types move at
+different speeds, and drill bodies hold their lane — so a body in a lane you are not standing in
+walks the full court and off the back untouched. Left as the ordinary despawn that stranded the
+sequence asking for a body which **no longer existed**: precisely the un-winnable state the mode
+exists to prevent, reintroduced by a change that looked purely cosmetic. Two fixes, both needed:
+- **a batch body crossing your baseline counts as CAUGHT** ('GOT PAST YOU'), which is also just
+ better — the drill is "don't let them through" and now the lanes mean something;
+- **the speed spread is narrowed to 1.35..0.70**, not the roster's own 3.2x..0.45x, so a batch stays
+ coherent. The types still read as different because their real difference is **HP, untouched**: a
+ runner is one shot and a roller is seven, so the called order still decides how early you must
+ start on what. Verified: four minutes of simulation, 14400 frames, **zero frames** in which the
+ sequence named a body that was not on court.
+
+Watch: **a roller in the middle of a sequence is seven aimed serves.** Oliver asked for the roster's
+robustness to be kept, so it is — but if a round ever feels like grinding rather than reading, a
+drill-only HP scale is the knob, not a change to the roster.
+
**Open, and every one of them is Oliver's call after he plays it:**
1. ~~**A ball that carries through the lane can complete two steps at once.**~~ Largely CLOSED by
the slice removal (seventh pass) — a cut ball picking its own next victim was the main way this
diff --git a/index.html b/index.html
index 9dd8435..34154a3 100644
--- a/index.html
+++ b/index.html
@@ -399,6 +399,6 @@
-
+