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-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 |
|
||||
|
|
|
|||
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) |
|
||||
| `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
|
||||
|
|
|
|||
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 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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
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
|
||||
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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue