clay-borg/evidence/CB-EV-0027-the-tokens-on-the-table.md
tegwick a9978c7a91
Some checks failed
ci / check (push) Failing after 4s
ADR-0017: window 2's verdict — the mechanism worked, my account of it did
not

Tier M (changes how the loop constrains its own operation), declared at
d8 because the rate for window 3 is what this document decides and
declaring at a rate it invents would be circular. chaos d8 = 7, no
override.

I CLAIMED WINDOW 2 PRODUCED ZERO OVERRIDES, FIVE TIMES, AND IT IS FALSE.
Declaration 3 (CB-WP-0020) rolled d8 = 8, overrode, drew S against a
structural S, and changed nothing -- and CB-WP-0020 recorded it correctly
at the time, in those words: "the first override at d8... It changed
nothing... One."

Counting the workplans takes one command and I never ran it. CB-EV-0024
asserted "zero" without checking; CB-EV-0025, 0026, 0027 and CB-WP-0029
each cited the one before. A claim propagated five times by citation
rather than by measurement, in files whose subject was that exact failure.
facts-check catches a copied number that disagrees with its source;
nothing catches a number with NO source, asserted once and repeated.
Registered F23, and all four evidence files carry an in-place correction
rather than a silent edit (ADR-0012 D5).

THE ACTUAL VERDICT: THE RATE IS WORKING. Eleven rolls at d8 -- declaration
1 opened the window at the old d4 -- against 1.375 eights expected, 1
observed. Not a shortage of evidence; the design.

BUT THE RETIREMENT CONDITION GENUINELY CANNOT FIRE, and that took
computing to see. "An override changes nothing twice running" needs a
consecutive pair at P=1/3 each, so ~12 overrides expected, at ~1.4 per
window: ~9 windows, roughly 100 declarations. A gate that cannot cash out
on any realistic horizon is decoration, which ADR-0006 D3 forbids.

Restated to be evaluated PER WINDOW: retire if a full window's overrides
all change nothing, met in two consecutive windows. A window with no
overrides is inconclusive and advances nothing. ~24 declarations rather
than ~100. Window 2 counts as the first; window 3 opens at d8 and decides.

Recorded and deliberately not acted on: declarations 5-9 rolled six five
times running, ~1 in 370 for some run of five in eleven rolls. shuf tested
over 200 rapid successive calls looks uniform, longest run three. Found
post hoc, which is how coincidences become findings, so it is logged for a
future window to check rather than treated as evidence.

InnerLoop.md then crossed the loadability limit, and so did
InnerLoopReference.md. The window log moved to specs/ChaosRollHistory.md:
it grows by one entry per window, and a log inside a reference eventually
crowds out the reference.

make all: exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 10:55:54 +02:00

174 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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, 26 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 05
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 `<circle>`.** 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.