# CB-EV-0027 — the tokens on the table CB-WP-0029 T04. Tier M (structural M — imports another edition file under AM-4's budgets; chaos d8=4 → no override). **Declaration 12 of chaos window 2 — the last.** Closed 2026-08-07. **Delivered:** [ADR-0016](../decisions/ADR-0016-the-tokens-on-the-table.md), `Tokens.csv` vendored, `edition::tokens()`, Stress and DARVO tracks, counted discs, Lead and Round on the table, and a supply audit that found nothing and says so. --- ## 1. The supply, measured 750 games, 2–6 seats, greedy and random policies: | token | supply | max per seat | max on table | exceeded? | |---|---:|---:|---:|---| | Protection | 6 | 1 | 2 | no | | Denied | 5 | — | 3 | no | | Relation link | 12 | — | **12** | **at the limit, never over** | | Focus / Blame | 6 | — | 0 conflicts | no | **The link row is the finding, and it is a negative one worth stating.** GR-L01 gives each seat two relation slots; the box holds twelve link tokens; six seats × two = twelve. **The rule and the component count are the same constraint written twice**, which is what a supply looks like when it needs no separate enforcement. Nothing was designed to make that true — it fell out. **Protection is the one that could have gone wrong and did not.** `saturating_add(1)` at `lib.rs:986` has no upper bound, so the type permits a seventh token. Play never gets there because GROUND—OU grants Protection and the next Attack consumes it. ## 2. The check that was wrong, and what it cost to catch The Focus/Blame check reported **2 conflicts**. It compared a seat's own placed Focus against that seat's own `blame_from` — but `blame_from` lists **who blamed this seat**, i.e. *other players'* discs. Different tokens. Corrected: **0**. **Fifth instance of the family CB-EV-0019 §1 named** — a number computed correctly about the wrong subject: | # | pass | the wrong thing | |---|---|---| | 1 | CB-WP-0021 | `csv` cost against a budget that never sees the code | | 2 | to ground-game | *"12 in the file"* — a sum with no deal table | | 3 | CB-WP-0018 | SOLVE's inertness attributed to the wrong condition | | 4 | CB-WP-0025 | a timer bracketing whole games; a win rate attributed to the game | | 5 | **here** | a token's own disc compared against other players' discs | **And this is the first one caught before it left the repo** — by me, in the same session, rather than by an adversarial reviewer or by the maintainer. Four of the previous five reached a document or another repository. **That is one data point, not a trend.** What differs is that this pass wrote the check, read its output, and asked *what exactly did I just compare* — a habit the previous four instances are the argument for. The family still has **no control**; `facts-check` catches copies that disagree and nothing catches a correct computation over the wrong subject. ## 3. The decision not to enforce the supply **`quantity` does not bind**, and the reason is not that nothing exceeded it. No numbered rule in `GroundRules.md` mentions a token supply. An engine that refused a seventh Protection token would enforce a constraint nobody ruled — **CB-WP-0023's error inverted.** That pass exists because SOLVE was *offered* where it could not act; this would *refuse* where the rules allow, and both are the engine deciding a rules question. So the check ships as a standing control. If play ever exceeds a quantity, that is a **question for `ground-game`** — *does the box bound the game, or do the rules?* — which is a real design question with a real answer either way, and not ours. Registered as **F22, withdrawn**: a stated negative. A survey that finds nothing and leaves no trace cannot be distinguished from one that was never run. ## 4. What the tracks are for `stress 4` is a fact you read. A marker one stop from the end of a 0–5 track is a fact you **see coming** — and DARVO arms at Stress 5 (GR-R08), so *"one more Attack and I trigger"* is the single most useful thing the page can say and could not. Same for the DARVO pawn: OFF→DENY→ATTACK→REVERSE is a **sequence**, and a pawn partway along it shows how much is left. `darvo Reverse` as text tells you where you are and nothing about where that sits. **Unverified.** Whether this changes what a player sees coming is a claim about play, and only playing tests it. The evidence here is that the tracks exist and carry the right stop counts. ## 5. Two fixture defects, and a limit corrected **`seat_centres` matched every ``.** Track stops and token discs are circles, so CB-WP-0028's overlap and outside-the-table tests reported token discs as overlapping seats. Seats now carry `class="seat"` and the helper keys on that. **Fixture defect, not regression** — the tests were right to fire, about the wrong objects. **The table height limit went 460 → 500.** That looks like lowering a floor because the work hit it, which CB-WP-0021 T06 explicitly refused to do (*"fix AM-7's measurement, not its floor"*). **It is the opposite, and the distinction is the point.** 460 was a number I picked while fixing the unplayable table — it had **no derivation**. 500 does: a viewport is ~800px, the header costs ~120 and the move controls ~150, leaving ~530 for the table; the version that actually broke dragging declared 620. **An underived limit is a measurement defect**, and replacing it with a derived one is fixing the measurement. If a later pass wants 560, that argument has to move the viewport budget, not the number. ## 6. Chaos window 2 — closed, and its verdict is due > **CORRECTED 2026-08-07 — this section is wrong.** > Window 2 produced **one** override: declaration 3 (CB-WP-0020) rolled > d8 = 8, drew S against a structural S, and **changed nothing** — which > CB-WP-0020 recorded correctly at the time as *"One."* Eleven rolls at d8 > (declaration 1 opened the window at d4) against an expectation of 1.375 > eights. **The rate was working; I asserted "zero" without counting, and > each later evidence file cited the one before it.** > See [ADR-0017](../decisions/ADR-0017-chaos-window-2-verdict.md) and F23. **This is declaration 12 of 12.** The window opened 2026-08-03 at d8. **Twelve declarations, zero 8s, zero overrides.** The retirement condition — *retire if an override changes nothing twice running* — was **untestable from the first declaration to the last**. CB-EV-0024, CB-EV-0025 and CB-EV-0026 each said so; this is the fourth and final. | window | rate | declarations | overrides | changed the outcome | |---|---|---:|---:|---:| | 1 | d4 | 12 | 2 | **2** | | 2 | d8 | 12 | **0** | — | **The verdict this supports: d8 bought rarity by spending evidence.** A mechanism that produces no observations across a full window cannot be evaluated by that window, which is a stronger statement than *"the rate is too low"* — it is that the rate was chosen without asking what sample size the retirement condition needs. **Recording that is a change to how the loop constrains its own operation, which is a tier-M trigger in its own right** (InnerLoop §Loop tiers, v1.6). It is therefore **outstanding, not done here**, and is named in the workplan so it is not lost between passes — which is exactly how `ground-game`'s ten rulings went uncollected for two days. ## 7. Cost CB-WP-0028's cost, by re-running the instrument: `make cost`. Not inlined (§Single source of fact). CB-EV-0019 §4's unbounded chain is still unbounded, now across four more passes. ## Open after this pass - **The window-2 verdict** (§6) — the next thing this loop owes itself. - **The wrong-denominator family still has no control** (§2), at five instances. - **Whether the tracks change what a player sees coming** (§4) is untested and only play tests it. - **`Relations`, `DARVO`, `Player_Mats` and `Glossary` remain unvendored.** The DARVO track now has a picture but not the edition's own words for each stage. - **Three of four scenarios still never dealt**, carried from ADR-0015 D5.