clay-borg/workplans/CB-WP-0037-the-fourteen-unread-files.md
tegwick 627992bc85
Some checks failed
ci / check (push) Failing after 5s
CB-WP-0037 done: T03 classification and T04 evidence
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>
2026-08-08 00:33:24 +02:00

220 lines
9.3 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.

---
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.