--- id: CB-WP-0037 kind: product title: "The fourteen unread files" status: done state_hub_workstream_id: "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 ```task 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-check` already 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 ```task 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 ```task 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`](../specs/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 ```task 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](../evidence/CB-EV-0029-the-fourteen-unread-files.md). **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.