From 627992bc8581a5d07ff9a71f1f8216dbf78a5b08 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sat, 8 Aug 2026 00:33:24 +0200 Subject: [PATCH] CB-WP-0037 done: T03 classification and T04 evidence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- WORK-RECORDS.md | 2 +- editions/ground-darvo-r0/Glossary.csv | 16 ++ editions/ground-darvo-r0/PROVENANCE.md | 15 +- editions/ground-darvo-r0/Player_Mats.csv | 7 + .../CB-EV-0029-the-fourteen-unread-files.md | 136 ++++++++++++++++ games/ground/src/edition.rs | 88 +++++++++++ specs/OrnamentRegister.md | 48 +++++- specs/Ornamentation.md | 22 ++- trials/2026-08-08-0019.yaml | 149 ++++++++++++++++++ .../CB-WP-0037-the-fourteen-unread-files.md | 26 ++- 10 files changed, 497 insertions(+), 12 deletions(-) create mode 100644 editions/ground-darvo-r0/Glossary.csv create mode 100644 editions/ground-darvo-r0/Player_Mats.csv create mode 100644 evidence/CB-EV-0029-the-fourteen-unread-files.md create mode 100644 trials/2026-08-08-0019.yaml diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index 9626bb1..31e8883 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -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 | diff --git a/editions/ground-darvo-r0/Glossary.csv b/editions/ground-darvo-r0/Glossary.csv new file mode 100644 index 0000000..126758d --- /dev/null +++ b/editions/ground-darvo-r0/Glossary.csv @@ -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. diff --git a/editions/ground-darvo-r0/PROVENANCE.md b/editions/ground-darvo-r0/PROVENANCE.md index 8cb861d..4ae96da 100644 --- a/editions/ground-darvo-r0/PROVENANCE.md +++ b/editions/ground-darvo-r0/PROVENANCE.md @@ -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 diff --git a/editions/ground-darvo-r0/Player_Mats.csv b/editions/ground-darvo-r0/Player_Mats.csv new file mode 100644 index 0000000..cd35589 --- /dev/null +++ b/editions/ground-darvo-r0/Player_Mats.csv @@ -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" diff --git a/evidence/CB-EV-0029-the-fourteen-unread-files.md b/evidence/CB-EV-0029-the-fourteen-unread-files.md new file mode 100644 index 0000000..c1c6809 --- /dev/null +++ b/evidence/CB-EV-0029-the-fourteen-unread-files.md @@ -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. diff --git a/games/ground/src/edition.rs b/games/ground/src/edition.rs index d893dff..3e6c753 100644 --- a/games/ground/src/edition.rs +++ b/games/ground/src/edition.rs @@ -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, 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 { + let t = Table::parse(PLAYER_MATS_CSV, "Player_Mats.csv")?; + let mut seen: Option = 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, 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; diff --git a/specs/OrnamentRegister.md b/specs/OrnamentRegister.md index 6c799ba..ec8d91f 100644 --- a/specs/OrnamentRegister.md +++ b/specs/OrnamentRegister.md @@ -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 | @@ -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 diff --git a/specs/Ornamentation.md b/specs/Ornamentation.md index e8dca42..2dcd1d8 100644 --- a/specs/Ornamentation.md +++ b/specs/Ornamentation.md @@ -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 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 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 diff --git a/trials/2026-08-08-0019.yaml b/trials/2026-08-08-0019.yaml new file mode 100644 index 0000000..5255f3a --- /dev/null +++ b/trials/2026-08-08-0019.yaml @@ -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 diff --git a/workplans/CB-WP-0037-the-fourteen-unread-files.md b/workplans/CB-WP-0037-the-fourteen-unread-files.md index 855e691..bdb94a3 100644 --- a/workplans/CB-WP-0037-the-fourteen-unread-files.md +++ b/workplans/CB-WP-0037-the-fourteen-unread-files.md @@ -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.