137 lines
6.3 KiB
Markdown
137 lines
6.3 KiB
Markdown
|
|
# 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 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.
|