Reading Player_Mats.csv and Glossary.csv — which O4 had forbidden declaring about until they were read — found a rule. Player_Mats' choice_rule column IS GR-R03: at Stress 4-5 choose ATTACK or GROUND unless you spend a ready Freedom token. The engine's stress_gated and allowed_under_stress_gate match it exactly, and now have a tripwire. So Ornamentation.md gains §1.3: the unit is a column, not a file. Classifying Player_Mats as ornamentation would have thrown a rule away with the colour swatches. A mixed artifact is normal — a player mat is a rule printed on a decorated card in the box too. O4 is rewritten and re-grounded from provisional to rule accordingly. O5, O6, O7 declared with falsifiers. O7's is not theoretical: back_design_id is unread in four vendored files, and hidden information is what card backs are for. CB-EV-0029 answers T04's question per rule rather than as a count — yes, every checkable clause — and states the reading that result does NOT support: it shows GroundRules.md was a faithful secondary source for the clauses with behaviour to check, not that the engine is correct. 10 of 19 files vendored. Nine still unread, and Rules_Text.csv is the one that matters: every clause checked here was checked against our own transcription of it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9.3 KiB
| id | kind | title | status | state_hub_workstream_id |
|---|---|---|---|---|
| CB-WP-0037 | product | The fourteen unread files | done | c8425c0e-51e9-445f-802c-9ff38935fd5a |
Purpose
structural tier M (imports more of an external dataset under AM-4's
budgets, and gives an open register row its first
reproduction)
chaos d8 = 1 → no override
declared tier M
Declaration 9 of chaos window 3.
Why this, and why now
F18 is the only open finding clay-borg owns, the only row in the
register lacking a reproduction, and the only metric off target
(open, lacking a reproduction: 1, target 0). F17 is with ground-game.
And F18 is understated. Its prose describes display data — "the cards cannot say what they do" — and calls itself fixed by CB-WP-0028. Measured now: 5 of 19 files vendored, and among the 14 unread are
| file | what is in it |
|---|---|
DARVO.csv |
mandatory_effect, target_memory, advance — the DARVO sequence, as rules |
Relations.csv |
formation, breaking, rules_text — how Bonds and Rivalries form and break |
Scenarios.csv |
four scenarios with their setups — the engine hardcodes one |
Rules_Text.csv |
21 sections of the rules themselves |
Player_Mats.csv |
includes choice_rule and stress_track |
The engine implements DARVO and relation behaviour without ever having read the edition's statement of them. That is not inert display data; it is rules taken from a secondary source and never checked against the primary one.
A spot check is reassuring — REVERSE's engine path flips Focus to Blame,
gives the target +1 Stress, takes a Protection and reduces the owner's
Stress by 2, exactly as DARVO.csv states. Reassuring is not checked,
and the whole point of this repo is the difference.
Task: give F18 a reproduction
id: CB-WP-0037-T01
status: done
priority: high
state_hub_task_id: "5ff5cbda-0deb-4078-a552-f5e757abb95c"
An artifact that measures the gap instead of asserting it: per edition file, columns present against columns the engine reads.
Controls:
- it can go red and green — improving coverage must move it, or it is not measuring coverage (ADR-0006 D3);
- it reports per file, never a single ratio: "5 of 19" is the sum shape GameDesign §1.2 exists to refuse;
- an absent upstream is reported absent, never as a pass — the shape
edition-checkalready uses.
Done 2026-08-07. the_engine_reads_only_part_of_what_it_vendored.
F18 has a reproduction, and the register's one off-target metric —
open, lacking a reproduction: 1 — is now 0.
Recorded at the accessor, not counted from the source. A list of
column names beside the code would be a second copy of a fact the get
calls already carry; grepping the source would over-count, because six
column names are shared between vendored files.
And the first version was wrong in this repo's signature way. It
watched Table::at only, so it reported visibility, required_solution
and point_value as unread when the engine reads all three —
problems_of predates Table and resolves its own indices. Correct about
the accessor, wrong about the engine: the ADR-0018 family, committed
inside the artifact built to measure it. Problems.csv went 7/13 → 10/13
once the manual reader was recorded too.
Measured, per file, never as a ratio:
| file | read | unread |
|---|---|---|
| Problems.csv | 10/13 | problem_id, symbol_id, back_design_id |
| Actions.csv | 4/9 | symbol_id, resolution_order, target, stress_restriction, designer_note |
| Solutions.csv | 4/8 | suit, symbol_id, quantity, back_design_id |
| Modes.csv | 5/7 | mode_type, back_design_id |
| Tokens.csv | 6/9 | shape, size, symbol_id |
resolution_order, target and stress_restriction are rules, and
the engine implements all three from GroundRules.md without reading the
edition's statement of them. That is T02's work.
F24 raised: solution_deck() is a Rust literal — six of each suit,
never opening Solutions.csv. It agrees today (24 rows, six per
suit), which is why it is inert with role default rather than a
counterexample: right by maintenance coincidence, not by reading.
the_hardcoded_deck_still_matches_the_edition is the guard until T02
deletes the literal, and it turns red the moment either side moves.
Task: vendor what carries rules, and check it against the engine
id: CB-WP-0037-T02
status: done
priority: high
state_hub_task_id: "625b51fd-8af1-46bf-8b91-087760259dd6"
DARVO.csv, Relations.csv, Scenarios.csv first — they carry
mechanism.
Controls:
- every divergence between the edition's text and the engine is a
finding, raised, not quietly fixed: the edition is
ground-game's to rule on; - agreement is recorded too. A survey that finds nothing and leaves no trace cannot be told apart from one never run (CB-EV-0027 §3);
- AM-4's dependency and size budgets hold, or the pass says what it cost.
Done 2026-08-08. DARVO.csv, Relations.csv and Scenarios.csv
vendored with digests; make edition-check green both ways.
Every checkable clause agrees. Recorded rather than merely noted, because a survey that finds nothing and leaves no trace cannot be told from one never run:
| the edition says | the engine does |
|---|---|
| Bond Support: −2 Stress, ready Freedom, cancel the target's DARVO stage | −2, FreedomReadied, DarvoEnded |
| Bond Attack: +2 and flip to Rivalry | +2, RelationFormed(Rivalry) |
| Rivalry Support: −1, target chooses flip or break | −1, FlipToBond / BreakRivalry |
| Rivalry Attack: +2 and break | +2, RelationBroken |
| no-relation Attack forms a Rivalry automatically | forms without consent, both slots free |
| DARVO ATTACK places Focus even if the Attack was cancelled | FocusPlaced after resolve_attack regardless |
| remove Focus if the sequence ends before REVERSE | focus.remove on DarvoEnded |
| REVERSE: flip to Blame, +1 to target, take a Protection, −2 to self | exactly that, with GROUND—ND rejection |
The two hardest clauses to notice were already right, which is the part worth saying: nobody had read the file, and they were right anyway.
These are tripwires, not derivations. The match was made by a person reading prose, and that reading goes stale in silence when the prose changes. Each behaviour pins the phrase it was read from, so a reworded edition turns the test red and asks for a human — mutation-proven by rewording "even if the Attack was cancelled", which fails naming the exact engine branch that depends on it.
F25 raised, and it is the real yield. Scenarios.csv carries
threshold_2_players/3_4/5_6, starting_stress and round_track — and
the engine hardcodes all three: a match returning 5/7/9, stress: 2
at setup, five rounds. They agree on all four scenarios. These are the
most contested numbers in the project — the entire 4/6/9 versus 5/7/9
episode turned on them — and the engine has been right about them by
maintenance coincidence rather than by reading the file that owns them.
Same shape as F24; inert, role default.
A second pair that could drift silently: Problems.csv and
Scenarios.csv both state the deal, and the engine reads only the first.
the_two_files_that_state_the_deal_agree checks all four scenarios; they
match today, and nothing was checking.
Coverage, re-measured — the earlier figure would otherwise have
understated the gap by three files: DARVO.csv 5/6, Relations.csv 4/6,
Scenarios.csv 4/13.
Task: classify the rest
id: CB-WP-0037-T03
status: done
priority: medium
state_hub_task_id: "a09c8738-f38f-414a-a986-ba224396903e"
Symbols, Design_Tokens, Back_Designs, BOM, Print_Manifest are
production and visual identity.
Control: each becomes either a vendored file or an ornament
declaration with a falsifier (OrnamentRegister.md).
O4 already says nothing may be declared about Player_Mats or
Glossary until they are read — so read them or leave O4 alone.
Done 2026-08-08. Read them, and O4 was wrong: Player_Mats.csv
carries GR-R03 in choice_rule. Both files are vendored as mechanism, the
stress gate has a tripwire, and O4 is rewritten and re-grounded from
provisional to rule.
O5, O6, O7 declared with falsifiers — symbols and glyphs, colours and
design tokens, card backs / BOM / print manifest. O7's falsifier is not
theoretical: back_design_id is unread in four vendored files and hidden
information is what card backs are for.
Ornamentation.md §1.3 added: the unit is a column, not a file.
Discovered by doing the work rather than predicted by the plan.
Task: evidence
id: CB-WP-0037-T04
status: done
priority: medium
state_hub_task_id: "e15a9ada-263a-4fce-8975-b5d88b9ac08a"
evidence/CB-EV-*.md. Did the engine's rules match the edition's?
Say so either way, per rule, not as a count.
Done 2026-08-08.
CB-EV-0029.
Yes, every checkable clause — stated per rule, and with the reading
that result does not support said out loud: it shows GroundRules.md
was a faithful secondary source for the clauses that have behaviour to
check, not that the engine is correct.