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>
6.3 KiB
CB-EV-0029 — the fourteen unread files
CB-WP-0037 T04. Tier M (imports more of an external dataset under AM-4's budgets; chaos d8 = 1 → no override). Declaration 9 of chaos window 3. Closed 2026-08-08.
Delivered: F18's first reproduction, five more vendored files, the engine's rules checked against the edition's for the first time, F24 and F25 raised, four ornament declarations, and one spec clause the work produced rather than the plan predicting.
1. Did the engine's rules match the edition's?
Yes. Every checkable clause, on the first reading. Stated per rule, because a count would hide which ones were checked.
| 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, the 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 regardless of the attack's outcome |
| remove Focus if the sequence ends before REVERSE | focus.remove on DarvoEnded |
| REVERSE: flip to Blame, +1 target, take a Protection, −2 self | exactly that, with GROUND—ND rejection |
| GR-R03: at Stress 4–5 only ATTACK or GROUND unless Freedom | stress_gated ≥ 4, allowed_under_stress_gate |
The two hardest clauses to notice were already right. Focus after a cancelled Attack, and Focus removed on an early end, are the kind of thing a reimplementation drops — and nobody here had read the file they come from.
That is a real result and it is worth resisting the obvious reading.
It does not show the engine is correct; it shows GroundRules.md was a
faithful secondary source for the clauses we checked. The clauses we did
not check are the ones with no behaviour to check against, and they are
still unread.
2. What the reproduction cost, and the error inside it
F18 had sat open with no artifact — the only such row — because the gap had been hand-counted, never measured.
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 over-counting
coverage understates the gap — the wrong direction for a measurement
whose only job is to size it.
The first version was wrong in this project's signature way. It
watched Table::at only and reported visibility, required_solution
and point_value as unread when the engine reads all three through
problems_of's own index lookups. Correct about the accessor, wrong about
the engine: the ADR-0018 family, committed inside the artifact built to
measure that family. Problems.csv went 7/13 → 10/13 once the manual
reader was recorded too.
Coverage, after this pass — 10 of 19 files vendored:
| file | read | file | read |
|---|---|---|---|
| Glossary.csv | 2/2 | Modes.csv | 5/7 |
| Problems.csv | 10/13 | Tokens.csv | 6/9 |
| Scenarios.csv | 9/13 | Actions.csv | 4/9 |
| DARVO.csv | 5/6 | Solutions.csv | 4/8 |
| Relations.csv | 4/6 | Player_Mats.csv | 1/14 |
Player_Mats reads one column of fourteen, and that is correct: §4.
3. Two findings, one shape
F24 — solution_deck() builds six of each suit from a Rust array and
never opens Solutions.csv, whose suit and quantity say the same.
F25 — GroundState::threshold is a match returning 5/7/9;
Scenarios.csv carries threshold_2_players, threshold_3_4_players,
threshold_5_6_players. Setup writes stress: 2; the edition says "All
players start at Stress 2." The engine plays five rounds; the edition
prints a 1–5 track.
Both agree, and that is the finding rather than the reassurance. F25's numbers are the most contested in the project — the whole 4/6/9 versus 5/7/9 episode, a withdrawal, a ruling and a scenario rewrite turned on exactly these — and the engine has been right about them by maintenance coincidence rather than by reading the file that owns them.
Filed inert, role default, not counterexample: the reproduction
is green because the two agree, which GameDesign §1.3 says to expect
from a documented provisional choice, and it turns red the moment either
side moves.
4. The clause the work produced
Player_Mats.csv looks like pure ornamentation — a symbol, a colour, a
title for each of six seats. One of its fourteen columns, choice_rule,
is GR-R03.
Classifying the file would have thrown a rule away with the colour
swatches. So Ornamentation.md gained §1.3: the unit is a column, not a
file, and a mixed artifact is normal — a player mat is a rule printed on
a decorated card in the box too.
This is why O4 was wrong and has been rewritten. It said nothing could
be declared about Player_Mats or Glossary until they were read, and
assumed both were ornamentation-bearing. Reading them found a rule.
5. Tripwires, and why they are not derivations
Every agreement in §1 was established by a person reading prose, and that reading goes stale in silence when the prose changes.
So each behaviour pins the phrase it was read from. Reword the edition and the test goes red naming the engine branch that depended on it — mutation-proven by rewording "even if the Attack was cancelled".
It asks for a human rather than re-deriving, and that is deliberate: a rules change absorbed automatically is a rules change nobody decided.
6. Cost
make cost, not inlined (§Single source of fact). Five files vendored, no
new dependency, no budget moved.
Open after this pass
- Nine files still unread, and
Rules_Text.csv(21 sections) is the one that matters: it is the rules themselves, and every clause in §1 was checked againstGroundRules.md, our transcription of them. resolution_order,targetandstress_restrictionare unread inActions.csvand look like rules. Nothing in §1 covers them.- F17 waits on ground-game's maintainer, not on us.
- F24 and F25 are guarded, not fixed. The literals are still literals.