CB-WP-0036 done: the pace flag and the first ornament declarations
Some checks failed
ci / check (push) Failing after 4s

--pace speed|interactive, defaulting to Speed. Nothing reads it yet, and
that is the point: it is the seam clay-animate attaches to, and a seam is
cheap now where a retrofit would not be. A misspelt pace is refused rather
than defaulting, because quietly falling back to Speed would look exactly
like the renderer being broken.

I3 is asserted rather than intended: the same scripted game at both paces
must produce a byte-identical serialised recording and the same end state
hash. Mutation-proven — leak the pace into the seed and it fails with "the
recording differs by pace, so a renderer has become mechanism".

specs/OrnamentRegister.md carries four declarations. This reverses the
reasoning written in T03 earlier, which said the first declarations would
come from F18's unvendored files: instances already existed. Hand order is
what prompted the category, and "who deals" was the maintainer's own
example. O3 is the interesting one — seat ORDER is mechanism because
GR-R08 rotates Lead, while where a seat is drawn is not.

I5 is executable: check_ornament_falsifier fails any row still declared
that names no falsifier, mutation-proven red on O1. Presence, never
adequacy, and the finding text says so.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-07 22:15:38 +02:00
parent b231c1b5e2
commit bd9e168af5
7 changed files with 315 additions and 9 deletions

View file

@ -2,7 +2,7 @@
id: CB-WP-0036
kind: product
title: "Pace and ornamentation"
status: active
status: done
state_hub_workstream_id: "698651ed-cccd-46f2-84cc-07b0bdb85ad0"
---
@ -88,7 +88,7 @@ any renderer — is the falsifier for the whole split.
```task
id: CB-WP-0036-T02
status: todo
status: done
priority: medium
state_hub_task_id: "e978b93b-fcbd-4853-a27d-5eca00f9ca19"
```
@ -104,11 +104,30 @@ state_hub_task_id: "e978b93b-fcbd-4853-a27d-5eca00f9ca19"
it is the seam `clay-animate` will attach to, and a seam is cheap while
a retrofit is not.
**Done 2026-08-07.** `--pace speed|interactive`, `Pace::Speed` the
`Default`.
**I3 is asserted, not intended.** `pace_cannot_change_the_game` plays the
same scripted game at both paces and compares the **serialised recording
byte for byte**, plus the end state hash. Mutation-proven: leak the pace
into the seed and it fails with *"the recording differs by pace, so a
renderer has become mechanism"*.
**A misspelt pace is refused rather than defaulting.** `--pace cinematic`
errors and names both values. Quietly falling back to Speed would look
exactly like `clay-animate` being broken, and that is the seam this flag
exists to be.
I4 needs no measurement yet and that is worth saying plainly: **nothing
reads `pace`**, so the cost to `sim`, `trials` and the benchmarks is zero
by construction rather than by benchmark. The measurement becomes real
when something reads it.
## Task: declarations, once there are any to make
```task
id: CB-WP-0036-T03
status: todo
status: done
priority: low
state_hub_task_id: "bf2a68b0-5985-40ff-b4f5-33c40d92cff0"
```
@ -116,12 +135,29 @@ state_hub_task_id: "bf2a68b0-5985-40ff-b4f5-33c40d92cff0"
Ornamentation declarations per §2.1 — what is ornamented, why it does not
bind, what would falsify it.
**Not started deliberately.** GameDesign §2's rule applies: **no kind
exists without an instance that instantiates it.** The first real
declarations are most likely to come from F18's unvendored files —
`Player_Mats` and `Glossary` are ornamentation-bearing data this engine
has never read — so **vendoring those is the trigger**, not a schema
designed in advance.
**Done 2026-08-07.** [`specs/OrnamentRegister.md`](../specs/OrnamentRegister.md),
four declarations.
**This reverses the reasoning written here earlier**, which said the first
declarations would come from F18's unvendored files and that vendoring was
the trigger. That was wrong: **instances already existed.** Hand order is
the one that prompted the whole category — the request to drag cards
between slots — and *"who deals"* was the maintainer's own example. Waiting
for F18 would have left the register empty while its instances sat in the
conversation that created it.
The four: **O1 hand order** (provisional), **O2 who shuffles and deals**
(provisional), **O3 where a seat is drawn** (`rule`-grounded — seat
*order* is mechanism, GR-R08 rotates Lead; the drawn position is not),
**O4 typography and illustration** (provisional, and **nothing may be
declared about `Player_Mats` or `Glossary` until they are read** — F18).
**I5 is executable**: `check_ornament_falsifier` in `loop-lint` fails any
row still `declared` that names no falsifier. Mutation-proven on O1 —
strip its falsifier and the lint goes red. Three self-test controls: it
catches a bare declaration, clears one that names a falsifier, and skips
`refuted` rows as history. **Presence, never adequacy**, and the finding
text says so — the same split as ADR-0018 D5.
## No longer in this repo