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>
5.9 KiB
Edition & rules catalog (schema 2 — composable modules by aspect)
Authority: this file + catalog.yaml on main.
Aspect map: ASPECTS.md — full design-space dimensionality for GROUND.
Simulator research: clay-borg research/CB-RES-0010-game-aspects-and-design-space.md
Purpose: pin baseline content and independent rules modules so humans and clay-borg can run any module alone or in combination, measure, keep, or reject — without silent baseline edits.
Model
┌─────────────────────┐
│ baseline content │ editions/ground-darvo-rN/
│ (CSVs, print data) │
└──────────┬──────────┘
│
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
problem_stress attack_relief end_condition …
(≤1 module) (≤1 module) (≤1 module)
▲ ▲ ▲
└────────── aspects of the game ────────────┘
| Concept | Meaning |
|---|---|
| Aspect | An orthogonal design dimension of the game (how stress is routed, how the game ends, how Problems enter play, …). Full list: ASPECTS.md. |
| Baseline | Edition data package (Problems.csv, modes, …). Frozen columns still require rN→rN+1 (GROUND-WP-0002 T01). |
| Module | One implementable choice on one aspect. Defaults are named modules with no delta. |
| Profile | Named list of modules (convenience). Not a third rules source — expands to baseline + modules. |
| Configuration | Baseline + resolved module list = what is actually played. |
| Composition | At most one module per aspect. Missing aspects use default_module. |
Independence rule: a module may only declare rules on its own aspect. Cross-aspect effects belong in a profile (explicit combo) or a new aspect — never silent coupling inside one module.
Legacy experiments (editions/experiments/h1-…, h2-…) remain on disk as measured packages; they map to profiles. Prefer module_id / profile_id going forward.
Synonym: older docs said axis for aspect. Machine field is aspect:.
Aspects with modules (registered)
| Aspect | Default | Other modules |
|---|---|---|
problem_stress |
none |
flat_any_open (H1-A, reject), scoped (H2, keep) |
attack_relief |
none |
self_soothe_ge4 (H1-B) |
end_condition |
fixed_rounds_5 |
hybrid_clear_collapse (proposed) |
problem_deal |
fixed_setup |
pressure_deck (proposed) |
Many other aspects exist but are fixed in r0 until a competing design appears (see ASPECTS.md § full map).
Selection (clay-borg / trials)
Preferred API
baseline: ground-darvo-r0
modules:
- problem_stress.scoped
- end_condition.hybrid_clear_collapse # when implemented
# other aspects → defaults
Or:
profile: h2
# expands to modules: [problem_stress.scoped]
Or multi-aspect:
profile: scoped_plus_attack_soothe
# problem_stress.scoped + attack_relief.self_soothe_ge4
Validation
- Every
module_idexists andselectable: true. - No two modules share the same aspect.
status: proposedmodules may be selected only if the host declaresallow_proposed: true(kernel may no-op or refuse).- State / recordings must store the resolved module list (and baseline id), not only a legacy experiment string — so A/B names the point in design space.
Implementation
- Baseline CSVs: vendor as today.
- Each module: apply
rules_delta+ optionaldata_overlaysfrom itspath. - Apply modules in aspect order listed in
catalog.yamlaspects:(stable, documented). - Conflict: refuse composition rather than last-write-wins.
Profiles (named combos)
| profile_id | modules | note |
|---|---|---|
baseline |
(defaults) | Pure r0 |
h1 |
flat + attack soothe | Legacy H1; reject-as-baseline |
h2 |
scoped | Legacy H2; keep-as-experiment |
scoped_plus_attack_soothe |
scoped + soothe | Unmeasured combo |
scoped_plus_hybrid_end |
scoped + hybrid end | Needs kernel for end |
scoped_plus_pressure_deck |
scoped + pressure deck | Needs kernel for deal |
Adding a module (checklist)
- Confirm the aspect exists in ASPECTS.md; add the aspect first if needed.
- Create
editions/modules/<aspect>/<slug>/withMODULE.mdand, if non-default,rules_delta.yaml(+ CSV overlays if needed). - Register under
modules:withaspect,path,status,decision. - Optionally add a profile that includes it alone and/or with other modules.
- Message clay-borg:
module_id, aspect, delta path, compose examples. - Measure alone first when possible; then measure interesting profiles.
- Update
utility_estimate/decisionper module (and per profile if combo-specific).
What must not happen
- Silent edit of frozen baseline columns inside
ground-darvo-r0. - A new mega-experiment that re-bundles three aspects into one non-decomposable id (use a profile instead).
- Modules that hard-require another aspect’s module without documenting a profile.
Git
main + catalog is discovery; commits pin digests; branches optional for WIP. Modules live as directories on main.
Legacy map
| Old experiment | Prefer |
|---|---|
h1-problem-stress |
profile h1 or modules problem_stress.flat_any_open + attack_relief.self_soothe_ge4 |
h2-scoped-problem-stress |
profile h2 or module problem_stress.scoped |