CB-WP-0037 done: T03 classification and T04 evidence
Some checks failed
ci / check (push) Failing after 5s

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>
This commit is contained in:
tegwick 2026-08-08 00:33:24 +02:00
parent 87414d7c1d
commit 627992bc85
10 changed files with 497 additions and 12 deletions

View file

@ -0,0 +1,136 @@
# 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 45 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 15 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 against `GroundRules.md`, our transcription of them.
- **`resolution_order`, `target` and `stress_restriction`** are unread in
`Actions.csv` and 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.