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>
254 lines
9.5 KiB
YAML
254 lines
9.5 KiB
YAML
# GROUND edition catalog — schema 2: composable modules
|
||
# Docs: CATALOG.md
|
||
# clay-borg: select baseline + 0..N modules (≤1 per aspect), or a named profile.
|
||
|
||
schema_version: 2
|
||
# terminology: aspect (human) = former axis; modules remain module_id
|
||
updated: "2026-08-08"
|
||
default_baseline: ground-darvo-r0
|
||
default_profile: baseline
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Aspects — orthogonal design dimensions (formerly "axes"). At most one non-default module per aspect.
|
||
# ---------------------------------------------------------------------------
|
||
aspects:
|
||
- id: problem_stress
|
||
# legacy key: axis (same meaning)
|
||
title: Problem → Stress routing
|
||
default_module: problem_stress.none
|
||
summary: >
|
||
Whether and how unclaimed Problems raise Stress at Round End.
|
||
|
||
- id: attack_relief
|
||
title: ATTACK self-soothing
|
||
default_module: attack_relief.none
|
||
summary: >
|
||
Whether resolving ATTACK can reduce the attacker's Stress.
|
||
|
||
- id: end_condition
|
||
title: How the game ends
|
||
default_module: end_condition.fixed_rounds_5
|
||
summary: >
|
||
Fixed round clock vs clear-board / collapse / hybrid ends.
|
||
|
||
- id: problem_deal
|
||
title: How Problems enter play
|
||
default_module: problem_deal.fixed_setup
|
||
summary: >
|
||
Fixed setup deal only vs mid-game influx (pressure deck, etc.).
|
||
|
||
# Future aspects (not yet registered): setup_difficulty, sequence_pacing,
|
||
# ground_as_sequence, status_stress, competence_track.
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Baseline content package (CSV edition data)
|
||
# ---------------------------------------------------------------------------
|
||
baselines:
|
||
- baseline_id: ground-darvo-r0
|
||
path: editions/ground-darvo-r0
|
||
selectable: true
|
||
status: baseline
|
||
dataset_id: GROUND-DARVO-CORE-0.1
|
||
title: "GROUND DARVO Edition — core r0"
|
||
summary: >
|
||
Print/playtest content. Modes, deal 6/9/12, thresholds 5/7/9.
|
||
Default modules on all aspects = r0 printed behaviour.
|
||
utility_estimate: >
|
||
Ship-default content. Stress has no problem pressure until a
|
||
problem_stress module is selected.
|
||
decision: none
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Modules — independent variations (one directory each)
|
||
# ---------------------------------------------------------------------------
|
||
modules:
|
||
# --- problem_stress ---
|
||
- module_id: problem_stress.none
|
||
aspect: problem_stress
|
||
path: editions/modules/problem_stress/none
|
||
is_default: true
|
||
selectable: true
|
||
status: baseline-default
|
||
rules_delta: null
|
||
summary: Unclaimed Problems do not raise Stress (r0).
|
||
decision: none
|
||
|
||
- module_id: problem_stress.flat_any_open
|
||
aspect: problem_stress
|
||
path: editions/modules/problem_stress/flat_any_open
|
||
is_default: false
|
||
selectable: true
|
||
status: measured
|
||
rules_delta: editions/modules/problem_stress/flat_any_open/rules_delta.yaml
|
||
legacy_experiment_ids: [h1-problem-stress]
|
||
measurement_ref: reports/260808-clay-borg-h1-measured.md
|
||
summary: >
|
||
+1 Stress to every seat if any Problem unclaimed (former H1-A).
|
||
utility_estimate: >
|
||
Reject as sole pressure: greedy 3–4p wins → 0. Keep for A/B control.
|
||
decision: reject-as-baseline
|
||
clay_borg_notes: Former H1-A; implement without H1-B unless attack_relief also selected.
|
||
|
||
- module_id: problem_stress.scoped
|
||
aspect: problem_stress
|
||
path: editions/modules/problem_stress/scoped
|
||
is_default: false
|
||
selectable: true
|
||
status: measured
|
||
rules_delta: editions/modules/problem_stress/scoped/rules_delta.yaml
|
||
data_overlays: [Problems.csv, Rules_Text.csv]
|
||
legacy_experiment_ids: [h2-scoped-problem-stress]
|
||
measurement_ref: reports/260808-clay-borg-h2-measured.md
|
||
hypothesis_ref: history/260808-h2-scoped-problem-stress.md
|
||
summary: >
|
||
+1 Stress per unclaimed Problem to stress_scope (personal/bond/global).
|
||
utility_estimate: >
|
||
Scoping works (RPT-0005). Keep; candidate promote with other axes later.
|
||
decision: keep-as-experiment
|
||
clay_borg_notes: >
|
||
Prefer path editions/modules/problem_stress/scoped. Use with_variant()/owners.
|
||
legacy_experiment_id h2-scoped-problem-stress remains an alias profile.
|
||
|
||
# --- attack_relief ---
|
||
- module_id: attack_relief.none
|
||
aspect: attack_relief
|
||
path: editions/modules/attack_relief/none
|
||
is_default: true
|
||
selectable: true
|
||
status: baseline-default
|
||
rules_delta: null
|
||
summary: ATTACK does not self-soothe (r0).
|
||
decision: none
|
||
|
||
- module_id: attack_relief.self_soothe_ge4
|
||
aspect: attack_relief
|
||
path: editions/modules/attack_relief/self_soothe_ge4
|
||
is_default: false
|
||
selectable: true
|
||
status: measured-as-combo
|
||
rules_delta: editions/modules/attack_relief/self_soothe_ge4/rules_delta.yaml
|
||
legacy_experiment_ids: [h1-problem-stress]
|
||
measurement_ref: reports/260808-clay-borg-h1-measured.md
|
||
summary: Uncancelled ATTACK at Stress ≥4 → attacker −1 Stress (former H1-B).
|
||
utility_estimate: >
|
||
Alone unmeasured. With flat problem stress, dead for competent play.
|
||
Re-measure with problem_stress.scoped via profile scoped_plus_attack_soothe.
|
||
decision: none
|
||
clay_borg_notes: Independent of problem_stress; compose explicitly.
|
||
|
||
# --- end_condition ---
|
||
- module_id: end_condition.fixed_rounds_5
|
||
aspect: end_condition
|
||
path: editions/modules/end_condition/fixed_rounds_5
|
||
is_default: true
|
||
selectable: true
|
||
status: baseline-default
|
||
rules_delta: null
|
||
summary: Always 5 rounds then threshold scoring (r0).
|
||
decision: none
|
||
|
||
- module_id: end_condition.hybrid_clear_collapse
|
||
aspect: end_condition
|
||
path: editions/modules/end_condition/hybrid_clear_collapse
|
||
is_default: false
|
||
selectable: true
|
||
status: proposed
|
||
rules_delta: editions/modules/end_condition/hybrid_clear_collapse/rules_delta.yaml
|
||
hypothesis_ref: history/260808-deal-end-sequences-design.md
|
||
summary: >
|
||
End on board clear, group collapse, or round ceiling (draft rules).
|
||
utility_estimate: Unimplemented — draft only.
|
||
decision: none
|
||
clay_borg_notes: Kernel pending; do not claim measured until implemented.
|
||
|
||
# --- problem_deal ---
|
||
- module_id: problem_deal.fixed_setup
|
||
aspect: problem_deal
|
||
path: editions/modules/problem_deal/fixed_setup
|
||
is_default: true
|
||
selectable: true
|
||
status: baseline-default
|
||
rules_delta: null
|
||
summary: Surface + hidden 1..k at setup only (r0).
|
||
decision: none
|
||
|
||
- module_id: problem_deal.pressure_deck
|
||
aspect: problem_deal
|
||
path: editions/modules/problem_deal/pressure_deck
|
||
is_default: false
|
||
selectable: true
|
||
status: proposed
|
||
rules_delta: editions/modules/problem_deal/pressure_deck/rules_delta.yaml
|
||
hypothesis_ref: history/260808-deal-end-sequences-design.md
|
||
summary: >
|
||
Small start set + mid-game draws from Pressure deck (draft).
|
||
utility_estimate: Unimplemented — draft only.
|
||
decision: none
|
||
clay_borg_notes: >
|
||
Kernel pending. Recommended compose with problem_stress.scoped.
|
||
v0 draft uses 0-point drawn cards.
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Profiles — named compositions (convenience; not a second rules source)
|
||
# Selection = baseline + modules list. Defaults fill missing axes.
|
||
# ---------------------------------------------------------------------------
|
||
profiles:
|
||
- profile_id: baseline
|
||
title: Pure r0
|
||
modules: []
|
||
summary: All aspect defaults — printed ground-darvo-r0 behaviour.
|
||
|
||
- profile_id: h1
|
||
title: Legacy H1 (flat problem stress + attack soothe)
|
||
modules:
|
||
- problem_stress.flat_any_open
|
||
- attack_relief.self_soothe_ge4
|
||
legacy_experiment_id: h1-problem-stress
|
||
summary: Equivalent to old monolithic experiment h1-problem-stress.
|
||
decision: reject-as-baseline
|
||
|
||
- profile_id: h2
|
||
title: Legacy H2 (scoped problem stress only)
|
||
modules:
|
||
- problem_stress.scoped
|
||
legacy_experiment_id: h2-scoped-problem-stress
|
||
summary: Equivalent to old monolithic experiment h2-scoped-problem-stress.
|
||
decision: keep-as-experiment
|
||
|
||
- profile_id: scoped_plus_attack_soothe
|
||
title: Scoped stress + ATTACK self-soothe
|
||
modules:
|
||
- problem_stress.scoped
|
||
- attack_relief.self_soothe_ge4
|
||
summary: First intentional multi-aspect combo after modular catalog.
|
||
status: unmeasured
|
||
|
||
- profile_id: scoped_plus_hybrid_end
|
||
title: Scoped stress + hybrid end (when end module ships)
|
||
modules:
|
||
- problem_stress.scoped
|
||
- end_condition.hybrid_clear_collapse
|
||
summary: Requires end_condition.hybrid_clear_collapse kernel support.
|
||
status: proposed
|
||
|
||
- profile_id: scoped_plus_pressure_deck
|
||
title: Scoped stress + pressure deck (when deal module ships)
|
||
modules:
|
||
- problem_stress.scoped
|
||
- problem_deal.pressure_deck
|
||
summary: Requires problem_deal.pressure_deck kernel support.
|
||
status: proposed
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Legacy experiment paths (still on disk; prefer modules + profiles)
|
||
# ---------------------------------------------------------------------------
|
||
legacy_experiments:
|
||
- experiment_id: h1-problem-stress
|
||
path: editions/experiments/h1-problem-stress
|
||
equivalent_profile: h1
|
||
note: Prefer profile h1 or modules problem_stress.flat_any_open + attack_relief.self_soothe_ge4
|
||
|
||
- experiment_id: h2-scoped-problem-stress
|
||
path: editions/experiments/h2-scoped-problem-stress
|
||
equivalent_profile: h2
|
||
note: Prefer profile h2 or module problem_stress.scoped
|