diff --git a/trials/2026-08-06-2230.yaml b/trials/2026-08-06-2230.yaml index 195eeda..8d59a81 100644 --- a/trials/2026-08-06-2230.yaml +++ b/trials/2026-08-06-2230.yaml @@ -8,7 +8,7 @@ ruled: '' ruled_by: '' ruled_note: '' encodes_u_item: '' -seed: 2 +seed: 3 setup: players: 3 preset: standard-3p @@ -17,18 +17,18 @@ commands: - actor: P1 cmd: select_action args: - action: SOLVE - problem: 1 + action: INVESTIGATE + problem: 2 - actor: P2 cmd: select_action args: - action: SOLVE - problem: 1 + action: INVESTIGATE + problem: 2 - actor: P3 cmd: select_action args: - action: SOLVE - problem: 1 + action: INVESTIGATE + problem: 2 - actor: SYSTEM cmd: reveal args: {} @@ -41,18 +41,18 @@ commands: - actor: P1 cmd: select_action args: - action: INVESTIGATE + action: SOLVE problem: 2 - actor: P2 cmd: select_action args: - action: INVESTIGATE + action: SOLVE problem: 2 - actor: P3 cmd: select_action args: - action: INVESTIGATE - problem: 2 + action: SOLVE + problem: 1 - actor: SYSTEM cmd: reveal args: {} @@ -68,39 +68,15 @@ commands: action: INVESTIGATE problem: 3 - actor: P2 - cmd: select_action - args: - action: SOLVE - problem: 2 -- 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: INVESTIGATE - problem: 4 -- actor: P2 - cmd: select_action - args: - action: INVESTIGATE - problem: 4 + problem: 3 - actor: P3 cmd: select_action args: action: INVESTIGATE - problem: 4 + problem: 3 - actor: SYSTEM cmd: reveal args: {} @@ -119,11 +95,11 @@ commands: cmd: select_action args: action: SOLVE - problem: 4 + problem: 3 - actor: P3 cmd: select_action args: - action: SOLVE + action: INVESTIGATE problem: 4 - actor: SYSTEM cmd: reveal @@ -134,8 +110,40 @@ commands: - actor: SYSTEM cmd: end_round args: {} +- actor: P1 + cmd: select_action + args: + action: SUPPORT + target: P2 +- 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: P1 + cmd: respond_to_support + args: + response: accept_bond +- actor: P2 + 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: 12e812982e92dde5e91147dfd67befb8552831c30e3053cfc5cdc5133d025d57 + state_hash: 4d108b2c07eaa63815cf9b320619c175e78317c696a8d01b1b3ac350d430b95d diff --git a/trials/2026-08-06-2252.yaml b/trials/2026-08-06-2252.yaml new file mode 100644 index 0000000..ac1c054 --- /dev/null +++ b/trials/2026-08-06-2252.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: 2 +- 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: 3 +- actor: P2 + cmd: select_action + args: + action: SOLVE + problem: 3 +- actor: P3 + cmd: select_action + args: + action: SOLVE + problem: 4 +- actor: SYSTEM + cmd: reveal + args: {} +- actor: SYSTEM + cmd: resolve + args: {} +- actor: SYSTEM + cmd: end_round + args: {} +- actor: P1 + cmd: select_action + args: + action: SUPPORT + target: P2 +- 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: P1 + cmd: respond_to_support + args: + response: accept_bond +- actor: P2 + 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: 15e28280a256249f4ebddbeb638053d0683d996b7ff1193128a7d788f32f63ec diff --git a/workplans/CB-WP-0029-the-tokens-on-the-table.md b/workplans/CB-WP-0029-the-tokens-on-the-table.md new file mode 100644 index 0000000..9af86ed --- /dev/null +++ b/workplans/CB-WP-0029-the-tokens-on-the-table.md @@ -0,0 +1,176 @@ +--- +id: CB-WP-0029 +kind: product +title: "The tokens on the table: components you can count, and a supply the engine may not respect" +status: ready +--- + +# Purpose + +``` +structural tier M (imports another edition file under AM-4's budgets and + touches the rendering the coverage gate is written + against) +chaos d8 = 4 → no override +declared tier M +``` + +**Declaration 12 of chaos window 2 — the last.** The window closes with +this pass and its verdict is due; see §The window closes here. + +## The ask + +> *"Let's do the token objects first."* + +The engine models every token correctly. It shows them as **numbers on a +seat card** — `protect 2`, `blamed by P3`, `freedom READY`. A real table +has objects you count at a glance. + +## What `Tokens.csv` turns out to carry + +Nine token types, and the columns are more interesting than the names: + +| token | qty | sides | what the engine has | +|---|---:|---|---| +| Stress marker | 6 | Single | `stress: u8` — a marker on a 0–5 track | +| Freedom | 6 | **Double** (READY/spent) | `freedom_ready: bool` | +| DARVO stage | 6 | Single | `darvo: DarvoStage` on an OFF/DENY/ATTACK/REVERSE track | +| Relation link | **12** | Single | *"two per player"* — GR-L01's two slots | +| Focus / Blame | 6 | **Double** (FOCUS/BLAME) | `focus` map **and** `blame_from` list | +| Protection | 6 | Single | `protection: u8` | +| Denied | **5** | Single | `denied: bool` per Problem | +| Lead | 1 | Single | `lead: PlayerId` | +| Round | 1 | Single | `round: u8` | + +**`quantity` is a component limit, and a simulation does not have one +unless it is told.** `protection` is `saturating_add(1)` at `lib.rs:986` +with **no upper bound** — the edition ships six Protection tokens for up +to six players. T03 is about whether that matters. + +**`sides` is the second interesting column.** Freedom and Focus/Blame are +*one double-sided token each*, not two states. The engine holds Focus in a +map and Blame in a list; whether those can disagree with a single physical +token is worth checking. + +## The window closes here + +Window 2 opened 2026-08-03 at d8 and runs to twelve declarations. **This is +the twelfth.** + +Its retirement condition — *retire if an override changes nothing twice +running* — has been **untestable throughout**: eleven declarations, zero +8s, zero overrides. CB-EV-0024, CB-EV-0025 and CB-EV-0026 each said so. + +**Recording the verdict is a change to how the loop constrains itself and +is therefore its own tier-M pass**, not a task here. This workplan names +it as due so it is not lost between passes, which is how the ten rulings +went uncollected. + +## Task: decide what a token is, here + +```task +id: CB-WP-0029-T01 +status: todo +priority: high +``` + +`decisions/ADR-0016-*.md` (tier M merges survey and decision). + +- **Vendor `Tokens.csv`?** ADR-0015's test applies: does it carry text a + player reads? `front_text` (READY, DENIED, PROTECTION…) and `use` do. + `shape` and `size` are print instructions and do not. +- **What is a token in the renderer?** The engine has no `Token` type and + should probably not gain one: a token is a *view* of state the aggregate + already holds. Deciding otherwise means a second source of truth for + Stress. +- **Where do they sit?** Player tokens belong with their seat; Denied + belongs on its Problem; Lead and Round belong on the table. **The + overhead view is what makes that placement meaningful** — a token + drawn in a list is a number with a picture. +- **Does `quantity` bind?** The decision T03 needs: is the component count + a rule the engine must enforce, an artifact of physical production, or + undetermined? **Do not answer it here from taste** — T03 measures first. + +## Task: tokens as objects + +```task +id: CB-WP-0029-T02 +status: todo +priority: high +``` + +Draw them, on the table built in CB-WP-0028. + +- **Stress on a 0–5 track**, not the number `5`. The track is the thing + that makes "one more Attack and I trigger DARVO" visible before it + happens. +- **DARVO on its OFF→DENY→ATTACK→REVERSE track**, which is the game's + namesake mechanic and currently the least visible thing on the page. +- **Freedom as a two-sided disc** — READY or spent, using the edition's own + `front_text`. +- **Protection, Blame and Focus as counted objects** by their seat. +- **Denied on its Problem**, not as the word `denied` in a corner. + +**Controls:** +- **every existing coverage probe still passes.** They name facts, and + CB-WP-0027 and CB-WP-0028 both showed a fact-naming probe survives a + reflow. A third confirmation is worth having; +- **the token text comes from the edition**, asserted as a substring of + the vendored file — the rule ADR-0015 established and the thing that + stops a hand-copied label drifting; +- a seat with **no** tokens renders as a seat with no tokens, not as a + seat missing its area. The empty case is the one that silently vanishes. + +## Task: does the engine respect the supply? + +```task +id: CB-WP-0029-T03 +status: todo +priority: high +``` + +**Measure before deciding.** For each token with a `quantity`, ask whether +the aggregate can exceed it: + +- **Protection (6)** — `saturating_add(1)` with no bound. Can one seat + hold three? Can the table hold seven? **Write the check, run it, report + the number.** +- **Denied (5)** — five tokens, and a scenario deals at most five + Problems. Probably safe; *probably* is not an answer. +- **Relation links (12, two per player)** — GR-L01 enforces two slots, so + this one is likely already respected. Confirm rather than assume. +- **Focus/Blame (6, double-sided)** — one token per player that flips. + Can a seat hold Focus *and* have Blame from the same source at once? If + so, the model and the component disagree. + +**Whatever this finds is a finding, not a fix.** A component limit the +rules do not state is `underdetermined` and belongs to `ground-game`; the +engine must not start enforcing a bound nobody ruled. **CB-WP-0023 exists +because SOLVE was offered where it could not act** — inventing a limit is +the same error in the other direction. + +**Controls:** +- each answer is a runnable check, per GameDesign §1 — a claim about the + supply is arithmetic and needs its reproduction; +- **the register gets a row per token that can exceed its quantity**, or a + stated "none found", because a survey that reports nothing and leaves no + trace is indistinguishable from one that was not run. + +## Task: evidence + +```task +id: CB-WP-0029-T04 +status: todo +priority: medium +``` + +`evidence/CB-EV-0027-*.md`. + +- **Whether the supply is exceeded**, with the numbers. +- **Whether the tracks changed what the maintainer could see coming** — + the Stress track exists so a player can see DARVO approaching, and that + is a claim about play, not about pixels. +- **What the reflow cost the coverage gate**, third data point. +- **The window-2 verdict is due** (§The window closes here) — name it as + outstanding if the closing pass has not run. +- **Quote CB-WP-0028's cost by re-running the instrument.**