vendor tool that covers what the gate checks
They ruled on all seven items the same day. Two were actionable here.
F28 RULED: points. Modes.csv MODE_COOP clarified upstream to say
"penalties apply to points, not card count"; mastery is now
total - blame - denied. A recorded scenario went red on it --
gr-e02-shared-ground pinned 0 (2 claimed CARDS - 1 - 1) and now expects
2 (4 POINTS - 1 - 1). The number moved because the rule was decided, not
because the engine drifted, and the scenario records both rulings; its
schema has no field for a second one, so both live in ruled_note with
`ruled` carrying the LATEST date.
F29 RULED not-intended and APPLIED upstream: SCN_02's suits re-tuned the
same day. The characterisation test is how we found out -- it pinned the
duplication, went red on the re-tune, and that red WAS the notification.
It now asserts every pair distinct, the stronger statement the
duplication had made unavailable. SCN_02 re-measures at 73 at 2p, not
67: its own board now.
F26/F30 ruled and recorded. F30's ruling incidentally confirms our
reading -- they name priority-2's suit as the first lever, which is the
difference we identified without having measured causation.
vendor-editions grew twice, both times because it covered less than the
gate it exists to satisfy:
- It refused to touch ground-darvo-r0/ on the reasoning that the
baseline is "a separate record". That was wrong within the hour:
ground-game clarified Modes.csv and `make vendor` reported a clean
sync while edition-check went red. A sync tool that covers less than
its check reports success into a red gate.
- Its two-block rewrite DETECTED which fence held which set and
preserved the arrangement -- faithfully preserving a swap an earlier
write had introduced, leaving each fence under a heading describing
the other. edition-check reads every sha256 line flat and passed
throughout: a document can be self-consistently wrong and green.
Order is now asserted, with a control that goes red on a swap.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6.3 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 (ready-for-implement) |
problem_deal |
fixed_setup |
pressure_deck (ready-for-implement) |
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.
consumed_files(RPT-0006): when present on a module, a consumer that has not read those paths is in a detectable incomplete state — not silence. Freshness/edition-check should fail or warn if a listed file is unread or undigested. Modules without the field still work; new modules should list it.
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 |