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>
171 lines
7 KiB
Markdown
171 lines
7 KiB
Markdown
---
|
|
id: CB-WP-0036
|
|
kind: product
|
|
title: "Pace and ornamentation"
|
|
status: done
|
|
state_hub_workstream_id: "698651ed-cccd-46f2-84cc-07b0bdb85ad0"
|
|
---
|
|
|
|
# Purpose
|
|
|
|
```
|
|
structural tier M (a driver parameter and a declared vocabulary; the
|
|
animation architecture that made this L has moved
|
|
out of this repo)
|
|
chaos d8 = 7 → no override
|
|
declared tier M
|
|
```
|
|
|
|
**Re-declared 2026-08-07, declaration 8 of chaos window 3.**
|
|
|
|
## Why this was rewritten, and what it used to say
|
|
|
|
Declared on 2026-08-07 as **tier L**, covering an animation layer,
|
|
Rust-computed transitions over the journal delta, and a client/server
|
|
interaction able to animate other players' moves. Chaos was d8 = 7, no
|
|
override. **No code was written**, and the tier-L adversarial review was
|
|
never run — which is the only reason this could be re-scoped rather than
|
|
unwound.
|
|
|
|
**The maintainer moved the animation out of clay-borg**, and the reasoning
|
|
is now [`specs/Ornamentation.md`](../specs/Ornamentation.md):
|
|
|
|
> the basic simulator should have the relevant concepts of simulation and
|
|
> interaction, feedback mechanisms etc. with very simple ui concepts and
|
|
> frontend, backend interactions to keep the focus on the game and
|
|
> simulation core
|
|
|
|
So movement, timing and layering belong to a later, separate
|
|
**`clay-animate`**; material behaviour to **`clay-physics`** beyond that.
|
|
**What stays here is the vocabulary, the boundary and the pace knob** —
|
|
and the invariants that keep the boundary real once something downstream
|
|
exists to test it.
|
|
|
|
**Two terms changed and the change is not cosmetic.** "Ritual" became
|
|
**ornamentation**, because half the category is material rather than
|
|
ceremonial — card stock, a typeface, the drift of a discard. And the test
|
|
is no longer *"does it have a decision in it"*: choosing who deals is a
|
|
decision and is ornamental. **The test is whether the state hash moves**,
|
|
which is executable, and which settles the open question the previous
|
|
version of this workplan left for a reviewer.
|
|
|
|
## Task: the concept, in the spec that governs structure
|
|
|
|
```task
|
|
id: CB-WP-0036-T01
|
|
status: done
|
|
priority: high
|
|
state_hub_task_id: "e7602796-cdb7-44cf-a39d-697b1e8e2a7f"
|
|
```
|
|
|
|
**Controls:**
|
|
- the boundary has a **falsifier**, not just a diagram;
|
|
- ornamentation is defined by a test something can **run**, not by taste;
|
|
- it says what is deliberately **not** built and why.
|
|
|
|
**Done 2026-08-07.** [`specs/Ornamentation.md`](../specs/Ornamentation.md).
|
|
|
|
**§1.1 makes the line executable** by reusing `state_hash` — the same
|
|
instrument that binds a trial note to a position (ADR-0019 D3).
|
|
|
|
**§2 is the part that earns its place in this repo rather than a
|
|
renderer's stylesheet.** Calling something ornamentation is a claim that
|
|
it does not matter, and this project's register is a list of times that
|
|
claim was wrong — `quantity` in `Tokens.csv`, F18's four unread files,
|
|
SOLVE offered where it could not act. So a declaration carries a
|
|
falsifier, and *provisional* is a state it must be able to say out loud.
|
|
|
|
**§3.1 restates ADR-0007 D5 one level up:** downstream may read, may not
|
|
decide. **§3.2 refuses to design the port**, because no consumer exists
|
|
and an interface built against an imagined client is the same defect as a
|
|
gate that cannot go red.
|
|
|
|
**§5 gives five invariants, four of them checkable today.** I3 — the same
|
|
seed and decisions produce a byte-identical recording at any pace, through
|
|
any renderer — is the falsifier for the whole split.
|
|
|
|
## Task: the pace parameter
|
|
|
|
```task
|
|
id: CB-WP-0036-T02
|
|
status: done
|
|
priority: medium
|
|
state_hub_task_id: "e978b93b-fcbd-4853-a27d-5eca00f9ca19"
|
|
```
|
|
|
|
`--pace speed | interactive`, defaulting to **speed**, and **not**
|
|
`--mode` (taken by `ScoringMode`).
|
|
|
|
**Controls:**
|
|
- **I4 measured, not asserted**: `sim`, `trials` and the benchmarks are
|
|
unaffected — *nothing*, not *little*;
|
|
- `prefers-reduced-motion` behaves as speed;
|
|
- **the flag exists before anything reads it**, and that is deliberate:
|
|
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: done
|
|
priority: low
|
|
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.
|
|
|
|
**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
|
|
|
|
- **the animation layer**, transitions over the journal delta, cards
|
|
summoned larger beside a seat and shrinking toward a target, discards
|
|
drifting — **`clay-animate`**;
|
|
- **material simulation** — **`clay-physics`**;
|
|
- **hand sorting**, which was T05 here: it is presentation of a hand whose
|
|
*contents* are mechanism, so it goes with the renderer. The constraint
|
|
survives the move and is now I1: sorting must not move `state_hash`,
|
|
because a hash that moved would break every trial note's binding.
|