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

@ -215,6 +215,6 @@
| 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-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-T04 | todo | — | workplans/CB-WP-0037-the-fourteen-unread-files.md |

View 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 05 state track that constrains action choice and triggers DARVO at 5.
Surface Problem,The Scenario's starting visible Problem.
1 term definition
2 Action One reusable card selected by each player every round: Investigate, Solve, Support, Attack, or GROUND.
3 Blame The reverse side of a Focus token. It is worth −1 personal point and can be removed by GROUND—ND.
4 Bond A symmetric supportive relation occupying one relation slot for each player.
5 DARVO A binding three-stage defensive reflex: Deny, Attack, Reverse.
6 Denied Problem A previously visible Problem turned face down by Deny. It cannot be investigated or solved until restored.
7 Freedom A one-use token that permits any Action at Stress 4 or 5.
8 Focus The front of a player's Focus/Blame token, placed on the target during the DARVO Attack stage.
9 GROUND The only constructive practice in the core set, offering Ground & Restate, Observe & Uphold, or Name & Decide.
10 Lead The rotating marker that breaks ties when multiple effects of the same type resolve.
11 Problem A Surface or Hidden issue that must be visible and matched with the correct Solution suit.
12 Protection A token gained through Reverse that cancels the next Attack against its holder.
13 Relation slot One of two player capacities for holding a Bond or Rivalry.
14 Rivalry A symmetric conflict relation occupying one slot for each player and amplifying Attack.
15 Stress A 0–5 state track that constrains action choice and triggers DARVO at 5.
16 Surface Problem The Scenario's starting visible Problem.

View file

@ -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) |
| `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 |
| `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
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
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`,
`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
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 0afb882dc8001f03bc48a152c9d8c36ad492ceeff2d30ef6a3a690937317f77b DARVO.csv
sha256 d06924a19f805feb9e2557fd5c06254ae2054e1f865265f45c26eb293f53bf12 Glossary.csv
sha256 565431571bc06adafb67edefd4b368839b6b94134c2289877384688cc643390b Modes.csv
sha256 ad2bfbf897bbb3878691cbdbfec739adc58d28cad3923a989dd46b426cce1395 Player_Mats.csv
sha256 0a04830c93b62dcb2f4411a9fbde576368a7427fe9e63c5015e606e4d42d23a0 Problems.csv
sha256 cd84c3b131c1b7a541e9e42529fdce2b7911f0832cce8c50cfcb8462d01dc551 Relations.csv
sha256 f830de9ca44417a7510e04a39ea24a070a81969b33a31fa68361fba132ad40cd Scenarios.csv

View 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 03 choose any action. At Stress 45 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 03 choose any action. At Stress 45 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 03 choose any action. At Stress 45 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 03 choose any action. At Stress 45 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 03 choose any action. At Stress 45 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 03 choose any action. At Stress 45 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"
1 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
2 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
3 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
4 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
5 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
6 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
7 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

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.

View file

@ -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 RELATIONS_CSV: &str = include_str!("../../../editions/ground-darvo-r0/Relations.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.
///
@ -502,6 +504,42 @@ pub fn scenarios() -> Result<Vec<ScenarioText>, String> {
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).
#[derive(Debug, Clone)]
pub struct RelationText {
@ -667,6 +705,8 @@ mod card_text_tests {
let _ = darvo_stages();
let _ = relations();
let _ = scenarios();
let _ = choice_rule();
let _ = glossary();
let files = [
("Problems.csv", CSV),
@ -677,6 +717,8 @@ mod card_text_tests {
("DARVO.csv", DARVO_CSV),
("Relations.csv", RELATIONS_CSV),
("Scenarios.csv", SCENARIOS_CSV),
("Player_Mats.csv", PLAYER_MATS_CSV),
("Glossary.csv", GLOSSARY_CSV),
];
let mut report = String::new();
let mut total_unread = 0usize;
@ -708,6 +750,52 @@ mod card_text_tests {
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.
///
/// `GroundState::threshold` is a `match` returning 5/7/9;

View file

@ -21,7 +21,10 @@ made once.
| O1 | hand order | 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 |
| 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 -->
@ -55,12 +58,47 @@ made once.
- **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
discipline holds, and `Player_Mats` and `Glossary` — which carry exactly
this — are still unvendored (F18).
discipline holds.
**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
perception and is the reason this is `provisional` rather than `rule`.
**Nothing may be declared about these files until they are read.**
perception.
**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

View file

@ -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
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 03 choose any action. At Stress 45 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
ceremonial — card stock, a typeface, the drift of a discard, how legible a
player mat is. **`ornamentation` covers the material and the ceremonial
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
uses "decoration" for a control that cannot fail (ADR-0006 D3), and that

149
trials/2026-08-08-0019.yaml Normal file
View 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

View file

@ -2,7 +2,7 @@
id: CB-WP-0037
kind: product
title: "The fourteen unread files"
status: active
status: done
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
id: CB-WP-0037-T03
status: todo
status: done
priority: medium
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
`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: todo
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.