CB-WP-0028 T01/T02: the cards say what they do
ADR-0015 and the import. F18's fix: "I don't understand the GROUND card" was never a design gap -- the card explains itself in the edition and we never imported the explanation. THE MEASUREMENT IS THE DECISION, and the gap is bigger than "one file of nineteen". Of the file we DID vendor, the engine reads 5 of 13 columns: title, problem_text, front_rules, reveal_effect and unresolved_effect were discarded at parse time. The cheapest part of this pass costs no new bytes and was sitting in the repo for eight days. And SCN_01 is hardcoded at lib.rs:1824 -- the edition ships FOUR scenarios and the engine has never dealt three of them. Nobody had said so. ADR-0011's revisit condition is measurably absent, so the dependency argument does not get re-run: across Actions, Solutions, Modes and Scenarios there are ZERO doubled quotes and ZERO embedded newlines. The hand reader's only job is comma-in-quoted-field, which it already did. Refusing csv on a measurement rather than on a preference. Vendored Actions, Solutions and Modes -- the text a player reads. Not the production artifacts (BOM, Print_Manifest, Back_Designs, Symbols). NOT 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. It is now known to exist, which was the real risk. One Table reader with four callers, because a per-file copy is how a parser acquires four subtly different bugs. The GROUND card now shows "Regulate. Restore the frame. Decide." with its GR/OU/ND text on demand; Problems show their own titles where a priority number used to be. The load-bearing test asserts the text is a SUBSTRING OF THE VENDORED FILE rather than equal to a Rust literal -- a test comparing against a hardcoded expectation would pass for a hand-copied string, which is the drift this ends. `edition` came out from behind #[cfg(feature = "scenarios")]. It was gated because its only consumer was; the edition is the game's own data and the shipped runtime now reads it. Test machinery and game content are different things and only one of them is optional. And edition-check was written for a single-file world: it compared the first recorded digest against Problems.csv regardless of which file that digest described. It now checks every file both ways -- a vendored file with no digest fails, a digest naming an absent file fails -- and asserts ADR-0015 D3's falsifier directly rather than trusting it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
efe9f8f1a9
commit
4b5b601ce0
11 changed files with 767 additions and 42 deletions
|
|
@ -2,7 +2,7 @@
|
|||
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
|
||||
status: active
|
||||
state_hub_workstream_id: "d37c8671-54e4-447f-af64-56f482483282"
|
||||
---
|
||||
|
||||
|
|
@ -67,7 +67,7 @@ Rule coverage is 59/59 and has been for weeks.
|
|||
|
||||
```task
|
||||
id: CB-WP-0028-T01
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "17e6f38c-1903-4bb2-aa20-37e76c8fc4e0"
|
||||
```
|
||||
|
|
@ -99,11 +99,33 @@ Decide:
|
|||
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.
|
||||
|
||||
**Done 2026-08-06.**
|
||||
[ADR-0015](../decisions/ADR-0015-the-cards-own-words.md), six decisions.
|
||||
|
||||
**The gap is bigger than "one file of nineteen", and the measurement is
|
||||
the decision.** Of the file we *did* vendor, the engine reads **5 of 13
|
||||
columns** — `title`, `problem_text`, `front_rules`, `reveal_effect` and
|
||||
`unresolved_effect` were discarded at parse time. **The cheapest part of
|
||||
this pass costs no new bytes** and was sitting in the repo for eight days.
|
||||
And `SCN_01` is hardcoded at `lib.rs:1824`: the edition ships **four**
|
||||
scenarios and the engine has never dealt three of them.
|
||||
|
||||
**ADR-0011's revisit condition is measurably absent**, so the dependency
|
||||
argument does not get re-run. Across Actions, Solutions, Modes and
|
||||
Scenarios: **zero doubled quotes, zero embedded newlines.** The hand
|
||||
reader's only job is comma-in-quoted-field, which it already did.
|
||||
|
||||
Vendored `Actions`, `Solutions`, `Modes` — the text a player reads. Not
|
||||
the production artifacts. **Not `Extensions.csv`**, because it names
|
||||
content the designer placed *outside* the core, and importing it would
|
||||
break the as-printed claim — but it is now known to exist, which was the
|
||||
real risk.
|
||||
|
||||
## Task: the cards say what they do
|
||||
|
||||
```task
|
||||
id: CB-WP-0028-T02
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "aa4453d2-a84e-4afc-8534-1feb835c4d5b"
|
||||
```
|
||||
|
|
@ -125,6 +147,33 @@ from the edition — not from a phrase we invented.
|
|||
- **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.
|
||||
|
||||
**Done 2026-08-06.** One `Table` reader with four callers (a per-file copy
|
||||
is how a parser acquires four subtly different bugs), `CardText` for
|
||||
Actions/Solutions/Modes, and `ProblemText` for the columns already
|
||||
vendored.
|
||||
|
||||
**The GROUND card now explains itself**: *"Regulate. Restore the frame.
|
||||
Decide."* as the tagline, its GR/OU/ND text behind a disclosure. Problems
|
||||
show their own titles where a priority number used to be.
|
||||
|
||||
**The load-bearing test asserts the text is a substring of the vendored
|
||||
file**, not equal to a Rust literal — a test comparing against a
|
||||
hardcoded expectation would pass for a hand-copied string, which is the
|
||||
drift this ends. Plus counts (5 actions, 24 solutions, 3 modes), because a
|
||||
reader returning one row would pass a "the text is real" test.
|
||||
|
||||
**`edition` came out from behind `#[cfg(feature = "scenarios")]`.** It was
|
||||
gated because its only consumer was; but the edition is the game's own
|
||||
data and the shipped runtime now reads it. **Test machinery and game
|
||||
content are different things and only one of them is optional.**
|
||||
|
||||
**`edition-check` was written for a single-file world** and compared the
|
||||
first recorded digest against `Problems.csv` regardless of which file it
|
||||
described. It now checks every file both ways — a vendored file with no
|
||||
digest fails, and a digest naming an absent file fails — and asserts
|
||||
ADR-0015 D3's falsifier directly: no doubled quotes, no embedded
|
||||
newlines.
|
||||
|
||||
## Task: an overhead view of a real table
|
||||
|
||||
```task
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue