Some checks failed
ci / check (push) Failing after 3s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
286 lines
11 KiB
Markdown
286 lines
11 KiB
Markdown
---
|
||
id: CB-WP-0028
|
||
kind: product
|
||
title: "The table you sit at: the cards' own words, an overhead view, and a game you solve rather than survive"
|
||
status: ready
|
||
state_hub_workstream_id: "d37c8671-54e4-447f-af64-56f482483282"
|
||
---
|
||
|
||
# Purpose
|
||
|
||
```
|
||
structural tier M (imports more of the authoritative edition, which is
|
||
an external dataset under AM-4's budgets, and touches
|
||
the rendering the coverage gate is written against)
|
||
chaos d8 = 1 → no override
|
||
declared tier M
|
||
```
|
||
|
||
Declaration 11 of chaos window 2. Tier M: survey and decision merged;
|
||
adversarial review optional.
|
||
|
||
## Nine observations from play
|
||
|
||
The maintainer played with the new meta panel and reported nine things.
|
||
**Two are findings about the game, seven are about the engine**, and the
|
||
split matters because they go to different places.
|
||
|
||
| # | observation | where it goes |
|
||
|---|---|---|
|
||
| 1 | no incentive to attack while holding positive cards | **register** — a game-design finding |
|
||
| 2 | *"I don't understand the GROUND card"* | **here** — and it is not a design gap (below) |
|
||
| 3 | overhead view: players around a table, stacks on it | T03 |
|
||
| 4 | click the draw stack to take cards | T04 |
|
||
| 5 | optional auto-draw | T04 |
|
||
| 6 | play again / stop belong in the meta column | T05 |
|
||
| 7 | so does the full log | T05 |
|
||
| 8 | *"Game over"* is wrong when you won | T06 |
|
||
| 9 | rankings — MVP, most problems solved | T07 |
|
||
|
||
## Observation 2 is a data-import gap, and it reframes the pass
|
||
|
||
*"I don't understand the GROUND card or why other cards should be played
|
||
to the table"* reads as a design problem. It is not. **The card explains
|
||
itself in the dataset and we never imported the explanation.**
|
||
|
||
`ground-game/editions/*/Actions.csv`, the GROUND row:
|
||
|
||
> **tagline:** *"Regulate. Restore the frame. Decide."*
|
||
> **rules_text:** *"After all actions are revealed, choose one mode:
|
||
> GR—Ground & Restate: −2 Stress, ready Freedom… OU—Observe & Uphold…"*
|
||
|
||
**We vendored one file of nineteen.** `editions/ground-darvo-r0/` holds
|
||
`Problems.csv` and nothing else; `Actions`, `Solutions`, `Modes`,
|
||
`Scenarios`, `Relations`, `DARVO`, `Tokens`, `Glossary` and the rest live
|
||
only in `ground-game`. Everything the engine knows about them is a
|
||
**hand-transcription into `GroundRules.md`'s 59 numbered rules** — which
|
||
is enough to *play* the game and gives a player nothing to *read*.
|
||
|
||
So the page shows `Clarify` where the card says **"Ask What Happened —
|
||
Invite a concrete account before judging."**
|
||
|
||
**This is the most valuable thing in the pass**, and it was found by a
|
||
player saying he did not understand something rather than by any gate.
|
||
Rule coverage is 59/59 and has been for weeks.
|
||
|
||
## Task: decide what else to import, and what it costs
|
||
|
||
```task
|
||
id: CB-WP-0028-T01
|
||
status: todo
|
||
priority: high
|
||
state_hub_task_id: "17e6f38c-1903-4bb2-aa20-37e76c8fc4e0"
|
||
```
|
||
|
||
`decisions/ADR-0015-*.md` (tier M merges survey and decision).
|
||
|
||
**ADR-0011 is the precedent and it constrains this.** It vendored
|
||
`Problems.csv` with a checked digest and a ~50-line hand reader, and
|
||
**refused the `csv` crate on proportion** — 17,651 lines against AM-4b's
|
||
19,742 of remaining headroom, 89% of the budget to read 20 rows.
|
||
|
||
Decide:
|
||
|
||
- **which files**, and the answer is not "all of them". `Actions`,
|
||
`Solutions` and `Modes` carry text a player reads. `BOM`, `Print_Manifest`,
|
||
`Back_Designs`, `Symbols` are production artifacts for a physical print
|
||
run and have no business here.
|
||
- **whether the hand reader survives contact.** `Solutions.csv` has
|
||
`microcopy` and `rules_text` — prose fields with commas, quotes and
|
||
possibly embedded newlines. ADR-0011 named exactly this as the revisit
|
||
condition: *"nested quoting, embedded newlines, multiple dialects."*
|
||
**If the reader cannot parse them correctly, say so and re-run the
|
||
dependency argument rather than writing a fragile parser.**
|
||
- **what happens when text and rules disagree.** `GroundRules.md` was
|
||
derived by hand from these files. If a `rules_text` contradicts a
|
||
numbered rule, that is a **finding**, and it goes to the register — not
|
||
a quiet edit of either.
|
||
- **`Extensions.csv` exists** and names content deliberately outside the
|
||
core. Decide whether it is imported at all; the answer is probably no,
|
||
but *"we did not know it existed"* must not be the reason.
|
||
|
||
## Task: the cards say what they do
|
||
|
||
```task
|
||
id: CB-WP-0028-T02
|
||
status: todo
|
||
priority: high
|
||
state_hub_task_id: "aa4453d2-a84e-4afc-8534-1feb835c4d5b"
|
||
```
|
||
|
||
Every card a player can see carries its own title, tagline and rules text,
|
||
from the edition — not from a phrase we invented.
|
||
|
||
- action cards: GROUND, SOLVE, INVESTIGATE, SUPPORT, ATTACK;
|
||
- Solution cards: the title and microcopy, not just the suit;
|
||
- the mode in play, with its own description.
|
||
|
||
**Controls:**
|
||
- **a test asserts the text comes from the dataset**, not from a Rust
|
||
literal — the whole point is that the game's own words reach the player,
|
||
and a hand-copied string drifts from the source it copies;
|
||
- the drag affordance still works: the explanation is *additional*, and
|
||
CB-WP-0020 T02 already found that replacing a label with an explanation
|
||
loses the label;
|
||
- **the page stays readable.** Five action cards with full rules text is a
|
||
wall; the tagline is the default and the rules text is on demand.
|
||
|
||
## Task: an overhead view of a real table
|
||
|
||
```task
|
||
id: CB-WP-0028-T03
|
||
status: todo
|
||
priority: high
|
||
state_hub_task_id: "2ff677ac-80ff-4618-ad7c-05b62c8f80c8"
|
||
```
|
||
|
||
> *"Players sitting around the table, the draw and discard stacks on it.
|
||
> An overhead view of a game table would instantly help with understanding
|
||
> what is going on."*
|
||
|
||
The seats become positions around a table rather than a row of cards; the
|
||
Problems, draw and discard sit in the middle; each seat's played card
|
||
appears in front of that seat.
|
||
|
||
**This subsumes `relations_svg`**, which already places seats on a circle
|
||
for the relationship graph — so the layout exists and is drawn twice, once
|
||
as a circle and once as a row. **One table, not two diagrams.**
|
||
|
||
**Controls:**
|
||
- the coverage gate still passes: every view field appears in the parsed
|
||
document. CB-WP-0027 showed a reflow costs nothing when probes name
|
||
facts; this is a bigger reflow and the same rule applies;
|
||
- **the viewer's own seat is identifiable at a glance** — a table where
|
||
you cannot find yourself is worse than a list;
|
||
- 2 through 6 seats all lay out without overlap, asserted per seat count
|
||
rather than eyeballed at 3.
|
||
|
||
## Task: take cards from the stack, or let the table do it
|
||
|
||
```task
|
||
id: CB-WP-0028-T04
|
||
status: todo
|
||
priority: medium
|
||
state_hub_task_id: "1106c60e-112b-401f-b854-eeec566ef3d1"
|
||
```
|
||
|
||
Observations 4 and 5. Clicking the draw stack to take a card is the
|
||
natural gesture; auto-draw is for when that stops being interesting.
|
||
|
||
**Both are subject to a rule the engine already has.** Drawing is not a
|
||
free action — GR-A01 draws a Solution as part of INVESTIGATE, and the deck
|
||
is not a thing a player may simply take from. **So this task must first
|
||
establish whether "click to draw" is a legal move at all**, and if it is
|
||
not, it is a **finding for `ground-game`**, not a feature: the maintainer
|
||
expected an interaction the rules do not offer, and that gap is the
|
||
signal.
|
||
|
||
**Do not implement a draw the rules do not have.** CB-WP-0023 exists
|
||
because SOLVE was offered where it could not act.
|
||
|
||
**Controls:**
|
||
- the answer to *"is clicking the deck a legal move?"* is in the task
|
||
record with the rule that settles it;
|
||
- auto-draw changes no outcome — a game played with it and without it from
|
||
the same seed produces the same end-state hash, or it is not automation
|
||
but a rules change.
|
||
|
||
## Task: the meta column takes the controls and the log
|
||
|
||
```task
|
||
id: CB-WP-0028-T05
|
||
status: todo
|
||
priority: medium
|
||
state_hub_task_id: "6c78e44e-38fc-451b-b1a0-205b1d079ca0"
|
||
```
|
||
|
||
Observations 6 and 7. `play again` and `end session` move to the meta
|
||
column, and the ending page gets the same two-column shape as the table —
|
||
it currently has none.
|
||
|
||
The full log belongs there too, which CB-WP-0027 did for the live page and
|
||
not for the ending page.
|
||
|
||
**Controls:**
|
||
- CB-WP-0024 T01's seal still works: acknowledging the end must still
|
||
remove every control, wherever they now live;
|
||
- the ending page's existing tests pass unchanged or the change is a
|
||
regression.
|
||
|
||
## Task: a game you solve
|
||
|
||
```task
|
||
id: CB-WP-0028-T06
|
||
status: todo
|
||
priority: medium
|
||
state_hub_task_id: "df0a967e-636b-4fe5-9926-4d73030a87d7"
|
||
```
|
||
|
||
> *"'Game Over' is negative and should only be used for lost games. If the
|
||
> players won, let's use 'Game solved'."*
|
||
|
||
**Right, and it is more than tone.** GROUND is a co-operative game about
|
||
repairing a situation; `group_success` means the table *solved* something.
|
||
"Game over" is arcade vocabulary for a failure state, and using it for a
|
||
win tells the player the wrong thing about what they just did.
|
||
|
||
**Controls:**
|
||
- the heading is a function of `outcome.group_success`, asserted **both
|
||
ways** — a test that only checks the win case passes for a page that
|
||
always says "solved";
|
||
- the no-outcome case (a game that ended badly) keeps its own wording and
|
||
claims neither.
|
||
|
||
## Task: who did what — rankings that are not invented
|
||
|
||
```task
|
||
id: CB-WP-0028-T07
|
||
status: todo
|
||
priority: medium
|
||
state_hub_task_id: "ad6e6f6f-e531-494c-b8a9-18dfdd14681c"
|
||
```
|
||
|
||
> *"A ranking of players in the final stats. 'Most valuable player', 'most
|
||
> problems solved' and other conditions that might apply."*
|
||
|
||
`OutcomeView` already carries `personal`, `winners`, `coalitions` and
|
||
`mastery`, and the aggregate knows who claimed each Problem.
|
||
|
||
**The risk is inventing scoring the game does not have.** *"Most problems
|
||
solved"* is countable from `claimed_by` and is a fact. *"Most valuable
|
||
player"* is a **judgement**, and any formula for it is a rule we made up.
|
||
|
||
So: **report what the game counts, and mark anything derived as ours.**
|
||
A superlative computed from real data is fine; a superlative presented as
|
||
if the rules defined it is the same defect as a provisional default
|
||
silently canonised.
|
||
|
||
**Controls:**
|
||
- every ranking names its source: a rule id, or *"clay-borg's reading"*;
|
||
- ties are handled and shown as ties, not broken arbitrarily — `Modes.csv`
|
||
has a `scoring_tiebreak` column, so the game may already say how;
|
||
- a ranking that no seat leads (nobody solved anything) renders as that,
|
||
not as an empty list.
|
||
|
||
## Task: evidence
|
||
|
||
```task
|
||
id: CB-WP-0028-T08
|
||
status: todo
|
||
priority: medium
|
||
state_hub_task_id: "a20a529e-0edf-49cc-9c80-7dba3b76cff5"
|
||
```
|
||
|
||
`evidence/CB-EV-0026-*.md`.
|
||
|
||
- **Whether importing the card text changed what the maintainer
|
||
understood** — observation 2 is the acceptance test and it has a person
|
||
attached to it.
|
||
- **Whether any `rules_text` contradicted `GroundRules.md`.** Nineteen
|
||
files were hand-transcribed into 59 rules; if the import surfaces a
|
||
disagreement, that is the most valuable output of this pass.
|
||
- **Whether "click the deck to draw" was legal**, and if not, what went to
|
||
`ground-game`.
|
||
- **What the overhead view cost the coverage gate**, against CB-WP-0027's
|
||
finding that a probe naming a fact survives a reflow.
|
||
- **Quote CB-WP-0027's cost by re-running the instrument.**
|