CB-WP-0028 T03/T08: one overhead table, and what the nine observations
Some checks failed
ci / check (push) Has been cancelled

turned out to be

T03. One table_svg: seats around an elliptical table starting at the
BOTTOM -- the viewer sits nearest the reader, as at a real table --
Problems and both stacks in the middle, each seat's played card between it
and the centre, relations drawn between seats.

Two renderers were DELETED: relations_svg and piles_svg. The task said one
table not two diagrams, and leaving the old ones would have meant drawing
the same thing twice and letting them drift.

No coverage probe cost, through a restructure that merged three diagrams
and removed two functions. Second confirmation of CB-WP-0027's finding: a
probe naming a FACT survives a reflow, one naming a PRESENTATION does not.
CB-WP-0024's "17 remaining" broke on a rendering change; this far larger
reflow broke nothing.

The new control is per seat count -- no two seat circles closer than 70px
at 2 through 6 -- asserted rather than eyeballed at three, which is the
only count anyone ever looks at.

T08 (CB-EV-0026). Seven of nine observations were engine defects, one was
a design finding, one was already true and nobody could tell.

Observations 4 and 5 both dissolved and had ONE cause: nothing on the page
said how drawing works, so a player built a mental model to fill the gap
and reported the gap as two feature requests.

The import gap was worse than "one of nineteen" -- 5 of 13 columns read
from the file we DID vendor, discarded at parse time for eight days. Rule
coverage was 59/59 throughout. The gate measures whether rules are
EXERCISED; nothing measures whether a player can READ the game, and
nothing cheaply could, which is why the person playing it is the
instrument.

TWO GATES WERE WRITTEN FOR A SMALLER WORLD, and neither was wrong when
written. edition-check compared one recorded digest against Problems.csv
regardless of which file it described -- correct with one vendored file,
comparing across files with four. And a cb-play test asserted the literal
"game over" and went red when a won game said "solved", which was T06
working; it now asserts the heading against the OUTCOME and covers the
no-outcome case the original never touched.

Chaos window 2 closes with zero overrides in eleven declarations at d8.
Third and final statement of it: d8 bought rarity by spending evidence,
and a mechanism producing no data across a full window cannot be evaluated
by that window.

make all: exit 0. 57 render tests, 26 cb-play, loop-lint clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-06 17:33:57 +02:00
parent 4d3e30eda4
commit eb8aa64c56
5 changed files with 459 additions and 122 deletions

View file

@ -0,0 +1,163 @@
# CB-EV-0026 — the table you sit at
CB-WP-0028 T08. Tier M (structural M — imports more of an external
dataset under AM-4's budgets; chaos d8=1 → no override). Declaration 11 of
chaos window 2. Closed 2026-08-06.
**Delivered:** [ADR-0015](../decisions/ADR-0015-the-cards-own-words.md),
three vendored edition files, a generic reader, the cards' own words on
the page, one overhead table replacing three diagrams, controls and log in
the meta column, *"game solved"*, and rankings that cite their source.
---
## 1. Nine observations, and where they actually came from
**Seven of nine were engine defects. One was a design finding. One was
already true and nobody could tell.**
| # | observation | what it turned out to be |
|---|---|---|
| 1 | no incentive to attack | a **design finding** (F17), and still a note |
| 2 | *"I don't understand the GROUND card"* | **a data-import gap** — the card explains itself and we never read it |
| 3 | overhead view | three diagrams the player had to assemble |
| 4 | click the deck to draw | **not a legal move**; built nothing |
| 5 | auto-draw option | **already automatic**, and always was |
| 67 | controls and log on the right | layout |
| 8 | *"Game Over"* on a win | wrong vocabulary for a co-operative game |
| 9 | rankings | a place where the game defines *not to rank* |
**Observations 4 and 5 are the most useful pair in the set**, because both
dissolved. Clicking the deck is not a move — `GroundCommand` has no
standalone draw, and the edition's INVESTIGATE text says *"…reveal it.
**Then draw one Solution.**"* Drawing is a consequence. And auto-draw was
asked for a thing that has **never been manual**.
**Both had one cause: nothing on the page said how drawing works.** The
INVESTIGATE card's own words were in a file we had not imported. So a
player invented a mental model to fill the gap, and reported the gap as
two feature requests.
**No finding was raised.** An instinct differing from a *legible* rule is
a comprehension gap; an instinct differing from an *invisible* one is our
defect. Whether it recurs now that the card says it is a testable question
and was not before.
## 2. The import gap was worse than "one file of nineteen"
Measured before deciding:
| | |
|---|---|
| edition files upstream | 19 |
| vendored | **1** |
| columns in that one file | 13 |
| columns the engine read | **5** |
| scenarios in the file | 4 |
| scenarios the engine deals | **1**, hardcoded |
`title`, `problem_text`, `front_rules`, `reveal_effect` and
`unresolved_effect` were vendored on 2026-08-04 and **discarded at parse
time for eight days**. The page showed `Repair 2` for a card that reads
*"Missed Deadline"*. Fixing that cost no new bytes, no dependency and no
budget — it was the cheapest thing in the pass and the one nothing had
found.
**Rule coverage was 59/59 throughout.** The gate measures whether rules
are exercised, and every rule was. **Nothing measures whether a player can
read the game**, and nothing cheaply could — which is why the person
playing it is the instrument.
## 3. The dependency question was answered by measurement, not preference
ADR-0011 refused the `csv` crate and named its own revisit condition:
*"nested quoting, embedded newlines, multiple dialects."*
Across every candidate file — Actions, Solutions, Modes, Scenarios —
**zero doubled quotes and zero embedded newlines.** The hand reader's only
job is comma-in-quoted-field, which it already did.
So the argument was not re-run, **and the reason is a measurement rather
than the inconvenience of re-running it.** `edition-check` now asserts
that condition on every vendored file, so the day it stops being true the
gate says so instead of a parser mangling a card.
**One reader, four callers.** A per-file copy is how a parser acquires
four subtly different bugs.
## 4. Two gates were written for a smaller world
**`edition-check` compared the first recorded digest against
`Problems.csv` regardless of which file that digest described.** With one
vendored file it was correct; with four it was comparing across files. It
now checks both directions — a vendored file with no digest fails, and a
digest naming an absent file fails.
**A `cb-play` test asserted the literal string `"game over"`** and went
red when a won game began saying *"solved"* — the feature working. Fixed
by asserting the heading **against the outcome** rather than against a
word, which also covers the no-outcome case the original never touched.
**Both are the same shape:** an assertion that encoded a world with one
file, or one ending. Neither was wrong when written.
## 5. What T07 decided not to do
`Modes.csv` gives `scoring_tiebreak` per mode. For SHARED GROUND it is
**"Not applicable"** — the table succeeds or fails together.
So the co-operative mode shows contributions and **refuses to order
them**, and says why on the page. A leaderboard would have been easy,
looked good, and invented scoring the game does not have — the same defect
class as canonising a provisional default, which this project has already
committed once.
Where a mode *does* rank, the ordering is the game's own words. The single
derived superlative is labelled **"clay-borg's reading, not a rule."**
**This is the first time the project has had the game's own tiebreak to
cite**, and it only had it because §2's import brought `Modes.csv` in. The
alternative was inventing one.
## 6. The overhead view cost no coverage probe
All existing probes passed through a restructure that **deleted two
renderers** (`relations_svg`, `piles_svg`) and merged three diagrams into
one.
**Second confirmation of CB-WP-0027's finding**: a probe that names a
*fact* survives a reflow; one that names a *presentation* does not.
CB-WP-0024's `17 remaining` probe broke on a rendering change;
CB-WP-0027's and this pass's did not, and this reflow was far larger.
The new control is per-seat-count: **2 through 6 seats all lay out with no
two seat circles closer than 70px**, asserted rather than eyeballed at
three — which is the only count anyone ever looks at.
## 7. Chaos window 2 — closed
**Declaration 11 of 12**, structural M, d8 = 1, no override.
The window has now produced **zero overrides in eleven declarations at
d8**. Its retirement condition — *retire if an override changes nothing
twice running* — was never testable, and CB-EV-0024 and CB-EV-0025 both
said so. This is the third and final statement of it.
**The window's verdict should be that d8 bought rarity by spending
evidence.** Window 1 at d4: two overrides, both changed the outcome.
Window 2 at d8: none. **A mechanism that produces no data across a full
window cannot be evaluated by that window**, which is a stronger
conclusion than "the rate is too low" and belongs in whatever closes it.
## Open after this pass
- **F17 needs an artifact.** Counting ATTACK selections across the policy
panel against hand quality is cheap and nobody has done it.
- **Three of four scenarios have never been dealt** (ADR-0015 D5). Now
visible, still true.
- **`Relations`, `DARVO`, `Tokens`, `Glossary` are deferred, not refused.**
If a seat's DARVO stage needs its own words, that is the trigger.
- **Nobody has written a trial note in anger** — carried forward from
CB-EV-0025, and the note channel only started working today.
- **Whether the card text changed what the maintainer understood** is this
pass's real acceptance test and has a person attached to it.