CB-WP-0037 done: T03 classification and T04 evidence
Some checks failed
ci / check (push) Failing after 5s
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:
parent
87414d7c1d
commit
627992bc85
10 changed files with 497 additions and 12 deletions
|
|
@ -215,6 +215,6 @@
|
||||||
| task | CB-WP-0036-T02 | done | — | workplans/CB-WP-0036-interactive-mode.md |
|
| task | CB-WP-0036-T02 | done | — | workplans/CB-WP-0036-interactive-mode.md |
|
||||||
| task | CB-WP-0036-T03 | done | — | workplans/CB-WP-0036-interactive-mode.md |
|
| task | CB-WP-0036-T03 | done | — | workplans/CB-WP-0036-interactive-mode.md |
|
||||||
| task | CB-WP-0037-T01 | done | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |
|
| task | CB-WP-0037-T01 | done | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |
|
||||||
| task | CB-WP-0037-T02 | todo | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |
|
| task | CB-WP-0037-T02 | done | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |
|
||||||
| task | CB-WP-0037-T03 | todo | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |
|
| task | CB-WP-0037-T03 | todo | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |
|
||||||
| task | CB-WP-0037-T04 | todo | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |
|
| task | CB-WP-0037-T04 | todo | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |
|
||||||
|
|
|
||||||
16
editions/ground-darvo-r0/Glossary.csv
Normal file
16
editions/ground-darvo-r0/Glossary.csv
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
term,definition
|
||||||
|
Action,"One reusable card selected by each player every round: Investigate, Solve, Support, Attack, or GROUND."
|
||||||
|
Blame,The reverse side of a Focus token. It is worth −1 personal point and can be removed by GROUND—ND.
|
||||||
|
Bond,A symmetric supportive relation occupying one relation slot for each player.
|
||||||
|
DARVO,"A binding three-stage defensive reflex: Deny, Attack, Reverse."
|
||||||
|
Denied Problem,A previously visible Problem turned face down by Deny. It cannot be investigated or solved until restored.
|
||||||
|
Freedom,A one-use token that permits any Action at Stress 4 or 5.
|
||||||
|
Focus,"The front of a player's Focus/Blame token, placed on the target during the DARVO Attack stage."
|
||||||
|
GROUND,"The only constructive practice in the core set, offering Ground & Restate, Observe & Uphold, or Name & Decide."
|
||||||
|
Lead,The rotating marker that breaks ties when multiple effects of the same type resolve.
|
||||||
|
Problem,A Surface or Hidden issue that must be visible and matched with the correct Solution suit.
|
||||||
|
Protection,A token gained through Reverse that cancels the next Attack against its holder.
|
||||||
|
Relation slot,One of two player capacities for holding a Bond or Rivalry.
|
||||||
|
Rivalry,A symmetric conflict relation occupying one slot for each player and amplifying Attack.
|
||||||
|
Stress,A 0–5 state track that constrains action choice and triggers DARVO at 5.
|
||||||
|
Surface Problem,The Scenario's starting visible Problem.
|
||||||
|
|
|
@ -22,6 +22,8 @@ build must not depend on a sibling checkout that CI does not have.
|
||||||
| `DARVO.csv` | 2026-08-08 | `8886543` | **the DARVO sequence as rules**: `mandatory_effect`, `target_memory`, `advance` (CB-WP-0037 T02) |
|
| `DARVO.csv` | 2026-08-08 | `8886543` | **the DARVO sequence as rules**: `mandatory_effect`, `target_memory`, `advance` (CB-WP-0037 T02) |
|
||||||
| `Relations.csv` | 2026-08-08 | `8886543` | **how Bonds and Rivalries form and break**: `formation`, `breaking`, `rules_text` |
|
| `Relations.csv` | 2026-08-08 | `8886543` | **how Bonds and Rivalries form and break**: `formation`, `breaking`, `rules_text` |
|
||||||
| `Scenarios.csv` | 2026-08-08 | `8886543` | the four scenarios and their setups — the engine deals one |
|
| `Scenarios.csv` | 2026-08-08 | `8886543` | the four scenarios and their setups — the engine deals one |
|
||||||
|
| `Player_Mats.csv` | 2026-08-08 | `8886543` | **`choice_rule` is GR-R03**, the stress gate — mechanism on a mat (CB-WP-0037 T03) |
|
||||||
|
| `Glossary.csv` | 2026-08-08 | `8886543` | the game's own words for its own terms, and `Relation slot` restates GR-L01's two |
|
||||||
|
|
||||||
**Why these three, now.** The engine already implements the DARVO
|
**Why these three, now.** The engine already implements the DARVO
|
||||||
sequence and relation formation/breaking — from `GroundRules.md`, never
|
sequence and relation formation/breaking — from `GroundRules.md`, never
|
||||||
|
|
@ -29,9 +31,18 @@ from the edition's own statement of them. That is not inert display data;
|
||||||
it is **rules taken from a secondary source and never checked against the
|
it is **rules taken from a secondary source and never checked against the
|
||||||
primary one**, and CB-WP-0037 T02 exists to check them.
|
primary one**, and CB-WP-0037 T02 exists to check them.
|
||||||
|
|
||||||
|
**`Player_Mats.csv` is the reason a file is not the unit.** It is mostly
|
||||||
|
ornamentation — a symbol, a colour, a title per seat — and one column,
|
||||||
|
`choice_rule`, is GR-R03 itself: *"At Stress 0-3 choose any action. At
|
||||||
|
Stress 4-5 choose ATTACK or GROUND unless you spend a ready Freedom
|
||||||
|
token."* Classifying the file would have thrown the rule away with the
|
||||||
|
colour swatches (see [`Ornamentation.md`](../../specs/Ornamentation.md) §1.4).
|
||||||
|
|
||||||
**Deliberately absent**: `BOM`, `Print_Manifest`, `Back_Designs`,
|
**Deliberately absent**: `BOM`, `Print_Manifest`, `Back_Designs`,
|
||||||
`Symbols`, `Design_Tokens` — production artifacts for a physical print
|
`Symbols`, `Design_Tokens` — production artifacts for a physical print
|
||||||
run, meaningless to a simulator. And `Extensions.csv`, which names content
|
run, meaningless to a simulator, and now declared as ornamentation with
|
||||||
|
falsifiers rather than merely skipped
|
||||||
|
([`OrnamentRegister.md`](../../specs/OrnamentRegister.md) O5-O7). And `Extensions.csv`, which names content
|
||||||
the designer placed *outside* the core; importing it would break the claim
|
the designer placed *outside* the core; importing it would break the claim
|
||||||
that this engine plays the edition as printed (ADR-0015 D2).
|
that this engine plays the edition as printed (ADR-0015 D2).
|
||||||
|
|
||||||
|
|
@ -40,7 +51,9 @@ that this engine plays the edition as printed (ADR-0015 D2).
|
||||||
```
|
```
|
||||||
sha256 7a7a302aabecdeb419c562a029bec3e3576a306b0bd1175d1200de60d9530073 Actions.csv
|
sha256 7a7a302aabecdeb419c562a029bec3e3576a306b0bd1175d1200de60d9530073 Actions.csv
|
||||||
sha256 0afb882dc8001f03bc48a152c9d8c36ad492ceeff2d30ef6a3a690937317f77b DARVO.csv
|
sha256 0afb882dc8001f03bc48a152c9d8c36ad492ceeff2d30ef6a3a690937317f77b DARVO.csv
|
||||||
|
sha256 d06924a19f805feb9e2557fd5c06254ae2054e1f865265f45c26eb293f53bf12 Glossary.csv
|
||||||
sha256 565431571bc06adafb67edefd4b368839b6b94134c2289877384688cc643390b Modes.csv
|
sha256 565431571bc06adafb67edefd4b368839b6b94134c2289877384688cc643390b Modes.csv
|
||||||
|
sha256 ad2bfbf897bbb3878691cbdbfec739adc58d28cad3923a989dd46b426cce1395 Player_Mats.csv
|
||||||
sha256 0a04830c93b62dcb2f4411a9fbde576368a7427fe9e63c5015e606e4d42d23a0 Problems.csv
|
sha256 0a04830c93b62dcb2f4411a9fbde576368a7427fe9e63c5015e606e4d42d23a0 Problems.csv
|
||||||
sha256 cd84c3b131c1b7a541e9e42529fdce2b7911f0832cce8c50cfcb8462d01dc551 Relations.csv
|
sha256 cd84c3b131c1b7a541e9e42529fdce2b7911f0832cce8c50cfcb8462d01dc551 Relations.csv
|
||||||
sha256 f830de9ca44417a7510e04a39ea24a070a81969b33a31fa68361fba132ad40cd Scenarios.csv
|
sha256 f830de9ca44417a7510e04a39ea24a070a81969b33a31fa68361fba132ad40cd Scenarios.csv
|
||||||
|
|
|
||||||
7
editions/ground-darvo-r0/Player_Mats.csv
Normal file
7
editions/ground-darvo-r0/Player_Mats.csv
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
player_id,player_name,symbol,ascii,color_name,color_hex,front_title,stress_track,choice_rule,freedom_area,darvo_track,relation_slots,back_reference,size
|
||||||
|
P1,Circle,●,O,Teal,#2A9D8F,● PLAYER 1,0 Clear | 1 Alert | 2 Strained | 3 Pressured | 4 Reactive | 5 Triggered,At Stress 0–3 choose any action. At Stress 4–5 choose ATTACK or GROUND unless you spend a ready Freedom token.,READY / SPENT,OFF → DENY → ATTACK → REVERSE → OFF,Two relation-link slots.,Round: Select → Reveal → GROUND → Support → DARVO → Investigate → Attack → Solve → End. Lead breaks same-step ties and rotates clockwise.,"88 × 126 mm, portrait, double-sided"
|
||||||
|
P2,Triangle,▲,^,Amber,#E9C46A,▲ PLAYER 2,0 Clear | 1 Alert | 2 Strained | 3 Pressured | 4 Reactive | 5 Triggered,At Stress 0–3 choose any action. At Stress 4–5 choose ATTACK or GROUND unless you spend a ready Freedom token.,READY / SPENT,OFF → DENY → ATTACK → REVERSE → OFF,Two relation-link slots.,Round: Select → Reveal → GROUND → Support → DARVO → Investigate → Attack → Solve → End. Lead breaks same-step ties and rotates clockwise.,"88 × 126 mm, portrait, double-sided"
|
||||||
|
P3,Square,■,#,Coral,#E76F51,■ PLAYER 3,0 Clear | 1 Alert | 2 Strained | 3 Pressured | 4 Reactive | 5 Triggered,At Stress 0–3 choose any action. At Stress 4–5 choose ATTACK or GROUND unless you spend a ready Freedom token.,READY / SPENT,OFF → DENY → ATTACK → REVERSE → OFF,Two relation-link slots.,Round: Select → Reveal → GROUND → Support → DARVO → Investigate → Attack → Solve → End. Lead breaks same-step ties and rotates clockwise.,"88 × 126 mm, portrait, double-sided"
|
||||||
|
P4,Diamond,◆,<>,Blue,#457B9D,◆ PLAYER 4,0 Clear | 1 Alert | 2 Strained | 3 Pressured | 4 Reactive | 5 Triggered,At Stress 0–3 choose any action. At Stress 4–5 choose ATTACK or GROUND unless you spend a ready Freedom token.,READY / SPENT,OFF → DENY → ATTACK → REVERSE → OFF,Two relation-link slots.,Round: Select → Reveal → GROUND → Support → DARVO → Investigate → Attack → Solve → End. Lead breaks same-step ties and rotates clockwise.,"88 × 126 mm, portrait, double-sided"
|
||||||
|
P5,Hexagon,⬢,H,Violet,#7B61A8,⬢ PLAYER 5,0 Clear | 1 Alert | 2 Strained | 3 Pressured | 4 Reactive | 5 Triggered,At Stress 0–3 choose any action. At Stress 4–5 choose ATTACK or GROUND unless you spend a ready Freedom token.,READY / SPENT,OFF → DENY → ATTACK → REVERSE → OFF,Two relation-link slots.,Round: Select → Reveal → GROUND → Support → DARVO → Investigate → Attack → Solve → End. Lead breaks same-step ties and rotates clockwise.,"88 × 126 mm, portrait, double-sided"
|
||||||
|
P6,Wave,≋,~,Olive,#6B8E23,≋ PLAYER 6,0 Clear | 1 Alert | 2 Strained | 3 Pressured | 4 Reactive | 5 Triggered,At Stress 0–3 choose any action. At Stress 4–5 choose ATTACK or GROUND unless you spend a ready Freedom token.,READY / SPENT,OFF → DENY → ATTACK → REVERSE → OFF,Two relation-link slots.,Round: Select → Reveal → GROUND → Support → DARVO → Investigate → Attack → Solve → End. Lead breaks same-step ties and rotates clockwise.,"88 × 126 mm, portrait, double-sided"
|
||||||
|
136
evidence/CB-EV-0029-the-fourteen-unread-files.md
Normal file
136
evidence/CB-EV-0029-the-fourteen-unread-files.md
Normal 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 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.
|
||||||
|
|
@ -75,6 +75,8 @@ const TOKENS_CSV: &str = include_str!("../../../editions/ground-darvo-r0/Tokens.
|
||||||
const DARVO_CSV: &str = include_str!("../../../editions/ground-darvo-r0/DARVO.csv");
|
const DARVO_CSV: &str = include_str!("../../../editions/ground-darvo-r0/DARVO.csv");
|
||||||
const RELATIONS_CSV: &str = include_str!("../../../editions/ground-darvo-r0/Relations.csv");
|
const RELATIONS_CSV: &str = include_str!("../../../editions/ground-darvo-r0/Relations.csv");
|
||||||
const SCENARIOS_CSV: &str = include_str!("../../../editions/ground-darvo-r0/Scenarios.csv");
|
const SCENARIOS_CSV: &str = include_str!("../../../editions/ground-darvo-r0/Scenarios.csv");
|
||||||
|
const PLAYER_MATS_CSV: &str = include_str!("../../../editions/ground-darvo-r0/Player_Mats.csv");
|
||||||
|
const GLOSSARY_CSV: &str = include_str!("../../../editions/ground-darvo-r0/Glossary.csv");
|
||||||
|
|
||||||
/// A vendored CSV, parsed into rows addressable by column name.
|
/// A vendored CSV, parsed into rows addressable by column name.
|
||||||
///
|
///
|
||||||
|
|
@ -502,6 +504,42 @@ pub fn scenarios() -> Result<Vec<ScenarioText>, String> {
|
||||||
Ok(out)
|
Ok(out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The stress gate, printed on every player mat (CB-WP-0037 T03).
|
||||||
|
///
|
||||||
|
/// **A mat is mostly ornamentation with one rule on it.** Symbol, colour
|
||||||
|
/// and title decorate; `choice_rule` is GR-R03. All six seats print the
|
||||||
|
/// same rule, so this returns it once and checks they agree.
|
||||||
|
pub fn choice_rule() -> Result<String, String> {
|
||||||
|
let t = Table::parse(PLAYER_MATS_CSV, "Player_Mats.csv")?;
|
||||||
|
let mut seen: Option<String> = None;
|
||||||
|
for row in &t.rows {
|
||||||
|
let rule = t.get(row, "choice_rule")?.to_string();
|
||||||
|
match &seen {
|
||||||
|
None => seen = Some(rule),
|
||||||
|
Some(first) if *first == rule => {}
|
||||||
|
Some(first) => {
|
||||||
|
return Err(format!(
|
||||||
|
"player mats disagree on the stress gate: {first:?} vs {rule:?}"
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
seen.ok_or_else(|| "Player_Mats.csv has no rows".to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The game's own words for its own terms (CB-WP-0037 T03).
|
||||||
|
pub fn glossary() -> Result<Vec<(String, String)>, String> {
|
||||||
|
let t = Table::parse(GLOSSARY_CSV, "Glossary.csv")?;
|
||||||
|
let mut out = Vec::new();
|
||||||
|
for row in &t.rows {
|
||||||
|
out.push((
|
||||||
|
t.get(row, "term")?.to_string(),
|
||||||
|
t.get(row, "definition")?.to_string(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
Ok(out)
|
||||||
|
}
|
||||||
|
|
||||||
/// One relation side as the edition states it (CB-WP-0037 T02).
|
/// One relation side as the edition states it (CB-WP-0037 T02).
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct RelationText {
|
pub struct RelationText {
|
||||||
|
|
@ -667,6 +705,8 @@ mod card_text_tests {
|
||||||
let _ = darvo_stages();
|
let _ = darvo_stages();
|
||||||
let _ = relations();
|
let _ = relations();
|
||||||
let _ = scenarios();
|
let _ = scenarios();
|
||||||
|
let _ = choice_rule();
|
||||||
|
let _ = glossary();
|
||||||
|
|
||||||
let files = [
|
let files = [
|
||||||
("Problems.csv", CSV),
|
("Problems.csv", CSV),
|
||||||
|
|
@ -677,6 +717,8 @@ mod card_text_tests {
|
||||||
("DARVO.csv", DARVO_CSV),
|
("DARVO.csv", DARVO_CSV),
|
||||||
("Relations.csv", RELATIONS_CSV),
|
("Relations.csv", RELATIONS_CSV),
|
||||||
("Scenarios.csv", SCENARIOS_CSV),
|
("Scenarios.csv", SCENARIOS_CSV),
|
||||||
|
("Player_Mats.csv", PLAYER_MATS_CSV),
|
||||||
|
("Glossary.csv", GLOSSARY_CSV),
|
||||||
];
|
];
|
||||||
let mut report = String::new();
|
let mut report = String::new();
|
||||||
let mut total_unread = 0usize;
|
let mut total_unread = 0usize;
|
||||||
|
|
@ -708,6 +750,52 @@ mod card_text_tests {
|
||||||
println!("{report}");
|
println!("{report}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// **The stress gate is printed on the mats** (CB-WP-0037 T03).
|
||||||
|
///
|
||||||
|
/// `Player_Mats.csv` looked like pure ornamentation — a symbol, a
|
||||||
|
/// colour, a title per seat — and one of its columns is GR-R03:
|
||||||
|
/// *"At Stress 0-3 choose any action. At Stress 4-5 choose ATTACK or
|
||||||
|
/// GROUND unless you spend a ready Freedom token."*
|
||||||
|
///
|
||||||
|
/// **This is why the classification unit is a column, not a file.**
|
||||||
|
/// Declaring the mats ornamental would have discarded a rule the
|
||||||
|
/// engine implements, alongside the colour swatches it sits next to.
|
||||||
|
///
|
||||||
|
/// A tripwire, like T02's: the engine's `stress_gated` and
|
||||||
|
/// `allowed_under_stress_gate` were written from `GroundRules.md`,
|
||||||
|
/// and this pins the edition sentence they answer to.
|
||||||
|
#[test]
|
||||||
|
fn the_mats_still_print_the_stress_gate_the_engine_enforces() {
|
||||||
|
let rule = choice_rule().expect("Player_Mats.csv");
|
||||||
|
// `stress_gated`: stress >= 4, unless Freedom lifted the gate.
|
||||||
|
assert!(
|
||||||
|
rule.contains("At Stress 4\u{2013}5") || rule.contains("At Stress 4-5"),
|
||||||
|
"the gate's threshold moved; `stress_gated` uses >= 4: {rule:?}"
|
||||||
|
);
|
||||||
|
// `allowed_under_stress_gate`: ATTACK and GROUND, and only those.
|
||||||
|
assert!(
|
||||||
|
rule.contains("ATTACK or GROUND"),
|
||||||
|
"the gate's admitted actions changed: {rule:?}"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
rule.contains("ready Freedom token"),
|
||||||
|
"the escape hatch changed; the engine spends Freedom: {rule:?}"
|
||||||
|
);
|
||||||
|
|
||||||
|
// GR-L01's two slots are restated in the glossary, and
|
||||||
|
// `has_free_slot` is written against that number.
|
||||||
|
let g = glossary().expect("Glossary.csv");
|
||||||
|
let slot = g
|
||||||
|
.iter()
|
||||||
|
.find(|(term, _)| term == "Relation slot")
|
||||||
|
.map(|(_, d)| d.clone())
|
||||||
|
.expect("Relation slot is defined");
|
||||||
|
assert!(
|
||||||
|
slot.contains("two"),
|
||||||
|
"the glossary no longer says two relation slots: {slot:?}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// **F25** — the engine hardcodes numbers the edition states.
|
/// **F25** — the engine hardcodes numbers the edition states.
|
||||||
///
|
///
|
||||||
/// `GroundState::threshold` is a `match` returning 5/7/9;
|
/// `GroundState::threshold` is a `match` returning 5/7/9;
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,10 @@ made once.
|
||||||
| O1 | hand order | provisional | declared | 2026-08-07 |
|
| O1 | hand order | provisional | declared | 2026-08-07 |
|
||||||
| O2 | who shuffles and deals | provisional | declared | 2026-08-07 |
|
| O2 | who shuffles and deals | provisional | declared | 2026-08-07 |
|
||||||
| O3 | where a seat is drawn | rule | declared | 2026-08-07 |
|
| O3 | where a seat is drawn | rule | declared | 2026-08-07 |
|
||||||
| O4 | card typography and illustration | provisional | declared | 2026-08-07 |
|
| O4 | card typography and illustration | rule | declared | 2026-08-07 |
|
||||||
|
| O5 | symbols and glyphs | provisional | declared | 2026-08-08 |
|
||||||
|
| O6 | colours and design tokens | provisional | declared | 2026-08-08 |
|
||||||
|
| O7 | card backs, bill of materials, print manifest | rule | declared | 2026-08-08 |
|
||||||
|
|
||||||
<!-- ornament-register:end -->
|
<!-- ornament-register:end -->
|
||||||
|
|
||||||
|
|
@ -55,12 +58,47 @@ made once.
|
||||||
|
|
||||||
- **O4 — card typography and illustration.** How a card looks does not
|
- **O4 — card typography and illustration.** How a card looks does not
|
||||||
change what it does. **But it is not ours to invent**: ADR-0015's
|
change what it does. **But it is not ours to invent**: ADR-0015's
|
||||||
discipline holds, and `Player_Mats` and `Glossary` — which carry exactly
|
discipline holds.
|
||||||
this — are still unvendored (F18).
|
|
||||||
**Falsifier:** a card whose meaning is carried by its layout or art
|
**Falsifier:** a card whose meaning is carried by its layout or art
|
||||||
rather than its text, which is a real possibility in a game about
|
rather than its text, which is a real possibility in a game about
|
||||||
perception and is the reason this is `provisional` rather than `rule`.
|
perception.
|
||||||
**Nothing may be declared about these files until they are read.**
|
**Updated 2026-08-08, and the earlier version of this row was wrong.**
|
||||||
|
It said nothing could be declared until `Player_Mats` and `Glossary`
|
||||||
|
were read, and treated both as ornamentation-bearing. They have now been
|
||||||
|
read, and **`Player_Mats.csv` carries GR-R03** — the stress gate — in
|
||||||
|
its `choice_rule` column. Both files are vendored as mechanism; what
|
||||||
|
remains ornamental on a mat is the symbol, the colour and the title,
|
||||||
|
which is why this row is now `rule`-grounded: the rules text lives in
|
||||||
|
columns we read, so what is left is demonstrably decoration.
|
||||||
|
|
||||||
|
- **O5 — symbols and glyphs.** `Symbols.csv` gives each concept a glyph,
|
||||||
|
an ASCII fallback and an icon brief. The engine names concepts in words
|
||||||
|
and never in glyphs, so nothing it computes can depend on them.
|
||||||
|
**Falsifier:** a rule that distinguishes two things only by their
|
||||||
|
symbol, or a `symbol_id` that appears in a rules text as the sole
|
||||||
|
referent for something. Note `symbol_id` is currently unread in **six**
|
||||||
|
vendored files, which is what this row licenses — and if that ever
|
||||||
|
becomes load-bearing this row is how we find out.
|
||||||
|
|
||||||
|
- **O6 — colours and design tokens.** `Design_Tokens.csv` is a palette
|
||||||
|
with usages. No rule refers to a colour, and seat colour is a label for
|
||||||
|
a seat the engine already identifies by `PlayerId`.
|
||||||
|
**Falsifier:** a rule keyed to colour — *"the red player leads"*, a
|
||||||
|
colour-coded suit — or a component whose identity is only its colour.
|
||||||
|
**Provisional**: nobody has ruled that colour is non-binding; we
|
||||||
|
observed that no vendored rules text mentions one.
|
||||||
|
|
||||||
|
- **O7 — card backs, bill of materials, print manifest.** `Back_Designs`,
|
||||||
|
`BOM` and `Print_Manifest` describe a physical print run: stock, cut
|
||||||
|
sizes, quantities to manufacture.
|
||||||
|
**Falsifier:** a *back* that distinguishes two decks the rules treat
|
||||||
|
differently — which is exactly what `back_design_id` would encode, and
|
||||||
|
it is unread in four vendored files. That is a real hazard rather than a
|
||||||
|
theoretical one: hidden information is what card backs are *for*, and a
|
||||||
|
game about concealment could easily make one load-bearing.
|
||||||
|
`rule`-grounded because the engine's hidden information is modelled from
|
||||||
|
the rules text (face-up/face-down, `Hidden` visibility), not from print
|
||||||
|
data.
|
||||||
|
|
||||||
## What is deliberately absent
|
## What is deliberately absent
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,13 +53,31 @@ decision, and it is ornamentation. This was the open question in
|
||||||
CB-WP-0036 and the maintainer settled it: these are ornamental *because
|
CB-WP-0036 and the maintainer settled it: these are ornamental *because
|
||||||
they are not necessary*, not because nobody chooses.
|
they are not necessary*, not because nobody chooses.
|
||||||
|
|
||||||
### 1.3 Why not "ritual"
|
### 1.3 The unit is a column, not a file
|
||||||
|
|
||||||
|
**Discovered by doing it** (CB-WP-0037 T03). `Player_Mats.csv` looks like
|
||||||
|
pure ornamentation — a symbol, a colour, a title for each of six seats —
|
||||||
|
and one of its columns is GR-R03 itself:
|
||||||
|
|
||||||
|
> *"At Stress 0–3 choose any action. At Stress 4–5 choose ATTACK or GROUND
|
||||||
|
> unless you spend a ready Freedom token."*
|
||||||
|
|
||||||
|
That is the stress gate the engine enforces in `stress_gated` and
|
||||||
|
`allowed_under_stress_gate`. **Classifying the file would have thrown a
|
||||||
|
rule away with the colour swatches.**
|
||||||
|
|
||||||
|
So a declaration names *what* it ornaments, not *where the bytes live*. A
|
||||||
|
mixed artifact is normal: the mat is a rule printed on a decorated card,
|
||||||
|
which is exactly what a player mat is in the box too.
|
||||||
|
|
||||||
|
### 1.4 Why not "ritual"
|
||||||
|
|
||||||
`ritual` reads as ceremony only, and half of this category is not
|
`ritual` reads as ceremony only, and half of this category is not
|
||||||
ceremonial — card stock, a typeface, the drift of a discard, how legible a
|
ceremonial — card stock, a typeface, the drift of a discard, how legible a
|
||||||
player mat is. **`ornamentation` covers the material and the ceremonial
|
player mat is. **`ornamentation` covers the material and the ceremonial
|
||||||
together**, and carries the right implication: it is *applied to* the
|
together**, and carries the right implication: it is *applied to* the
|
||||||
thing, and it is not structural.
|
thing, and it is not structural — and §1.3 is why *applied to* is the
|
||||||
|
right preposition: it sits on something, it is not the something.
|
||||||
|
|
||||||
Ornamentation is **not decoration in the pejorative sense**. This project
|
Ornamentation is **not decoration in the pejorative sense**. This project
|
||||||
uses "decoration" for a control that cannot fail (ADR-0006 D3), and that
|
uses "decoration" for a control that cannot fail (ADR-0006 D3), and that
|
||||||
|
|
|
||||||
149
trials/2026-08-08-0019.yaml
Normal file
149
trials/2026-08-08-0019.yaml
Normal file
|
|
@ -0,0 +1,149 @@
|
||||||
|
scenario: ground/cb-play-session
|
||||||
|
description: recorded by cb-play (CB-WP-0008 T02)
|
||||||
|
covers: []
|
||||||
|
provisional: false
|
||||||
|
provisional_owner: ''
|
||||||
|
provisional_raised: ''
|
||||||
|
ruled: ''
|
||||||
|
ruled_by: ''
|
||||||
|
ruled_note: ''
|
||||||
|
encodes_u_item: ''
|
||||||
|
seed: 1
|
||||||
|
setup:
|
||||||
|
players: 3
|
||||||
|
preset: standard-3p
|
||||||
|
patch: {}
|
||||||
|
commands:
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 2
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 1
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 1
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 3
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 3
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 3
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 3
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: INVESTIGATE
|
||||||
|
problem: 4
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 2
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 4
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SUPPORT
|
||||||
|
target: P1
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SOLVE
|
||||||
|
problem: 4
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: respond_to_support
|
||||||
|
args:
|
||||||
|
response: accept_bond
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
- actor: P1
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SUPPORT
|
||||||
|
target: P3
|
||||||
|
- actor: P2
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SUPPORT
|
||||||
|
target: P1
|
||||||
|
- actor: P3
|
||||||
|
cmd: select_action
|
||||||
|
args:
|
||||||
|
action: SUPPORT
|
||||||
|
target: P1
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: reveal
|
||||||
|
args: {}
|
||||||
|
- actor: P3
|
||||||
|
cmd: respond_to_support
|
||||||
|
args:
|
||||||
|
response: accept_bond
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: resolve
|
||||||
|
args: {}
|
||||||
|
- actor: SYSTEM
|
||||||
|
cmd: end_round
|
||||||
|
args: {}
|
||||||
|
expect:
|
||||||
|
events: []
|
||||||
|
state: {}
|
||||||
|
rejects: []
|
||||||
|
state_hash: 6bee3941bb6a5fc0b02273d404799103c4150bcc328f7902532dec40a21c7ee3
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
id: CB-WP-0037
|
id: CB-WP-0037
|
||||||
kind: product
|
kind: product
|
||||||
title: "The fourteen unread files"
|
title: "The fourteen unread files"
|
||||||
status: active
|
status: done
|
||||||
state_hub_workstream_id: "c8425c0e-51e9-445f-802c-9ff38935fd5a"
|
state_hub_workstream_id: "c8425c0e-51e9-445f-802c-9ff38935fd5a"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -174,7 +174,7 @@ understated the gap by three files: `DARVO.csv` 5/6, `Relations.csv` 4/6,
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: CB-WP-0037-T03
|
id: CB-WP-0037-T03
|
||||||
status: todo
|
status: done
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "a09c8738-f38f-414a-a986-ba224396903e"
|
state_hub_task_id: "a09c8738-f38f-414a-a986-ba224396903e"
|
||||||
```
|
```
|
||||||
|
|
@ -187,14 +187,34 @@ declaration with a falsifier** ([`OrnamentRegister.md`](../specs/OrnamentRegiste
|
||||||
**O4 already says nothing may be declared about `Player_Mats` or
|
**O4 already says nothing may be declared about `Player_Mats` or
|
||||||
`Glossary` until they are read** — so read them or leave O4 alone.
|
`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: evidence
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: CB-WP-0037-T04
|
id: CB-WP-0037-T04
|
||||||
status: todo
|
status: done
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "e15a9ada-263a-4fce-8975-b5d88b9ac08a"
|
state_hub_task_id: "e15a9ada-263a-4fce-8975-b5d88b9ac08a"
|
||||||
```
|
```
|
||||||
|
|
||||||
`evidence/CB-EV-*.md`. **Did the engine's rules match the edition's?**
|
`evidence/CB-EV-*.md`. **Did the engine's rules match the edition's?**
|
||||||
Say so either way, per rule, not as a count.
|
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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue