CB-WP-0029: the tokens on the table — declare and register
Some checks failed
ci / check (push) Has been cancelled
Some checks failed
ci / check (push) Has been cancelled
Declaration 12 of chaos window 2, which CLOSES IT. Structural M (imports another edition file under AM-4's budgets), chaos d8=4, no override. Tokens.csv turns out to carry more than names. Every token has a `quantity` -- 6 Protection, 5 Denied, 12 relation links -- and a component count is a limit a simulation does not have unless it is told. protection is saturating_add(1) at lib.rs:986 with no upper bound, against an edition that ships six tokens for six players. T03 measures whether that matters rather than assuming either way. And `sides` is the second interesting column: Freedom and Focus/Blame are each ONE DOUBLE-SIDED TOKEN, 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. T03 is shaped against a specific error: whatever it finds is a FINDING, not a fix. A component limit the rules do not state is underdetermined and belongs to ground-game, and 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. The workplan also names the window-2 verdict as DUE. Its retirement condition was untestable throughout -- eleven declarations, zero 8s, zero overrides -- and recording that is a change to how the loop constrains itself, so it is its own tier-M pass rather than a task here. Named so it is not lost between passes, which is how the ten rulings went uncollected. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
51efe55d14
commit
cf52e6bcbf
3 changed files with 373 additions and 40 deletions
|
|
@ -8,7 +8,7 @@ ruled: ''
|
||||||
ruled_by: ''
|
ruled_by: ''
|
||||||
ruled_note: ''
|
ruled_note: ''
|
||||||
encodes_u_item: ''
|
encodes_u_item: ''
|
||||||
seed: 2
|
seed: 3
|
||||||
setup:
|
setup:
|
||||||
players: 3
|
players: 3
|
||||||
preset: standard-3p
|
preset: standard-3p
|
||||||
|
|
@ -17,18 +17,18 @@ commands:
|
||||||
- actor: P1
|
- actor: P1
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: SOLVE
|
action: INVESTIGATE
|
||||||
problem: 1
|
problem: 2
|
||||||
- actor: P2
|
- actor: P2
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: SOLVE
|
action: INVESTIGATE
|
||||||
problem: 1
|
problem: 2
|
||||||
- actor: P3
|
- actor: P3
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: SOLVE
|
action: INVESTIGATE
|
||||||
problem: 1
|
problem: 2
|
||||||
- actor: SYSTEM
|
- actor: SYSTEM
|
||||||
cmd: reveal
|
cmd: reveal
|
||||||
args: {}
|
args: {}
|
||||||
|
|
@ -41,18 +41,18 @@ commands:
|
||||||
- actor: P1
|
- actor: P1
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: INVESTIGATE
|
action: SOLVE
|
||||||
problem: 2
|
problem: 2
|
||||||
- actor: P2
|
- actor: P2
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: INVESTIGATE
|
action: SOLVE
|
||||||
problem: 2
|
problem: 2
|
||||||
- actor: P3
|
- actor: P3
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: INVESTIGATE
|
action: SOLVE
|
||||||
problem: 2
|
problem: 1
|
||||||
- actor: SYSTEM
|
- actor: SYSTEM
|
||||||
cmd: reveal
|
cmd: reveal
|
||||||
args: {}
|
args: {}
|
||||||
|
|
@ -68,39 +68,15 @@ commands:
|
||||||
action: INVESTIGATE
|
action: INVESTIGATE
|
||||||
problem: 3
|
problem: 3
|
||||||
- actor: P2
|
- 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
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: INVESTIGATE
|
action: INVESTIGATE
|
||||||
problem: 4
|
problem: 3
|
||||||
- actor: P2
|
|
||||||
cmd: select_action
|
|
||||||
args:
|
|
||||||
action: INVESTIGATE
|
|
||||||
problem: 4
|
|
||||||
- actor: P3
|
- actor: P3
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: INVESTIGATE
|
action: INVESTIGATE
|
||||||
problem: 4
|
problem: 3
|
||||||
- actor: SYSTEM
|
- actor: SYSTEM
|
||||||
cmd: reveal
|
cmd: reveal
|
||||||
args: {}
|
args: {}
|
||||||
|
|
@ -119,11 +95,11 @@ commands:
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: SOLVE
|
action: SOLVE
|
||||||
problem: 4
|
problem: 3
|
||||||
- actor: P3
|
- actor: P3
|
||||||
cmd: select_action
|
cmd: select_action
|
||||||
args:
|
args:
|
||||||
action: SOLVE
|
action: INVESTIGATE
|
||||||
problem: 4
|
problem: 4
|
||||||
- actor: SYSTEM
|
- actor: SYSTEM
|
||||||
cmd: reveal
|
cmd: reveal
|
||||||
|
|
@ -134,8 +110,40 @@ commands:
|
||||||
- actor: SYSTEM
|
- actor: SYSTEM
|
||||||
cmd: end_round
|
cmd: end_round
|
||||||
args: {}
|
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:
|
expect:
|
||||||
events: []
|
events: []
|
||||||
state: {}
|
state: {}
|
||||||
rejects: []
|
rejects: []
|
||||||
state_hash: 12e812982e92dde5e91147dfd67befb8552831c30e3053cfc5cdc5133d025d57
|
state_hash: 4d108b2c07eaa63815cf9b320619c175e78317c696a8d01b1b3ac350d430b95d
|
||||||
|
|
|
||||||
149
trials/2026-08-06-2252.yaml
Normal file
149
trials/2026-08-06-2252.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: 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
|
||||||
176
workplans/CB-WP-0029-the-tokens-on-the-table.md
Normal file
176
workplans/CB-WP-0029-the-tokens-on-the-table.md
Normal file
|
|
@ -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.**
|
||||||
Loading…
Add table
Add a link
Reference in a new issue