ADR-0022 + CB-WP-0048 T00: the selector decision, and the mirror held
The maintainer's observation decided the design: aspects partition the GAME, strata partition our apparatus, and they are orthogonal. A module is one coordinate change in aspect space with an obligation in every stratum. So aspect identity must NOT be Rust types -- an aspect ground-game adds would make clay-borg fail to parse a configuration rather than fail to run it, welding the two coordinate systems at the one place they must stay independent. Chosen: identity as data (Configuration round-trips anything the catalog names), behaviour exhaustive (Rules, no catch-all), resolve() between. Decisive argument: the catalog ALREADY ships modules with a rules_delta and status: proposed, so a per-aspect enum would report them as "unknown module" -- indistinguishable from a typo, a false statement about the edition, and this project's signature failure shape. Two facts need two errors. Federating design authority is permanent, so the representation must outlive the implementation. Legacy ids alias forever through the catalog's own legacy_experiment_id, on the standard-Np precedent: 26 recordings name them and the expansion is exact, so there is nothing to deprecate. T00 done: the schema-2 mirror had arrived with no digests (19 files) and edition-check was red. Digests are now generated by WALKING editions/, not typed -- two reviews already found hand-written lists that made their own controls vacuous, and a mirror that grows a directory is what breaks a maintained list. PROVENANCE-catalog.md was a file inside the mirrored tree that upstream does not have; folded into our own PROVENANCE.md, since provenance about the mirror does not belong inside the thing it describes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
b39bc14861
commit
bff64053ca
29 changed files with 1997 additions and 22 deletions
154
workplans/CB-WP-0048-a-configuration-not-a-variant.md
Normal file
154
workplans/CB-WP-0048-a-configuration-not-a-variant.md
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
---
|
||||
id: CB-WP-0048
|
||||
kind: product
|
||||
title: "A configuration, not a variant"
|
||||
status: in_progress
|
||||
---
|
||||
|
||||
# Purpose
|
||||
|
||||
```
|
||||
structural tier M (changes the state and therefore the recording, and
|
||||
replaces the selector every consumer names)
|
||||
declared tier M
|
||||
```
|
||||
|
||||
Implements [ADR-0022](../decisions/ADR-0022-a-configuration-is-a-point-in-aspect-space.md),
|
||||
adopting ground-game catalog **schema 2** per
|
||||
[CB-RES-0010](../research/CB-RES-0010-game-aspects-and-design-space.md).
|
||||
|
||||
## The gap, stated exactly
|
||||
|
||||
`scoped_plus_attack_soothe` is a profile in the vendored catalog **today**.
|
||||
clay-borg cannot name it — not "has not implemented", *cannot express*.
|
||||
`Variant` has three arms; H1 bundles flat pressure with self-soothe and
|
||||
cannot be taken apart, H2 gives scoping alone, and their product has no
|
||||
arm. Every future combination has the same problem.
|
||||
|
||||
The kernel is not the obstacle: **four sites branch on the variant and
|
||||
each belongs to exactly one aspect** (ADR-0022 Context). The selector is
|
||||
the blob.
|
||||
|
||||
## Task T00: the mirror is held by the gate
|
||||
|
||||
```task
|
||||
id: CB-WP-0048-T00
|
||||
status: done
|
||||
priority: high
|
||||
```
|
||||
|
||||
**Done 2026-08-08.** The schema-2 mirror (`catalog.yaml`, `ASPECTS.md`,
|
||||
`CATALOG.md`, `modules/`) arrived vendored with **no recorded digests** —
|
||||
19 files — and `make edition-check` was red on the working tree.
|
||||
|
||||
- Digests are now **generated by walking `editions/`**, not typed. Two
|
||||
reviews (CB-REV-0002 #8, CB-REV-0003 #8) already found hand-written
|
||||
lists that made their own controls vacuous; a mirror that grows a
|
||||
*directory* is precisely the case a maintained list loses.
|
||||
- `editions/PROVENANCE-catalog.md` was a file **inside the mirrored tree
|
||||
that upstream does not have**, which the gate correctly refused as
|
||||
unexplained. Folded into `editions/ground-darvo-r0/PROVENANCE.md` —
|
||||
provenance *about* the mirror is ours, so it does not live inside the
|
||||
thing it describes.
|
||||
|
||||
**Noted, not fixed:** `vendored_files()` matches only `.csv` inside the
|
||||
edition directory, so a non-CSV added *there* is invisible to both the
|
||||
digest and the freshness check. The sibling walk has no such hole. The
|
||||
exposure is one file today (`PROVENANCE.md`, ours) — but this is F26's
|
||||
shape again and should be closed on its own terms.
|
||||
|
||||
## Task T01: `Configuration` and `Rules`
|
||||
|
||||
```task
|
||||
id: CB-WP-0048-T01
|
||||
status: todo
|
||||
priority: high
|
||||
```
|
||||
|
||||
Per ADR-0022 D1. Identity as data, behaviour exhaustive, `resolve()`
|
||||
between them.
|
||||
|
||||
**Controls:**
|
||||
- **a proposed module is refused BY NAME**, distinguishably from a typo —
|
||||
the two-error requirement is the reason this shape was chosen, so it is
|
||||
the first test;
|
||||
- **two modules on one aspect are refused** (GAME↔MODEL validation);
|
||||
- **an aspect the catalog has and the kernel does not know still parses**,
|
||||
because a configuration must be nameable before it is runnable;
|
||||
- **`Rules` has no catch-all arm**, so a new module cannot fall through
|
||||
silently (CB-WP-0034's exhaustiveness, which caught two commands before
|
||||
any test ran);
|
||||
- mutation-proven, each control against its own defect.
|
||||
|
||||
## Task T02: legacy ids alias forever
|
||||
|
||||
```task
|
||||
id: CB-WP-0048-T02
|
||||
status: todo
|
||||
priority: high
|
||||
```
|
||||
|
||||
Per ADR-0022 D2, through the catalog's own `legacy_experiment_id`.
|
||||
|
||||
**Controls:**
|
||||
- **all 26 recordings replay byte-identically**, which is the whole
|
||||
constraint — `make sim` is the authority;
|
||||
- **`--variant h2` and `--profile h2` produce the same resolved
|
||||
configuration**, asserted on the resolved object rather than on
|
||||
behaviour, so the equivalence is exact and not a coincidence of
|
||||
outcomes;
|
||||
- **the expansion comes from the catalog**, not a table in our source: a
|
||||
second copy of ground-game's mapping is F25's shape.
|
||||
|
||||
## Task T03: the resolved configuration is recorded
|
||||
|
||||
```task
|
||||
id: CB-WP-0048-T03
|
||||
status: todo
|
||||
priority: high
|
||||
```
|
||||
|
||||
Per ADR-0022 D3 and CB-RES-0010 §5.3: `cb-play` sessions, replays, trial
|
||||
logs and panel cells carry the **resolved** module list.
|
||||
|
||||
**Controls:**
|
||||
- **the recorded configuration is the applied one**, proven the way
|
||||
CB-WP-0046 proved the trial-log stamp — from the state, not the flag;
|
||||
- **the trial-log marker carries the configuration**, closing the gap
|
||||
CB-WP-0047 left open (variant stamped, scenario and mode not);
|
||||
- **a bare field write cannot leave a module inert** — the H2 defect had
|
||||
three call sites and this is the generalisation of it.
|
||||
|
||||
## Task T04: the page and the panels speak aspects
|
||||
|
||||
```task
|
||||
id: CB-WP-0048-T04
|
||||
status: todo
|
||||
priority: normal
|
||||
```
|
||||
|
||||
**Controls:**
|
||||
- **the table names every live module**, not a legacy id — the CB-WP-0044
|
||||
family: a rules change the page cannot name is reported as "no changes";
|
||||
- **panels facet by aspect** (CB-RES-0010 §5.4), so "hold all aspects
|
||||
fixed, vary one" is what the harness does rather than what a reader
|
||||
reconstructs;
|
||||
- **a module nothing measured is reported unmeasured**, not absent.
|
||||
|
||||
## Not done here
|
||||
|
||||
- **No policy reads the configuration.** F27 already records that the
|
||||
three scoring modes produce identical play because `GreedyPolicy` never
|
||||
consults `state.mode`; the same will be true of every aspect. Selection
|
||||
without aspect-aware policies gives configurations we can run and cannot
|
||||
evaluate — CB-RES-0010 §5.4's last bullet is F27 restated. **This is the
|
||||
next pass, and it is a prerequisite for measuring any new module**, not
|
||||
a nicety.
|
||||
- **`end_condition` and `problem_deal` get no kernel path here.** Both
|
||||
their non-default modules are `status: proposed`; T01 makes them
|
||||
nameable and refusable, which is what ADR-0022 asks for and all it asks
|
||||
for.
|
||||
- **`specs/Taxonomy.md` does not yet distinguish aspect from stratum.**
|
||||
ADR-0022 D0 states the distinction; the taxonomy is where it belongs,
|
||||
and without it the two vocabularies will be crossed in exactly the way
|
||||
the taxonomy exists to prevent.
|
||||
Loading…
Add table
Add a link
Reference in a new issue