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
173
decisions/ADR-0022-a-configuration-is-a-point-in-aspect-space.md
Normal file
173
decisions/ADR-0022-a-configuration-is-a-point-in-aspect-space.md
Normal file
|
|
@ -0,0 +1,173 @@
|
|||
# ADR-0022: a configuration is a point in aspect space, and identity is not behaviour
|
||||
|
||||
status: accepted
|
||||
date: 2026-08-08
|
||||
decided by: maintainer, on options put by the agent
|
||||
tier: M (changes the state and therefore the recording; replaces the
|
||||
selector every consumer names)
|
||||
references: [CB-RES-0010](../research/CB-RES-0010-game-aspects-and-design-space.md),
|
||||
ground-game `editions/catalog.yaml` (schema 2), `editions/ASPECTS.md`,
|
||||
[specs/Taxonomy.md](../specs/Taxonomy.md),
|
||||
[ADR-0011](ADR-0011-vendor-the-edition.md) (the baseline is vendored),
|
||||
[CB-WP-0047](../workplans/CB-WP-0047-all-four-boards-and-all-three-modes.md)
|
||||
(the `standard-Np` precedent)
|
||||
|
||||
## Context
|
||||
|
||||
ground-game's catalog moved to **schema 2**: a configuration is a baseline
|
||||
plus **at most one module per aspect**, where an aspect is an orthogonal
|
||||
design dimension (`problem_stress`, `attack_relief`, `end_condition`,
|
||||
`problem_deal`). The monolithic experiments H1 and H2 became **profiles**
|
||||
over modules.
|
||||
|
||||
clay-borg's selector is a three-armed enum:
|
||||
|
||||
```rust
|
||||
pub enum Variant { Baseline, H1ProblemStress, H2ScopedProblemStress }
|
||||
```
|
||||
|
||||
**This cannot express the configurations the catalog now ships.**
|
||||
`scoped_plus_attack_soothe` — `problem_stress.scoped` × `attack_relief.self_soothe_ge4`
|
||||
— is a named profile upstream and clay-borg has no way to *name* it, let
|
||||
alone run it. H1 bundles flat pressure with self-soothe and cannot be
|
||||
taken apart; H2 gives scoping alone. The product is unreachable.
|
||||
|
||||
**The kernel is already decomposed; only the selector is a blob.** Exactly
|
||||
four sites branch on the variant, and each belongs to exactly one aspect:
|
||||
|
||||
| site | behaviour | module |
|
||||
|---|---|---|
|
||||
| `lib.rs:342` | assign Problem owners at setup | `problem_stress.scoped` |
|
||||
| `lib.rs:1703` | scoped End-of-Round pressure | `problem_stress.scoped` |
|
||||
| `lib.rs:1741` | flat End-of-Round pressure | `problem_stress.flat_any_open` |
|
||||
| `lib.rs:1649` | ATTACK self-soothe at Stress ≥4 | `attack_relief.self_soothe_ge4` |
|
||||
|
||||
## D0 — aspects and strata are two coordinate systems
|
||||
|
||||
Raised by the maintainer, and it decides the rest.
|
||||
|
||||
**Aspects partition the game.** They live entirely in the GAME stratum —
|
||||
they are ground-game's vocabulary for what a designer varies.
|
||||
|
||||
**Strata partition our apparatus** (Taxonomy.md): GAME, MODEL, ENGINE,
|
||||
INSTRUMENT, ACCOUNT, PRESENTATION.
|
||||
|
||||
So **a module is one coordinate change in aspect space with an obligation
|
||||
in every stratum**: a kernel delta (MODEL), a computation that must be
|
||||
right (ENGINE), a panel that must facet by it (INSTRUMENT), evidence that
|
||||
names it (ACCOUNT), a label on the table (PRESENTATION).
|
||||
|
||||
Two consequences we act on:
|
||||
|
||||
- **"≤1 module per aspect" is GAME↔MODEL — validation.** Whether the
|
||||
scoped delta computes the right Stress is MODEL↔ENGINE — verification.
|
||||
Same selector, two kinds of wrong, and they get separate controls.
|
||||
- **Aspect identity must not be Rust types.** If it were, 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.
|
||||
|
||||
## D1 — identity is data; behaviour is exhaustive
|
||||
|
||||
```rust
|
||||
struct Configuration { // IDENTITY — GAME-stratum data
|
||||
baseline: String,
|
||||
modules: BTreeMap<AspectId, ModuleId>, // resolved, defaults filled
|
||||
profile: Option<String>, // if one was requested
|
||||
}
|
||||
|
||||
struct Rules { // BEHAVIOUR — ENGINE-stratum
|
||||
problem_stress: ProblemStress, // None | FlatAnyOpen | Scoped
|
||||
attack_relief: AttackRelief, // None | SelfSootheGe4
|
||||
}
|
||||
|
||||
impl Configuration { fn resolve(&self) -> Result<Rules, String> }
|
||||
```
|
||||
|
||||
`Configuration` round-trips **anything the catalog names**, including
|
||||
modules with no kernel path. `Rules` is exhaustive, so a new module cannot
|
||||
be silently ignored — the compiler names it.
|
||||
|
||||
### Why not a typed struct alone
|
||||
|
||||
Because the catalog **already contains modules we must name and must
|
||||
refuse to run**: `end_condition.hybrid_clear_collapse` and
|
||||
`problem_deal.pressure_deck` ship with a `rules_delta` and
|
||||
`status: proposed`. A per-aspect enum cannot represent them, so selecting
|
||||
one yields *"unknown module"* — **indistinguishable from a typo**. That is
|
||||
a false statement about the edition, and it is this project's signature
|
||||
failure: a right computation over the wrong subject (ADR-0018).
|
||||
|
||||
The split gives two errors because there are two facts:
|
||||
|
||||
```
|
||||
problem_deal.pressure_deck is a known module with no kernel path
|
||||
(catalog status: proposed)
|
||||
problem_deal.presure_deck is not a module the catalog has
|
||||
```
|
||||
|
||||
CB-RES-0010 §5.6 requires proposed modules to *refuse or no-op loudly*. A
|
||||
no-op is our `inert` failure kind, so we refuse.
|
||||
|
||||
### Why not an open map alone
|
||||
|
||||
An open map cannot tell you a module has no implementation. That check
|
||||
becomes a runtime obligation at every read site, and a missed one is a
|
||||
silent no-op — the same `inert` outcome, reached by omission. This repo
|
||||
has been paid twice by exhaustive matching: CB-WP-0034's `command_label`
|
||||
caught `RejectReverse` and `BreakRivalry` before any test ran.
|
||||
|
||||
**Federating design authority is permanent, not transitional.** The
|
||||
catalog will always be able to name more than the kernel implements, so
|
||||
the representation must outlive the implementation. That is the whole
|
||||
argument.
|
||||
|
||||
## D2 — legacy ids alias forever
|
||||
|
||||
`--variant h2`, `--variant h1`, `ground-darvo-r0` and every recording that
|
||||
names them keep working **permanently**, expanding through the catalog's
|
||||
own `legacy_experiment_id` to profiles and then to modules:
|
||||
|
||||
| legacy | profile | modules |
|
||||
|---|---|---|
|
||||
| `h1-problem-stress` | `h1` | `problem_stress.flat_any_open` + `attack_relief.self_soothe_ge4` |
|
||||
| `h2-scoped-problem-stress` | `h2` | `problem_stress.scoped` |
|
||||
|
||||
**The `standard-Np` precedent** (CB-WP-0047): twenty-six recordings name a
|
||||
preset, and a grammar that redefined it would have moved every board while
|
||||
the hashes still claimed to pin them. `serde` defaults the same way — a
|
||||
state with no `modules` key is the baseline, which is what it was.
|
||||
|
||||
**No deprecation warning.** An alias that nags is an alias the maintainer
|
||||
routes around, and the expansion is exact rather than approximate: `h2`
|
||||
*is* `[problem_stress.scoped]`, not a rough equivalent.
|
||||
|
||||
## D3 — the resolved configuration is what gets recorded
|
||||
|
||||
Not the requested one. `state.variant = v` instead of `with_variant()`
|
||||
left H2 inert at three call sites, and CB-WP-0046 stamps the trial log
|
||||
from `state.variant` for exactly that reason. **With N aspects the failure
|
||||
is N times as likely**, so the object that is applied and the object that
|
||||
is recorded are the same object, and a panel cell, a replay and a trial
|
||||
note all carry it.
|
||||
|
||||
## Consequences
|
||||
|
||||
- The state gains a configuration and loses `variant`; recordings written
|
||||
before this replay through D2's map.
|
||||
- `Variant` has 88 mentions across 13 files and is `Copy`; `Configuration`
|
||||
carries a map and is not, so some sites take a reference.
|
||||
- Panels facet by aspect, not by legacy experiment name (CB-RES-0010 §5.4).
|
||||
- Findings may be scoped to an aspect or a module.
|
||||
- **A module with no kernel path is a hard error naming the module**, not
|
||||
a warning and not a no-op.
|
||||
|
||||
## What was rejected
|
||||
|
||||
| rejected | why |
|
||||
|---|---|
|
||||
| enum arms per combination | 9 arms for two aspects; the blob schema 2 exists to retire |
|
||||
| typed struct per aspect, alone | cannot name a proposed module, so it reads as a typo |
|
||||
| open map, alone | no compile-time check that a module is implemented; a miss is silent |
|
||||
| deprecating legacy ids | 26 recordings, and the expansion is exact — there is nothing to deprecate |
|
||||
| deriving the aspect list ourselves | aspects are ground-game's; we validate against the catalog (ADR-0011) |
|
||||
146
editions/ASPECTS.md
Normal file
146
editions/ASPECTS.md
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
# Aspects of the game — design space for GROUND
|
||||
|
||||
**Authority:** this file + [`catalog.yaml`](catalog.yaml) `aspects:` list.
|
||||
**Catalog contract:** [`CATALOG.md`](CATALOG.md)
|
||||
**Research (simulator side):** clay-borg `research/CB-RES-0010-game-aspects-and-design-space.md`
|
||||
|
||||
An **aspect** is an orthogonal **design dimension** of the game: a family of
|
||||
questions you can answer independently when defining or varying rules.
|
||||
A **module** is one concrete answer on one aspect. A **profile** is a named
|
||||
point in multi-aspect space (a combination of modules).
|
||||
|
||||
Terminology: **aspect** is the human and catalog term (schema 2). Older
|
||||
text said *axis*; treat them as synonyms until references are gone.
|
||||
|
||||
This is **game design structure**, not a game-theory taxonomy. Game theory
|
||||
supplies formal objects (players, actions, payoffs, information) used when
|
||||
*analyzing* a configuration; it does not list edition-level modules.
|
||||
|
||||
---
|
||||
|
||||
## Vocabulary
|
||||
|
||||
| Term | Meaning |
|
||||
|------|---------|
|
||||
| **Aspect** | A dimension of design space (e.g. how the game ends, how stress is routed). |
|
||||
| **Module** | One implementable choice for an aspect (`problem_stress.scoped`). |
|
||||
| **Default module** | The r0 / printed answer when no experimental module is selected. |
|
||||
| **Profile** | Named list of modules (e.g. `h2`, `scoped_plus_attack_soothe`). |
|
||||
| **Baseline** | Content package (`ground-darvo-r0`) + all default modules. |
|
||||
| **Configuration** | Baseline + resolved module list — what a sim or table actually plays. |
|
||||
|
||||
**Rule:** at most **one module per aspect**. Cross-aspect behaviour is an
|
||||
explicit **profile**, never a silent dependency inside a single module.
|
||||
|
||||
---
|
||||
|
||||
## Full aspect map for GROUND
|
||||
|
||||
Aspects marked **modular** have entries under `editions/modules/`.
|
||||
Aspects marked **fixed (r0)** are part of the baseline until someone
|
||||
proposes a competing module.
|
||||
Aspects marked **product** may never need a kernel module.
|
||||
|
||||
### A. Structure — when and how the session runs
|
||||
|
||||
| Aspect id | Question | GROUND today | Modular? |
|
||||
|-----------|----------|--------------|----------|
|
||||
| `player_structure` | Who plays? seats? teams? | 2–6 seats; modes redefine who wins | fixed (r0) |
|
||||
| `objective_scoring` | What is success / who wins? | Modes: co-op / semi / coalition + thresholds | fixed (r0 modes cards) |
|
||||
| `turn_time_structure` | How does play advance? | Simultaneous select–reveal–resolve; Lead | fixed (r0) |
|
||||
| `end_condition` | When does the game stop? | Fixed 5 rounds + score | **modular** |
|
||||
| `setup` | What is on the table at start? | Scenario + mode; mats; start Stress 2 | fixed (r0); future difficulty card |
|
||||
| `information` | What is hidden vs public? | Hidden Problems; face-down actions; DENY | fixed (r0) |
|
||||
|
||||
### B. Content economy — what enters play
|
||||
|
||||
| Aspect id | Question | GROUND today | Modular? |
|
||||
|-----------|----------|--------------|----------|
|
||||
| `problem_deal` | How do Problems enter play? | Surface + hidden 1..k at setup | **modular** |
|
||||
| `solution_economy` | Hands, draws, suits | Solution deck; INVESTIGATE draws | fixed (r0) |
|
||||
| `action_set` | What may a seat choose? | Investigate, Solve, Support, Attack, GROUND | fixed (r0) |
|
||||
| `legality_filters` | What is offerable when? | SOLVE legality; Stress 4–5 gate | fixed (r0 rulings) |
|
||||
|
||||
### C. Pressure and regulation
|
||||
|
||||
| Aspect id | Question | GROUND today | Modular? |
|
||||
|-----------|----------|--------------|----------|
|
||||
| `individual_state` | Stress, Freedom, arming | Stress 0–5; Freedom token | fixed (r0) |
|
||||
| `problem_stress` | Unclaimed Problems → who gets Stress? | None (until module) | **modular** |
|
||||
| `interaction_stress` | Attack/Support stress numbers | As printed on Actions | fixed (r0) |
|
||||
| `attack_relief` | Does ATTACK soothe the attacker? | No | **modular** |
|
||||
| `reflex_sequences` | Multi-round binding chains | DARVO DENY→ATTACK→REVERSE | fixed (r0); future pacing module |
|
||||
| `regulation_practices` | How you exit pressure | GROUND GR/OU/ND; Bond Support | fixed (r0); future GROUND-sequence module |
|
||||
|
||||
### D. Relationships
|
||||
|
||||
| Aspect id | Question | GROUND today | Modular? |
|
||||
|-----------|----------|--------------|----------|
|
||||
| `relation_structure` | Bonds, Rivalries, slots | 2 slots; Bond/Rivalry | fixed (r0) |
|
||||
| `relation_scoring` | Do networks win? | Coalition mode | under `objective_scoring` / modes |
|
||||
| `relation_stress` | Shared liability via Bonds | Bond-scope under `problem_stress.scoped` | via problem_stress modules |
|
||||
|
||||
### E. Product and frame (often outside kernel)
|
||||
|
||||
| Aspect id | Question | GROUND today | Modular? |
|
||||
|-----------|----------|--------------|----------|
|
||||
| `scenario_fiction` | Thematic conflict | Scenarios.csv | content, not rules module |
|
||||
| `safety_teaching_frame` | How DARVO is framed | Rules_Text safety; INTENT | product |
|
||||
| `difficulty_accessibility` | Learning vs mastery | WP-0005; H2 scope mix as dial | future modules |
|
||||
| `medium` | Print vs digital | Edition CSV vs clay-borg | product |
|
||||
|
||||
---
|
||||
|
||||
## Registered aspects (have module directories)
|
||||
|
||||
These appear in `catalog.yaml` `aspects:` and accept non-default modules:
|
||||
|
||||
| Aspect | Default module | Other modules |
|
||||
|--------|----------------|---------------|
|
||||
| `problem_stress` | `problem_stress.none` | `flat_any_open`, `scoped` |
|
||||
| `attack_relief` | `attack_relief.none` | `self_soothe_ge4` |
|
||||
| `end_condition` | `end_condition.fixed_rounds_5` | `hybrid_clear_collapse` (proposed) |
|
||||
| `problem_deal` | `problem_deal.fixed_setup` | `pressure_deck` (proposed) |
|
||||
|
||||
---
|
||||
|
||||
## Configuration as a vector
|
||||
|
||||
```text
|
||||
playable configuration =
|
||||
baseline content (ground-darvo-rN)
|
||||
× problem_stress
|
||||
× attack_relief
|
||||
× end_condition
|
||||
× problem_deal
|
||||
× …future modular aspects…
|
||||
```
|
||||
|
||||
Missing aspects use defaults. clay-borg should **persist the full resolved
|
||||
module list** (and baseline id) on every game so measurements name the
|
||||
point in design space, not only a legacy experiment slug.
|
||||
|
||||
---
|
||||
|
||||
## Adding an aspect
|
||||
|
||||
1. Add a row to the tables above (this file).
|
||||
2. If two competing designs exist (or one alternative to r0): register in
|
||||
`catalog.yaml` `aspects:`, create `editions/modules/<aspect>/…`.
|
||||
3. Do not overload an existing aspect with unrelated rules (e.g. do not put
|
||||
end-of-game into `problem_stress`).
|
||||
4. Prefer measuring a new module **alone**, then in profiles with others.
|
||||
|
||||
---
|
||||
|
||||
## Relation to external frameworks
|
||||
|
||||
See clay-borg **CB-RES-0010** for sources. Short map:
|
||||
|
||||
| Framework | How it maps here |
|
||||
|-----------|------------------|
|
||||
| Formal elements (Fullerton et al.) | Coarse checklist → our Structure / Economy groups |
|
||||
| MDA (Hunicke et al.) | Module = Mechanics; panels = Dynamics; intent = Aesthetics |
|
||||
| Characteristics of Games (Elias/Garfield/Gutschera) | Independent dimensions → our aspects |
|
||||
| Design space | Configuration = point in multi-aspect space |
|
||||
| Extensive-form game theory | Analysis substrate (CB-RES-0009), not the aspect list |
|
||||
141
editions/CATALOG.md
Normal file
141
editions/CATALOG.md
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
# Edition & rules catalog (schema 2 — composable modules by **aspect**)
|
||||
|
||||
**Authority:** this file + [`catalog.yaml`](catalog.yaml) on `main`.
|
||||
**Aspect map:** [`ASPECTS.md`](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](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
|
||||
|
||||
```yaml
|
||||
baseline: ground-darvo-r0
|
||||
modules:
|
||||
- problem_stress.scoped
|
||||
- end_condition.hybrid_clear_collapse # when implemented
|
||||
# other aspects → defaults
|
||||
```
|
||||
|
||||
Or:
|
||||
|
||||
```yaml
|
||||
profile: h2
|
||||
# expands to modules: [problem_stress.scoped]
|
||||
```
|
||||
|
||||
Or multi-aspect:
|
||||
|
||||
```yaml
|
||||
profile: scoped_plus_attack_soothe
|
||||
# problem_stress.scoped + attack_relief.self_soothe_ge4
|
||||
```
|
||||
|
||||
### Validation
|
||||
|
||||
1. Every `module_id` exists and `selectable: true`.
|
||||
2. No two modules share the same **aspect**.
|
||||
3. `status: proposed` modules may be selected only if the host declares `allow_proposed: true` (kernel may no-op or refuse).
|
||||
4. 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` + optional `data_overlays` from its `path`.
|
||||
- Apply modules in **aspect order** listed in `catalog.yaml` `aspects:` (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)
|
||||
|
||||
1. Confirm the **aspect** exists in [ASPECTS.md](ASPECTS.md); add the aspect first if needed.
|
||||
2. Create `editions/modules/<aspect>/<slug>/` with `MODULE.md` and, if non-default, `rules_delta.yaml` (+ CSV overlays if needed).
|
||||
3. Register under `modules:` with `aspect`, `path`, `status`, `decision`.
|
||||
4. Optionally add a **profile** that includes it alone and/or with other modules.
|
||||
5. Message clay-borg: `module_id`, aspect, delta path, compose examples.
|
||||
6. Measure **alone** first when possible; then measure interesting **profiles**.
|
||||
7. Update `utility_estimate` / `decision` per 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` |
|
||||
|
|
@ -1,17 +1,19 @@
|
|||
# GROUND edition catalog — schema 2: composable modules
|
||||
# Docs: CATALOG.md
|
||||
# clay-borg: select baseline + 0..N modules (≤1 per axis), or a named profile.
|
||||
# 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
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Axes — orthogonal dimensions. At most one non-default module per axis.
|
||||
# Aspects — orthogonal design dimensions (formerly "axes"). At most one non-default module per aspect.
|
||||
# ---------------------------------------------------------------------------
|
||||
axes:
|
||||
aspects:
|
||||
- id: problem_stress
|
||||
# legacy key: axis (same meaning)
|
||||
title: Problem → Stress routing
|
||||
default_module: problem_stress.none
|
||||
summary: >
|
||||
|
|
@ -35,7 +37,7 @@ axes:
|
|||
summary: >
|
||||
Fixed setup deal only vs mid-game influx (pressure deck, etc.).
|
||||
|
||||
# Future axes (not yet registered): setup_difficulty, sequence_pacing,
|
||||
# Future aspects (not yet registered): setup_difficulty, sequence_pacing,
|
||||
# ground_as_sequence, status_stress, competence_track.
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
|
@ -50,7 +52,7 @@ baselines:
|
|||
title: "GROUND DARVO Edition — core r0"
|
||||
summary: >
|
||||
Print/playtest content. Modes, deal 6/9/12, thresholds 5/7/9.
|
||||
Default modules on all axes = r0 printed behaviour.
|
||||
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.
|
||||
|
|
@ -62,7 +64,7 @@ baselines:
|
|||
modules:
|
||||
# --- problem_stress ---
|
||||
- module_id: problem_stress.none
|
||||
axis: problem_stress
|
||||
aspect: problem_stress
|
||||
path: editions/modules/problem_stress/none
|
||||
is_default: true
|
||||
selectable: true
|
||||
|
|
@ -72,7 +74,7 @@ modules:
|
|||
decision: none
|
||||
|
||||
- module_id: problem_stress.flat_any_open
|
||||
axis: problem_stress
|
||||
aspect: problem_stress
|
||||
path: editions/modules/problem_stress/flat_any_open
|
||||
is_default: false
|
||||
selectable: true
|
||||
|
|
@ -88,7 +90,7 @@ modules:
|
|||
clay_borg_notes: Former H1-A; implement without H1-B unless attack_relief also selected.
|
||||
|
||||
- module_id: problem_stress.scoped
|
||||
axis: problem_stress
|
||||
aspect: problem_stress
|
||||
path: editions/modules/problem_stress/scoped
|
||||
is_default: false
|
||||
selectable: true
|
||||
|
|
@ -109,7 +111,7 @@ modules:
|
|||
|
||||
# --- attack_relief ---
|
||||
- module_id: attack_relief.none
|
||||
axis: attack_relief
|
||||
aspect: attack_relief
|
||||
path: editions/modules/attack_relief/none
|
||||
is_default: true
|
||||
selectable: true
|
||||
|
|
@ -119,7 +121,7 @@ modules:
|
|||
decision: none
|
||||
|
||||
- module_id: attack_relief.self_soothe_ge4
|
||||
axis: attack_relief
|
||||
aspect: attack_relief
|
||||
path: editions/modules/attack_relief/self_soothe_ge4
|
||||
is_default: false
|
||||
selectable: true
|
||||
|
|
@ -136,7 +138,7 @@ modules:
|
|||
|
||||
# --- end_condition ---
|
||||
- module_id: end_condition.fixed_rounds_5
|
||||
axis: end_condition
|
||||
aspect: end_condition
|
||||
path: editions/modules/end_condition/fixed_rounds_5
|
||||
is_default: true
|
||||
selectable: true
|
||||
|
|
@ -146,7 +148,7 @@ modules:
|
|||
decision: none
|
||||
|
||||
- module_id: end_condition.hybrid_clear_collapse
|
||||
axis: end_condition
|
||||
aspect: end_condition
|
||||
path: editions/modules/end_condition/hybrid_clear_collapse
|
||||
is_default: false
|
||||
selectable: true
|
||||
|
|
@ -161,7 +163,7 @@ modules:
|
|||
|
||||
# --- problem_deal ---
|
||||
- module_id: problem_deal.fixed_setup
|
||||
axis: problem_deal
|
||||
aspect: problem_deal
|
||||
path: editions/modules/problem_deal/fixed_setup
|
||||
is_default: true
|
||||
selectable: true
|
||||
|
|
@ -171,7 +173,7 @@ modules:
|
|||
decision: none
|
||||
|
||||
- module_id: problem_deal.pressure_deck
|
||||
axis: problem_deal
|
||||
aspect: problem_deal
|
||||
path: editions/modules/problem_deal/pressure_deck
|
||||
is_default: false
|
||||
selectable: true
|
||||
|
|
@ -194,7 +196,7 @@ profiles:
|
|||
- profile_id: baseline
|
||||
title: Pure r0
|
||||
modules: []
|
||||
summary: All axis defaults — printed ground-darvo-r0 behaviour.
|
||||
summary: All aspect defaults — printed ground-darvo-r0 behaviour.
|
||||
|
||||
- profile_id: h1
|
||||
title: Legacy H1 (flat problem stress + attack soothe)
|
||||
|
|
@ -218,7 +220,7 @@ profiles:
|
|||
modules:
|
||||
- problem_stress.scoped
|
||||
- attack_relief.self_soothe_ge4
|
||||
summary: First intentional multi-axis combo after modular catalog.
|
||||
summary: First intentional multi-aspect combo after modular catalog.
|
||||
status: unmeasured
|
||||
|
||||
- profile_id: scoped_plus_hybrid_end
|
||||
|
|
|
|||
|
|
@ -58,17 +58,35 @@ the adversarial review ([CB-REV-0001](../../reviews/CB-REV-0001-h1.md))
|
|||
reported it unverified and it was a real gap.
|
||||
|
||||
```
|
||||
sha256 cd0c0db9eef5e9f94df6c1b26837c5e800d9eb8c79ee113a537767aa88934c76 ../catalog.yaml
|
||||
sha256 84d43ac110615a678276c318a64a26d9996a9f3f2edbb1b72c38c3e12cf68149 ../ASPECTS.md
|
||||
sha256 684abb9856e81d456eb214efc7bcfc643e06200451daae1653c528a8b93f5c66 ../CATALOG.md
|
||||
sha256 297c36c67f19a3ccdab152c928f94ff39c861c7ce836c9dfc10a773a7fe51ee2 ../catalog.yaml
|
||||
sha256 7b1cc0149122b855e827bc930576ed165bf7dd8d62707e845a9e514ce3521f8e ../experiments/h1-problem-stress/Actions.csv
|
||||
sha256 62785f5e7e245c60171624d15de2f40187a44fec54f93c7d9705cf52584b1078 ../experiments/h1-problem-stress/Rules_Text.csv
|
||||
sha256 49897a68056643a8cfccff32c9e4a9811018b4e4689b90a85124a487f2318369 ../experiments/h1-problem-stress/VARIANT.md
|
||||
sha256 443199db94601cc889557e5e86823f374dbfdf875962fc84f95c01865605101c ../experiments/h1-problem-stress/metadata.json
|
||||
sha256 f58e81f84ea2b0d16e39932261eb3f3d9890345cdf37ad6f0b3abc00636840be ../experiments/h1-problem-stress/rules_delta.yaml
|
||||
sha256 4c81bae21d2ecb70c7424fa17445246a9b551b10e258d448634816c564e28f09 ../experiments/h2-scoped-problem-stress/Problems.csv
|
||||
sha256 8ed8deb7ad142de1bda70dc11add339f742e8c12ac1f02d5f7c7ec8f17f77b1d ../experiments/h2-scoped-problem-stress/Rules_Text.csv
|
||||
sha256 b0ffea41820ef35960d8c75ff0a734370a29a738e49fda74851fe5c2daafe53e ../experiments/h2-scoped-problem-stress/VARIANT.md
|
||||
sha256 abf994f585fdfa9b2822614a7961e98141cded6a91c446916ff7fd48642de0a7 ../experiments/h2-scoped-problem-stress/metadata.json
|
||||
sha256 8dc569b2ae62f88f7f64e282bc6bba3dbcc3ffcad276591baafbdd24cb6c16b7 ../experiments/h2-scoped-problem-stress/rules_delta.yaml
|
||||
sha256 f58e81f84ea2b0d16e39932261eb3f3d9890345cdf37ad6f0b3abc00636840be ../experiments/h1-problem-stress/rules_delta.yaml
|
||||
sha256 7b1cc0149122b855e827bc930576ed165bf7dd8d62707e845a9e514ce3521f8e ../experiments/h1-problem-stress/Actions.csv
|
||||
sha256 62785f5e7e245c60171624d15de2f40187a44fec54f93c7d9705cf52584b1078 ../experiments/h1-problem-stress/Rules_Text.csv
|
||||
sha256 49897a68056643a8cfccff32c9e4a9811018b4e4689b90a85124a487f2318369 ../experiments/h1-problem-stress/VARIANT.md
|
||||
sha256 443199db94601cc889557e5e86823f374dbfdf875962fc84f95c01865605101c ../experiments/h1-problem-stress/metadata.json
|
||||
sha256 54678e312332ab999826710ae30565c0bba4da76b781ba4f391ace0c4341e484 ../modules/attack_relief/none/MODULE.md
|
||||
sha256 0eec2ef761c5f6548085156248f182fa077ac5aee7c657bd6bfa6ba22d53446b ../modules/attack_relief/self_soothe_ge4/MODULE.md
|
||||
sha256 91463363a482219109bb6d5033019135b5b10505f55f6272b912c7a51cd90173 ../modules/attack_relief/self_soothe_ge4/rules_delta.yaml
|
||||
sha256 a02aa5ee860aca71d3e7c19975dd5eb1c66d7c8a0f3d3ceca8dd9914b85d6c7e ../modules/end_condition/fixed_rounds_5/MODULE.md
|
||||
sha256 6d7d1f5b1d629b61dc35299606393cdac969379bb6207b5c1e741ddbbf50c06e ../modules/end_condition/hybrid_clear_collapse/MODULE.md
|
||||
sha256 8dda4def373cd4aaaefdf764c915ad54ae7a1b4d885ee2cd623e81f752fdb907 ../modules/end_condition/hybrid_clear_collapse/rules_delta.yaml
|
||||
sha256 5b809680afdf9282a457f8d7f70b111bf18590f4867622e332f49e1ee4a23b08 ../modules/problem_deal/fixed_setup/MODULE.md
|
||||
sha256 d8ddf74127aa6adf32be6a9e30dac4e6b9ff14da1a9e0bb74d2faf22794e8a57 ../modules/problem_deal/pressure_deck/MODULE.md
|
||||
sha256 c05addd208e9d2c287a8da8a2112e24a6b30aa163b19fe763362eae59598ce30 ../modules/problem_deal/pressure_deck/rules_delta.yaml
|
||||
sha256 a5e66fd60abef1cf965b0b20892548c65f4005c45f4d44c025e4756eff579897 ../modules/problem_stress/flat_any_open/MODULE.md
|
||||
sha256 95fa5d4ad811407eda1cf31d99d5dd984e9d1d9af8c284e10df598874d0f06e3 ../modules/problem_stress/flat_any_open/rules_delta.yaml
|
||||
sha256 1e9cb6e2dac046a9f48beccb0ddc09c41608306711320159ecdce3572562e454 ../modules/problem_stress/none/MODULE.md
|
||||
sha256 aae98322a70e51b639b8c39ac45604807f5311ae55edc75b47199056a483c963 ../modules/problem_stress/scoped/MODULE.md
|
||||
sha256 4c81bae21d2ecb70c7424fa17445246a9b551b10e258d448634816c564e28f09 ../modules/problem_stress/scoped/Problems.csv
|
||||
sha256 8ed8deb7ad142de1bda70dc11add339f742e8c12ac1f02d5f7c7ec8f17f77b1d ../modules/problem_stress/scoped/Rules_Text.csv
|
||||
sha256 960e8a35f5f214ff9936ea95c4ca9a9145e2a01a8258b1c873251b89ee23972f ../modules/problem_stress/scoped/rules_delta.yaml
|
||||
```
|
||||
|
||||
**H2 vendored 2026-08-08** (CB-WP-0042). Its `Problems.csv` is r0's with
|
||||
|
|
@ -110,3 +128,22 @@ Per GROUND-WP-0002 T01's contract: `point_value` and
|
|||
engine hashes game state and both values are *in* that state, so a silent
|
||||
change would rot every recorded scenario expectation. A change to either
|
||||
is a new revision (`-r1`), and this digest is what notices.
|
||||
|
||||
## The catalog & module mirror (CB-WP-0048)
|
||||
|
||||
`editions/catalog.yaml`, `ASPECTS.md`, `CATALOG.md` and `modules/` mirror
|
||||
ground-game so tools resolve paths without requiring a sibling checkout.
|
||||
**ground-game remains the authority** for every design decision in them.
|
||||
|
||||
They are recorded above like any other sibling. The digest block is
|
||||
**generated by walking `editions/`**, not typed: CB-REV-0002 #8 and
|
||||
CB-REV-0003 #8 both found hand-written lists that made their own controls
|
||||
vacuous, and a mirror that grows a directory is the case that breaks a
|
||||
list a human maintains.
|
||||
|
||||
This note used to be `editions/PROVENANCE-catalog.md` — a file inside the
|
||||
mirrored tree that upstream does not have, which `edition-check` correctly
|
||||
refused as unexplained. Provenance about the mirror is ours, so it lives
|
||||
with our other provenance rather than inside the thing it describes.
|
||||
|
||||
Research framing: `research/CB-RES-0010-game-aspects-and-design-space.md`.
|
||||
|
|
|
|||
7
editions/modules/attack_relief/none/MODULE.md
Normal file
7
editions/modules/attack_relief/none/MODULE.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Module: `attack_relief.none`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `attack_relief` |
|
||||
| **role** | **Default.** ATTACK never reduces attacker Stress. |
|
||||
| **status** | baseline-default |
|
||||
10
editions/modules/attack_relief/self_soothe_ge4/MODULE.md
Normal file
10
editions/modules/attack_relief/self_soothe_ge4/MODULE.md
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# Module: `attack_relief.self_soothe_ge4`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `attack_relief` |
|
||||
| **role** | Uncancelled ATTACK: if attacker Stress was ≥4 before effects → attacker −1 Stress |
|
||||
| **status** | measured only as part of H1; alone unmeasured |
|
||||
| **legacy** | H1-B half of `h1-problem-stress` |
|
||||
|
||||
Under H1, never fired for competent play (Stress stayed <4). Worth re-trying **with** `problem_stress.scoped` as a composition profile.
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
# attack_relief.self_soothe_ge4 (was H1-B)
|
||||
module_id: attack_relief.self_soothe_ge4
|
||||
aspect: attack_relief
|
||||
schema_version: 1
|
||||
base: ground-darvo-r0
|
||||
deltas:
|
||||
- id: AR-H4
|
||||
name: high_stress_attack_self_soothe
|
||||
phase: resolve_attack
|
||||
when:
|
||||
attack_not_cancelled: true
|
||||
attacker_stress_before_attack_effects_gte: 4
|
||||
effect:
|
||||
attacker_stress_delta: -1
|
||||
order: after_target_and_relation_effects
|
||||
notes: Former H1-B alone.
|
||||
unchanged:
|
||||
- deal_and_thresholds
|
||||
- problem_pressure
|
||||
7
editions/modules/end_condition/fixed_rounds_5/MODULE.md
Normal file
7
editions/modules/end_condition/fixed_rounds_5/MODULE.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Module: `end_condition.fixed_rounds_5`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `end_condition` |
|
||||
| **role** | **Default.** Always play Round 1–5, then threshold + mode scoring. |
|
||||
| **status** | baseline-default |
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# Module: `end_condition.hybrid_clear_collapse`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `end_condition` |
|
||||
| **role** | End on **board clear**, **group collapse**, or **max rounds** (default max 5) |
|
||||
| **status** | proposed — not yet implemented in kernel |
|
||||
|
||||
## Draft rules (not frozen)
|
||||
|
||||
1. **Clear:** after Solve, if no unclaimed Problems remain → end game; apply mode scoring (threshold auto-success if claimed value ≥ threshold).
|
||||
2. **Collapse:** if no seat has Stress ≤ 3 **or** majority of seats are in active DARVO → end as group failure (SHARED) / no personal winners (semi/coalition).
|
||||
3. **Ceiling:** if Round Max (5) completes without (1) or (2) → current threshold scoring.
|
||||
|
||||
**Compose with** any problem_stress / deal / attack_relief.
|
||||
**Kernel:** not shipped — package `rules_delta.yaml` when implemented.
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
# module: end_condition.hybrid_clear_collapse — PROPOSED
|
||||
module_id: end_condition.hybrid_clear_collapse
|
||||
aspect: end_condition
|
||||
schema_version: 1
|
||||
base: ground-darvo-r0
|
||||
status: proposed
|
||||
implementation: pending
|
||||
|
||||
deltas:
|
||||
- id: END-CLEAR
|
||||
name: early_end_board_clear
|
||||
phase: after_solve_step
|
||||
when:
|
||||
unclaimed_problems_in_play: 0
|
||||
effect:
|
||||
end_game: true
|
||||
scoring: mode_as_usual
|
||||
note: threshold treated as met if claimed_value >= threshold
|
||||
|
||||
- id: END-COLLAPSE
|
||||
name: early_end_group_collapse
|
||||
phase: round_end_after_stress_clamp
|
||||
when:
|
||||
any_of:
|
||||
- no_seat_with_stress_lte: 3
|
||||
- majority_seats_in_active_darvo: true
|
||||
effect:
|
||||
end_game: true
|
||||
group_success: false
|
||||
personal_winners: none
|
||||
|
||||
- id: END-CEILING
|
||||
name: max_rounds_unchanged
|
||||
phase: after_round
|
||||
when:
|
||||
round_completed: 5
|
||||
effect:
|
||||
end_game: true
|
||||
scoring: mode_as_usual
|
||||
7
editions/modules/problem_deal/fixed_setup/MODULE.md
Normal file
7
editions/modules/problem_deal/fixed_setup/MODULE.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Module: `problem_deal.fixed_setup`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `problem_deal` |
|
||||
| **role** | **Default.** Surface + hidden 1..k at setup only; no mid-game Problem influx. |
|
||||
| **status** | baseline-default |
|
||||
16
editions/modules/problem_deal/pressure_deck/MODULE.md
Normal file
16
editions/modules/problem_deal/pressure_deck/MODULE.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Module: `problem_deal.pressure_deck`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `problem_deal` |
|
||||
| **role** | Start with a small set; draw additional scoped Problems mid-game from a Pressure deck |
|
||||
| **status** | proposed — not yet implemented |
|
||||
|
||||
## Draft rules (not frozen)
|
||||
|
||||
1. **Setup:** Surface (global) + 1–2 starters (mostly personal). Remaining scenario Problems form face-down **Pressure deck** (shuffled).
|
||||
2. **Influx:** at Round End, if unclaimed count < open_cap (e.g. seats) and deck non-empty, draw 1 into play face-down (or face-up if global).
|
||||
3. **Owner:** personal → next clockwise from Lead among seats / drawer rule TBD; bond → owner’s network; global → none.
|
||||
4. **Scoring (v0):** drawn cards may be **stress-only (0 points)** so thresholds stay on starters — decide before kernel work.
|
||||
|
||||
**Compose with** `problem_stress.scoped` (recommended) so drawn scopes matter.
|
||||
34
editions/modules/problem_deal/pressure_deck/rules_delta.yaml
Normal file
34
editions/modules/problem_deal/pressure_deck/rules_delta.yaml
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# module: problem_deal.pressure_deck — PROPOSED
|
||||
module_id: problem_deal.pressure_deck
|
||||
aspect: problem_deal
|
||||
schema_version: 1
|
||||
base: ground-darvo-r0
|
||||
status: proposed
|
||||
implementation: pending
|
||||
|
||||
deltas:
|
||||
- id: DEAL-START
|
||||
name: reduced_initial_deal
|
||||
phase: setup
|
||||
effect:
|
||||
initial_in_play: [surface, hidden_priority_1]
|
||||
# optional: also priority_2 at 4p+
|
||||
remainder_to: pressure_deck
|
||||
pressure_deck_shuffle: deterministic_seeded
|
||||
|
||||
- id: DEAL-INFLUX
|
||||
name: end_round_draw_if_room
|
||||
phase: round_end
|
||||
when:
|
||||
pressure_deck_nonempty: true
|
||||
unclaimed_count_lt: open_cap # open_cap := seats (proposed)
|
||||
effect:
|
||||
draw_problems: 1
|
||||
place: in_play_face_down_unless_global
|
||||
|
||||
- id: DEAL-POINTS
|
||||
name: drawn_card_scoring
|
||||
phase: data
|
||||
effect:
|
||||
drawn_point_value: 0 # v0: stress-only; revisit
|
||||
starter_threshold_unchanged: true
|
||||
14
editions/modules/problem_stress/flat_any_open/MODULE.md
Normal file
14
editions/modules/problem_stress/flat_any_open/MODULE.md
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# Module: `problem_stress.flat_any_open`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `problem_stress` |
|
||||
| **role** | End of round: if **any** Problem unclaimed → **each** seat +1 Stress |
|
||||
| **status** | measured → reject as sole pressure (H1-A); keep for A/B |
|
||||
| **legacy** | H1-A half of `h1-problem-stress` |
|
||||
| **measurement** | [RPT-0004](../../../../reports/260808-clay-borg-h1-measured.md) |
|
||||
|
||||
**Compose with:** any `end_condition`, `problem_deal`, `attack_relief`.
|
||||
**Conflicts with:** other `problem_stress.*` modules (one per aspect).
|
||||
|
||||
Known result: flat tax → solve-rate collapse at 3p+ under greedy (when used alone or with H1-B).
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# problem_stress.flat_any_open (was H1-A)
|
||||
module_id: problem_stress.flat_any_open
|
||||
aspect: problem_stress
|
||||
schema_version: 1
|
||||
base: ground-darvo-r0
|
||||
deltas:
|
||||
- id: PS-FLAT
|
||||
name: flat_any_open_problem_pressure
|
||||
phase: round_end
|
||||
when:
|
||||
any_problem_unclaimed: true
|
||||
effect:
|
||||
each_player_stress_delta: 1
|
||||
notes: Former H1-A alone. +1 to every seat if any unclaimed Problem remains.
|
||||
unchanged:
|
||||
- deal_and_thresholds
|
||||
- attack_resolution
|
||||
- solve_legality
|
||||
9
editions/modules/problem_stress/none/MODULE.md
Normal file
9
editions/modules/problem_stress/none/MODULE.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# Module: `problem_stress.none`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `problem_stress` |
|
||||
| **role** | **Default.** Unclaimed Problems do not raise Stress. |
|
||||
| **status** | baseline-default |
|
||||
|
||||
This is the implicit r0 behaviour. No `rules_delta`; selecting it means “no problem_stress module active.”
|
||||
13
editions/modules/problem_stress/scoped/MODULE.md
Normal file
13
editions/modules/problem_stress/scoped/MODULE.md
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
# Module: `problem_stress.scoped`
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **aspect** | `problem_stress` |
|
||||
| **role** | Unclaimed Problems +1 Stress to **stress_scope** only (personal / bond / global) |
|
||||
| **status** | measured → keep-as-experiment; candidate for core |
|
||||
| **legacy** | `h2-scoped-problem-stress` |
|
||||
| **measurement** | [RPT-0005](../../../../reports/260808-clay-borg-h2-measured.md) |
|
||||
|
||||
Bond network shares ticks → joint SOLVE incentive (bots do not test joint motive).
|
||||
**Compose with:** end, deal, attack_relief independently.
|
||||
**Conflicts with:** other `problem_stress.*`.
|
||||
21
editions/modules/problem_stress/scoped/Problems.csv
Normal file
21
editions/modules/problem_stress/scoped/Problems.csv
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
problem_id,scenario_id,visibility,stress_scope,hidden_priority,title,problem_text,required_solution,symbol_id,point_value,front_rules,reveal_effect,unresolved_effect,back_design_id
|
||||
PRB_01_S,SCN_01,Surface,global,0,Deadline Missed,A promised result was not delivered when expected.,Repair,SYM_REPAIR,2,Resolve with Repair. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=global (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM_SURFACE
|
||||
PRB_01_1,SCN_01,Hidden,personal,1,Unclear Ownership,Responsibility for the commitment and the work was never made explicit.,Clarify,SYM_CLARIFY,2,Resolve with Clarify. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_01_2,SCN_01,Hidden,personal,2,Unspoken Overload,The work required more capacity than someone could safely or fairly provide.,Boundary,SYM_BOUNDARY,2,Resolve with Boundary. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_01_3,SCN_01,Hidden,bond,3,Bad News Was Delayed,A warning was withheld until the remaining options became worse.,Repair,SYM_REPAIR,3,Resolve with Repair. Value: 3.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=bond (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_01_4,SCN_01,Hidden,personal,4,No Checkpoint Process,The group had no reliable moment for testing progress and changing course.,Change,SYM_CHANGE,3,Resolve with Change. Value: 3.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_02_S,SCN_02,Surface,global,0,Shared Task Left Undone,"A recurring responsibility was not completed, and others absorbed the impact.",Repair,SYM_REPAIR,2,Resolve with Repair. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=global (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM_SURFACE
|
||||
PRB_02_1,SCN_02,Hidden,personal,1,Different Standards,"Players were using different definitions of complete, timely, or fair.",Clarify,SYM_CLARIFY,2,Resolve with Clarify. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_02_2,SCN_02,Hidden,personal,2,Invisible Workload,Some contributions and constraints were not visible to the group.,Boundary,SYM_BOUNDARY,2,Resolve with Boundary. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_02_3,SCN_02,Hidden,bond,3,Resentment Never Raised,Frustration accumulated without a direct request or acknowledgement.,Repair,SYM_REPAIR,3,Resolve with Repair. Value: 3.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=bond (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_02_4,SCN_02,Hidden,personal,4,No Ownership Routine,The group relied on goodwill instead of a dependable allocation method.,Change,SYM_CHANGE,3,Resolve with Change. Value: 3.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_03_S,SCN_03,Surface,global,0,Decision Announced as Settled,A group-affecting choice was presented as final before meaningful agreement.,Boundary,SYM_BOUNDARY,2,Resolve with Boundary. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=global (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM_SURFACE
|
||||
PRB_03_1,SCN_03,Hidden,personal,1,Mandate Was Ambiguous,"It was unclear who could decide, advise, consent, or veto.",Clarify,SYM_CLARIFY,2,Resolve with Clarify. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_03_2,SCN_03,Hidden,personal,2,Contributions Were Dismissed,Relevant input was ignored or treated as less legitimate.,Repair,SYM_REPAIR,2,Resolve with Repair. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_03_3,SCN_03,Hidden,bond,3,One Voice Spoke for Others,A player claimed authority to represent people who had not agreed.,Boundary,SYM_BOUNDARY,3,Resolve with Boundary. Value: 3.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=bond (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_03_4,SCN_03,Hidden,personal,4,No Decision Rule,The group had no shared method for turning discussion into a legitimate choice.,Change,SYM_CHANGE,3,Resolve with Change. Value: 3.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_04_S,SCN_04,Surface,global,0,Private Information Spread,Information moved beyond the circle in which it was originally shared.,Repair,SYM_REPAIR,2,Resolve with Repair. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=global (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM_SURFACE
|
||||
PRB_04_1,SCN_04,Hidden,personal,1,Confidentiality Was Assumed,The players never made the scope of confidentiality explicit.,Clarify,SYM_CLARIFY,2,Resolve with Clarify. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_04_2,SCN_04,Hidden,personal,2,Exposure Caused Harm,"The sharing changed another player's safety, reputation, or freedom to choose.",Repair,SYM_REPAIR,2,Resolve with Repair. Value: 2.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_04_3,SCN_04,Hidden,bond,3,Consent Boundary Was Ignored,A clear or reasonably expected limit on sharing was crossed.,Boundary,SYM_BOUNDARY,3,Resolve with Boundary. Value: 3.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=bond (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
PRB_04_4,SCN_04,Hidden,personal,4,No Sharing Protocol,"The group lacked a repeatable rule for consent, need-to-know, and escalation.",Change,SYM_CHANGE,3,Resolve with Change. Value: 3.,None in the core set.,"H2: while unclaimed, +1 Stress at Round End to stress_scope=personal (personal=owner; bond=owner's Bond network; global=all).",BACK_PROBLEM
|
||||
|
23
editions/modules/problem_stress/scoped/Rules_Text.csv
Normal file
23
editions/modules/problem_stress/scoped/Rules_Text.csv
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
order,section,heading,body
|
||||
1,Object,What players are trying to do,"Uncover hidden Problems and solve them with matching Solutions before the end of Round 5. Support, Attack, Bonds, Rivalries, Stress, DARVO, and GROUND determine how much freedom each player retains while doing so. The game is for 2–6 players in every Mode, including SHARED GROUND."
|
||||
2,Setup,Choose the game,"Choose one Scenario card and one Mode card. Always use the Scenario's Surface Problem. Then add hidden Problems by player count: priorities 1–2 for 2 players, 1–3 for 3–4 players, and 1–4 for 5–6 players. Surface is never optional and is never counted as one of those hidden priorities."
|
||||
3,Setup,Problems in play and available value,"Problems in play = Surface + the selected hidden priorities. With the core problem values (2+2+2+3+3), available points are 6 at 2 players, 9 at 3–4 players, and 12 at 5–6 players. Every published setup must keep the Scenario threshold at or below that available total so the group can win in principle."
|
||||
4,Setup,Prepare each player,"Each player takes one mat, the five Action cards with their player symbol, one Stress marker at 2, one ready Freedom token, one DARVO marker at OFF, one Focus/Blame token, and two relation-link tokens. Deal two Solution cards to each player."
|
||||
5,Setup,Prepare the table,"Place the Surface Problem face up and the selected hidden Problems face down. Put the remaining Solution deck within reach. Give the Lead marker to a random player and place the Round marker on 1. H2 stress scope: each Problem has a printed stress_scope (global / personal / bond). Assign owners for every personal and bond Problem in play: in ascending hidden_priority order, assign the next seat clockwise starting from Lead (each assignment uses the next seat). Place that seat's owner marker on the card (or note it). Global Problems have no owner."
|
||||
6,Round,1. Select,"Every player chooses one Action face down and places it beside its target where needed. At Stress 4 or 5, a player must choose ATTACK or GROUND unless they spend a ready Freedom token before reveal."
|
||||
7,Round,2. Reveal,Reveal all selected Actions simultaneously. Players using GROUND choose their mode after seeing the revealed Actions.
|
||||
8,Round,3. Resolve,"Resolve in this order: GROUND, Support, active DARVO stages, Investigate, Attack, Solve. Within the same step, start with the Lead player and continue clockwise."
|
||||
9,Round,4. End,"H2 scoped problem pressure: for each still-unclaimed Problem in play, add +1 Stress to every seat in that Problem's stress_scope (see Problems). Then cap Stress at 0–5. Any player at Stress 5 who is not already in DARVO places their marker on DENY for the next round. Rotate Lead clockwise and advance the Round marker."
|
||||
10,Stress,Stress and Freedom,"Stress 0–3 allows any Action. At Stress 4–5, only ATTACK or GROUND is freely available. Spending a ready Freedom token allows any one Action; turn it to SPENT. GROUND—GR and Support through an existing Bond can ready it. H2: inbound Stress also comes from unclaimed Problems by scope — personal (owner only), bond (owner's Bond network), global (all seats)."
|
||||
11,DARVO,A binding sequence,"Once triggered, DARVO continues from DENY to ATTACK to REVERSE over consecutive rounds even if Stress later falls. Existing Bond Support cancels the current stage and ends the sequence. GROUND—GR lets the current stage resolve, then ends the remaining sequence."
|
||||
12,DARVO,DENY,Turn one visible unsolved Problem face down and mark it Denied. It cannot be solved or revealed by ordinary Investigate. GROUND—OU can restore it.
|
||||
13,DARVO,ATTACK,Make one extra Attack against another player and place your Focus token beside that target. This extra Attack is in addition to your chosen Action.
|
||||
14,DARVO,REVERSE,"Target the player holding your Focus. Unless rejected by GROUND—ND, flip Focus to Blame in front of them, give them +1 Stress, and gain Protection. Reduce your own Stress by 2 and end the sequence."
|
||||
15,Relations,Creating and limiting relations,"Every player has two relation slots. A relation uses one link token from each player. If either player has no free slot, the immediate Support or Attack still works but no new relation is formed. Only one relation may exist between the same two players."
|
||||
16,Relations,Bond,A no-relation Support may create a Bond if both players have a free slot and the target accepts. Support through an existing Bond is strong enough to regulate DARVO. Attack through a Bond causes +2 Stress and flips it to Rivalry.
|
||||
17,Relations,Rivalry,A no-relation Attack creates Rivalry automatically when both slots are available. Attack through Rivalry causes +2 Stress and breaks it. Support through Rivalry causes −1 Stress; the target chooses to flip it to Bond or break it.
|
||||
18,Problems,Hidden and Denied Problems,"Only face-up, non-Denied Problems can be solved. Investigate reveals one hidden Problem and draws one Solution. Deny can turn a previously revealed Problem face down again."
|
||||
19,Problems,Solving,"Play SOLVE beside a face-up Problem and discard one matching Solution when Solve resolves. Claim that Problem and count its printed value. If another player claims it first in Lead order, keep your Solution. H2: any seat with a matching Solution may SOLVE any Problem — claim rights are not limited by stress_scope or owner. Clearing a bond-scoped Problem relieves the whole Bond network."
|
||||
20,Problems,Stress scope (H2 experiment),"Each Problem has stress_scope. global: every seat. personal: the assigned owner only. bond: the owner and every seat connected to the owner through one or more Bonds (the Bond network). If the owner has no Bonds, bond scope behaves as personal. Rivalries do not expand bond scope. Multiple unclaimed Problems stack (+1 each) for seats in their scopes."
|
||||
21,End,End of game,"After Round 5, total solved Problem values and apply the selected Mode card. The Scenario's Standard thresholds are 5 for 2 players, 7 for 3–4 players, and 9 for 5–6 players — always at or below available points for that seat band (6 / 9 / 12)."
|
||||
22,Safety,Learning frame,"DARVO is a response pattern, not proof of an underlying accusation and not a diagnosis. GROUND does not require reconciliation. Breaking a relation, bringing in process, or preserving personal freedom can be a successful result."
|
||||
|
58
editions/modules/problem_stress/scoped/rules_delta.yaml
Normal file
58
editions/modules/problem_stress/scoped/rules_delta.yaml
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
# module: problem_stress.scoped (formerly experiment h2-scoped-problem-stress)
|
||||
# Compose with other axes freely; do not require attack_relief or end/deal modules.
|
||||
|
||||
module_id: problem_stress.scoped
|
||||
aspect: problem_stress
|
||||
schema_version: 1
|
||||
base: ground-darvo-r0
|
||||
legacy_experiment_id: h2-scoped-problem-stress
|
||||
|
||||
deltas:
|
||||
- id: PS-SCOPE
|
||||
name: problem_stress_scope_field
|
||||
phase: data
|
||||
effect:
|
||||
problems_csv_column: stress_scope
|
||||
allowed_values: [global, personal, bond]
|
||||
edition_assignment_by_hidden_priority:
|
||||
0: global
|
||||
1: personal
|
||||
2: personal
|
||||
3: bond
|
||||
4: personal
|
||||
|
||||
- id: PS-OWN
|
||||
name: assign_owners_at_setup
|
||||
phase: setup_after_deal
|
||||
when:
|
||||
problem_stress_scope_in: [personal, bond]
|
||||
effect:
|
||||
assign_owner:
|
||||
order: ascending_hidden_priority_among_in_play_non_global
|
||||
start: lead
|
||||
step: clockwise_next_seat
|
||||
|
||||
- id: PS-TICK
|
||||
name: scoped_problem_pressure_end_of_round
|
||||
phase: round_end
|
||||
when:
|
||||
problem_unclaimed: true
|
||||
effect:
|
||||
stress_delta_per_matching_problem: +1
|
||||
recipients: stress_scope_of_that_problem
|
||||
scope_resolution:
|
||||
global: all_seats
|
||||
personal: [owner]
|
||||
bond: bond_network_of_owner
|
||||
stacking: true
|
||||
|
||||
- id: PS-SOLVE
|
||||
name: claim_not_restricted_by_scope
|
||||
phase: resolve_solve
|
||||
effect:
|
||||
any_seat_with_matching_suit_may_solve: true
|
||||
owner_need_not_be_solver: true
|
||||
|
||||
data_overlays:
|
||||
- Problems.csv
|
||||
- Rules_Text.csv
|
||||
262
research/CB-RES-0010-game-aspects-and-design-space.md
Normal file
262
research/CB-RES-0010-game-aspects-and-design-space.md
Normal file
|
|
@ -0,0 +1,262 @@
|
|||
---
|
||||
id: CB-RES-0010
|
||||
capability: design.space.aspects
|
||||
status: adopted — terminology and structure for ground-game catalog schema 2
|
||||
tier: M
|
||||
date: 2026-08-08
|
||||
upstream: ground-game editions/ASPECTS.md, editions/CATALOG.md
|
||||
related: CB-RES-0009 (extensive form), CB-RES-0007 (design instrument), ADR-0012
|
||||
---
|
||||
|
||||
# CB-RES-0010 — Game aspects, design space, and composable rules modules
|
||||
|
||||
Research digest for **clay-borg** as the simulator and design environment.
|
||||
ground-game owns edition content and the normative catalog; this note
|
||||
records the **concepts and sources** so selection APIs, panels, and
|
||||
recordings evolve around a shared model of **design dimensionality**.
|
||||
|
||||
---
|
||||
|
||||
## 1. Problem this solves
|
||||
|
||||
GROUND rules experiments began as **monolithic packages** (H1, H2): each
|
||||
bundled several independent design decisions. That blocked:
|
||||
|
||||
- measuring one change at a time;
|
||||
- combining two good ideas without rewriting a third package;
|
||||
- naming *what point in design space* a trial actually played.
|
||||
|
||||
ground-game schema 2 replaces mega-experiments with:
|
||||
|
||||
```text
|
||||
configuration = baseline content
|
||||
× aspect₁ (one module)
|
||||
× aspect₂ (one module)
|
||||
× …
|
||||
```
|
||||
|
||||
clay-borg must select, apply, record, and report configurations in those
|
||||
terms.
|
||||
|
||||
---
|
||||
|
||||
## 2. Core vocabulary (normative for this fleet)
|
||||
|
||||
| Term | Meaning | Clay-borg duty |
|
||||
|------|---------|----------------|
|
||||
| **Aspect** | Orthogonal **design dimension** of the game (e.g. end condition, problem→stress routing) | List known aspects; enforce ≤1 module each |
|
||||
| **Module** | One concrete design on one aspect (`problem_stress.scoped`) | Load `rules_delta` + overlays; implement kernel deltas |
|
||||
| **Default module** | Printed / r0 answer when no experiment is selected | Implicit when aspect omitted from selection |
|
||||
| **Profile** | Named list of modules (`h2`, `scoped_plus_attack_soothe`) | Expand to modules; do not treat as separate rules source |
|
||||
| **Baseline** | Content package (`ground-darvo-r0`) | Vendor CSVs; pin digests (ADR-0011) |
|
||||
| **Configuration** | Baseline + **resolved** module list | **Persist on every game / replay / panel cell** |
|
||||
|
||||
**Independence rule:** a module owns only its aspect. Cross-aspect
|
||||
behaviour is an explicit profile (or a new aspect), never a hidden
|
||||
dependency.
|
||||
|
||||
**Synonym:** early ground-game drafts said *axis* for aspect. Prefer
|
||||
**aspect** in UI, docs, and state fields; accept `axis` only as a deprecated
|
||||
alias when reading old configs.
|
||||
|
||||
Authoritative inventory for GROUND:
|
||||
`../ground-game/editions/ASPECTS.md` (sibling checkout) or the vendored
|
||||
copy when present under `editions/`.
|
||||
|
||||
---
|
||||
|
||||
## 3. Is there an established concept? (sources)
|
||||
|
||||
There is **no single standard named “aspects of a game”** with a fixed ISO
|
||||
list. Several traditions describe the same idea: **games as a point in a
|
||||
multi-dimensional design space**.
|
||||
|
||||
### 3.1 Game design (primary fit)
|
||||
|
||||
| Source | Idea | Use for us |
|
||||
|--------|------|------------|
|
||||
| **Tracy Fullerton**, *Game Design Workshop* — formal elements | Players, objectives, procedures, rules, resources, conflict, boundaries, outcome | Coarse checklist; maps to Structure / Economy groups in ASPECTS.md |
|
||||
| **Hunicke, LeBlanc, Zubek** — **MDA** (Mechanics–Dynamics–Aesthetics) | Mechanics generate dynamics; dynamics produce aesthetics | Module = mechanic change; panel = dynamics; design intent = aesthetics. Findings (ADR-0012) sit on dynamics. |
|
||||
| **Elias, Garfield, Gutschera** — *Characteristics of Games* | Games differ along **independent dimensions** (player count, outcome type, information, length, skill/chance, diplomacy, …) | Closest published match to “dimensionality of a game” as separable choices |
|
||||
| **Design space / possibility space** (common practice; e.g. Salen & Zimmerman *Rules of Play* discourse; modern “explore the design space”) | Varying parameters yields a space of games | Configuration = coordinates; modules = values on coordinates |
|
||||
| **BoardGameGeek mechanics taxonomy** | Named mechanisms (worker placement, …) | Vocabulary only — overlapping, not an orthogonal basis |
|
||||
|
||||
### 3.2 Game theory (analysis substrate, not the aspect list)
|
||||
|
||||
| Source | Idea | Use for us |
|
||||
|--------|------|------------|
|
||||
| **Extensive-form games** (von Neumann–Morgenstern lineage; modern texts e.g. Osborne, *An Introduction to Game Theory*) | Histories, information sets, chance, terminal payoffs | Formal object for *analysis* (see CB-RES-0009). Simultaneous moves = sequenced + hidden. |
|
||||
| **Normal / strategic form** | Players, action sets, payoff matrices | Too coarse for multi-round DARVO sequences and hidden Problems |
|
||||
| **Mechanism design** | Choosing rules to induce outcomes | Useful metaphor for “we design modules to shift incentives”; not a list of aspects |
|
||||
|
||||
**Do not** derive the aspect list from game theory alone. Derive aspects
|
||||
from **what designers vary**; use game theory to **measure incentives**
|
||||
inside a fixed configuration (e.g. “does ATTACK pay?”).
|
||||
|
||||
### 3.3 AI / general game playing (implementation relatives)
|
||||
|
||||
| Source | Idea | Use for us |
|
||||
|--------|------|------------|
|
||||
| **Ludii GDL** / general game systems | Declarative game description; universality results for extensive form | Confirms EFG as lingua franca (CB-RES-0009); not a substitute for aspect modularity |
|
||||
| **OpenSpiel**, **RBG**, etc. | Multi-game research APIs | Comparable “game + parameters” thinking; our parameters are *design modules*, not only RNG seeds |
|
||||
|
||||
### 3.4 What we claim (and do not)
|
||||
|
||||
**Claim:** Treating GROUND rules variation as **modules on aspects** is
|
||||
consistent with design-space practice and *Characteristics of Games*
|
||||
dimensional thinking, operationalized for edition + simulator work.
|
||||
|
||||
**Do not claim:** That “aspect” is a reserved term in game theory, or that
|
||||
our aspect list is complete for all games forever.
|
||||
|
||||
---
|
||||
|
||||
## 4. GROUND aspect groups (summary)
|
||||
|
||||
Full tables live in ground-game `editions/ASPECTS.md`. Groups:
|
||||
|
||||
| Group | Examples | Modular today? |
|
||||
|-------|----------|----------------|
|
||||
| **A. Structure** | end condition, turn structure, setup, information | `end_condition` modular; others mostly fixed r0 |
|
||||
| **B. Content economy** | problem deal, solution economy, action set | `problem_deal` modular (proposed pressure deck) |
|
||||
| **C. Pressure & regulation** | problem_stress, attack_relief, DARVO, GROUND | `problem_stress`, `attack_relief` modular |
|
||||
| **D. Relationships** | bonds, rivalry, network scoring | fixed r0; bond-scope via problem_stress.scoped |
|
||||
| **E. Product / frame** | scenario fiction, safety, difficulty, medium | mostly content / process |
|
||||
|
||||
Registered modular aspects (must be in selection validation):
|
||||
|
||||
1. `problem_stress` — default `none`; also `flat_any_open`, `scoped`
|
||||
2. `attack_relief` — default `none`; also `self_soothe_ge4`
|
||||
3. `end_condition` — default `fixed_rounds_5`; also `hybrid_clear_collapse` (proposed)
|
||||
4. `problem_deal` — default `fixed_setup`; also `pressure_deck` (proposed)
|
||||
|
||||
---
|
||||
|
||||
## 5. Implications for clay-borg (design environment)
|
||||
|
||||
### 5.1 Selection API
|
||||
|
||||
Prefer:
|
||||
|
||||
```yaml
|
||||
baseline: ground-darvo-r0
|
||||
modules: [problem_stress.scoped]
|
||||
# or
|
||||
profile: h2
|
||||
```
|
||||
|
||||
Legacy experiment ids (`h1-problem-stress`, `h2-scoped-problem-stress`)
|
||||
remain aliases → expand to profiles. Prefer module/profile ids in new code.
|
||||
|
||||
### 5.2 Application order
|
||||
|
||||
Apply module `rules_delta` in the order of `aspects:` in
|
||||
`ground-game/editions/catalog.yaml`. Refuse two modules on the same aspect.
|
||||
|
||||
### 5.3 Recording and panels
|
||||
|
||||
Every trial cell, replay, and `cb-play` session should store:
|
||||
|
||||
- `baseline_id`
|
||||
- `modules: [ ... ]` fully resolved (defaults filled or explicit)
|
||||
- optional `profile_id` if one was requested
|
||||
|
||||
Panel reports should **facet by aspect** when comparing (e.g. all configs
|
||||
with `problem_stress.scoped` vs `none`), not only by legacy experiment
|
||||
name.
|
||||
|
||||
### 5.4 Measurement hygiene (ties to design instrument)
|
||||
|
||||
- Prefer **one non-default module** when isolating a mechanism (alone).
|
||||
- Use **profiles** when the hypothesis is interaction (scoped × hybrid end).
|
||||
- Criterion tables in evidence should name **module ids**, not only “H2”.
|
||||
- Policies that cannot see an aspect (e.g. bots that ignore bond scope)
|
||||
cannot test aspect-specific *motivation* claims — report untested, not
|
||||
failed (CB-EV-0032 criterion 4 pattern).
|
||||
|
||||
### 5.5 Kernel / UI evolution
|
||||
|
||||
| Surface | Direction |
|
||||
|---------|-----------|
|
||||
| `cb-play` / trials | `--profile` / `--module` flags; show active modules on the table |
|
||||
| State hash / recordings | include configuration identity |
|
||||
| HTML table | label which modules are live (CB-WP-0044 family) |
|
||||
| Finding register | findings may be scoped to an aspect or module |
|
||||
| Future | aspect-aware policy panel; “compose and sweep” harness |
|
||||
|
||||
### 5.6 Proposed modules (draft only)
|
||||
|
||||
Until `status` leaves `proposed` and a kernel path exists:
|
||||
|
||||
- `end_condition.hybrid_clear_collapse`
|
||||
- `problem_deal.pressure_deck`
|
||||
|
||||
Do not report measurements for unimplemented modules. `allow_proposed`
|
||||
should refuse or no-op loudly.
|
||||
|
||||
---
|
||||
|
||||
## 6. Legacy map
|
||||
|
||||
| Legacy experiment | Profile | Modules |
|
||||
|-------------------|---------|---------|
|
||||
| `h1-problem-stress` | `h1` | `problem_stress.flat_any_open` + `attack_relief.self_soothe_ge4` |
|
||||
| `h2-scoped-problem-stress` | `h2` | `problem_stress.scoped` |
|
||||
|
||||
H1 mixed two aspects; H2 was already one aspect. Schema 2 makes that
|
||||
decomposition explicit so the next change is not H3-the-blob.
|
||||
|
||||
---
|
||||
|
||||
## 7. Relation to other clay-borg research
|
||||
|
||||
| Doc | Relationship |
|
||||
|------|----------------|
|
||||
| **CB-RES-0007** design instrument | Findings attach to configurations; aspects name *which* rules class moved |
|
||||
| **CB-RES-0008** could-we-have-won | Winnability is one dynamic; hold aspect coords when comparing |
|
||||
| **CB-RES-0009** extensive form | Formal analysis language *under* a fixed configuration |
|
||||
| **ADR-0011** vendor edition | Baseline content; modules add deltas on top |
|
||||
| **ADR-0012** design instrument | Admissible findings still need failing reproductions |
|
||||
|
||||
---
|
||||
|
||||
## 8. Bibliography (digest-level)
|
||||
|
||||
Primary design:
|
||||
|
||||
1. Fullerton, T. *Game Design Workshop* — formal elements of games.
|
||||
2. Hunicke, R., LeBlanc, M., Zubek, R. “MDA: A Formal Approach to Game Design and Game Research.”
|
||||
3. Elias, G. S., Garfield, R., Gutschera, K. R. *Characteristics of Games*. MIT Press.
|
||||
4. Salen, K., Zimmerman, E. *Rules of Play* — rules, play, culture; design space discourse.
|
||||
|
||||
Game theory / GGP (analysis, not aspect inventory):
|
||||
|
||||
5. Osborne, M. J. *An Introduction to Game Theory*.
|
||||
6. Piette et al. / Ludii literature on GDL universality and extensive form (see CB-RES-0009).
|
||||
7. OpenSpiel documentation — multi-game research environments.
|
||||
|
||||
Fleet documents:
|
||||
|
||||
8. ground-game `editions/ASPECTS.md`, `editions/CATALOG.md`, `editions/catalog.yaml` (schema_version: 2).
|
||||
9. ground-game `history/260808-modular-variants.md`.
|
||||
|
||||
---
|
||||
|
||||
## 9. Adoption checklist (clay-borg)
|
||||
|
||||
- [ ] Parse ground-game catalog schema 2 (`aspects`, `modules`, `profiles`).
|
||||
- [ ] Selection: `profile` or `modules[]` + baseline; fill defaults.
|
||||
- [ ] Validate one module per aspect.
|
||||
- [ ] Apply deltas in aspect order; `with_variant`-style setup for modules that assign owners.
|
||||
- [ ] Persist resolved module list on state / replay / panel output.
|
||||
- [ ] UI: show active modules.
|
||||
- [ ] Deprecate bare experiment-only APIs only after alias coverage.
|
||||
- [ ] Optional: panel sweep “hold all aspects fixed, vary one.”
|
||||
|
||||
---
|
||||
|
||||
## 10. One-sentence summary
|
||||
|
||||
**A GROUND rules configuration is a point in a multi-aspect design space;
|
||||
clay-borg’s job is to select, run, record, and compare those points
|
||||
without collapsing independent aspects into opaque experiment blobs.**
|
||||
|
|
@ -213,3 +213,15 @@ protocol exists to catch: real, unreproducible as stated, and the seed of
|
|||
[CB-WP-0025](../workplans/CB-WP-0025-could-we-have-won.md). Forcing it
|
||||
into a schema at the moment of observation would lose it. §3.1 is what
|
||||
stops it aging into an apparent finding.
|
||||
|
||||
---
|
||||
|
||||
## Appendix — Aspects and design space (2026-08-08)
|
||||
|
||||
Rules configurations are points in a **multi-aspect design space**. See:
|
||||
|
||||
- [`research/CB-RES-0010-game-aspects-and-design-space.md`](../research/CB-RES-0010-game-aspects-and-design-space.md) — concepts, sources, clay-borg duties
|
||||
- [`editions/ASPECTS.md`](../editions/ASPECTS.md) — GROUND aspect inventory
|
||||
- [`editions/CATALOG.md`](../editions/CATALOG.md) — module/profile selection (schema 2)
|
||||
|
||||
Findings and trials should name the **resolved module list** (configuration), not only a legacy experiment id.
|
||||
|
|
|
|||
145
trials/2026-08-08-2108-2.yaml
Normal file
145
trials/2026-08-08-2108-2.yaml
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
scenario: ground/cb-play-session
|
||||
description: recorded by cb-play (CB-WP-0008 T02)
|
||||
covers: []
|
||||
provisional: false
|
||||
provisional_owner: ''
|
||||
provisional_raised: ''
|
||||
ruled: ''
|
||||
ruled_by: ''
|
||||
ruled_note: ''
|
||||
encodes_u_item: ''
|
||||
seed: 2
|
||||
setup:
|
||||
players: 3
|
||||
preset: standard-3p
|
||||
patch: {}
|
||||
commands:
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 1
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 3
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 2
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 4
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: respond_to_support
|
||||
args:
|
||||
response: accept_bond
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
expect:
|
||||
events: []
|
||||
state: {}
|
||||
rejects: []
|
||||
state_hash: a89e4c82b53c79e00d48ba961fef2310f99b6ce33214b380daf3d9d5d02883fe
|
||||
149
trials/2026-08-08-2108-3.yaml
Normal file
149
trials/2026-08-08-2108-3.yaml
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
scenario: ground/cb-play-session
|
||||
description: recorded by cb-play (CB-WP-0008 T02)
|
||||
covers: []
|
||||
provisional: false
|
||||
provisional_owner: ''
|
||||
provisional_raised: ''
|
||||
ruled: ''
|
||||
ruled_by: ''
|
||||
ruled_note: ''
|
||||
encodes_u_item: ''
|
||||
seed: 3
|
||||
setup:
|
||||
players: 3
|
||||
preset: standard-3p
|
||||
patch: {}
|
||||
commands:
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: P2
|
||||
cmd: respond_to_support
|
||||
args:
|
||||
response: accept_bond
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P3
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 3
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 2
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: P3
|
||||
cmd: respond_to_support
|
||||
args:
|
||||
response: accept_bond
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 1
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 4
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 4
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P3
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
expect:
|
||||
events: []
|
||||
state: {}
|
||||
rejects: []
|
||||
state_hash: 1676ace21523793f5060916a1076a8b0c2efdd2cd056f537718e221a2a45071e
|
||||
149
trials/2026-08-08-2108.yaml
Normal file
149
trials/2026-08-08-2108.yaml
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
scenario: ground/cb-play-session
|
||||
description: recorded by cb-play (CB-WP-0008 T02)
|
||||
covers: []
|
||||
provisional: false
|
||||
provisional_owner: ''
|
||||
provisional_raised: ''
|
||||
ruled: ''
|
||||
ruled_by: ''
|
||||
ruled_note: ''
|
||||
encodes_u_item: ''
|
||||
seed: 1
|
||||
setup:
|
||||
players: 3
|
||||
preset: standard-3p
|
||||
patch: {}
|
||||
commands:
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 1
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 3
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 3
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: P2
|
||||
cmd: respond_to_support
|
||||
args:
|
||||
response: accept_bond
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 2
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P3
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: P3
|
||||
cmd: respond_to_support
|
||||
args:
|
||||
response: accept_bond
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 4
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
expect:
|
||||
events: []
|
||||
state: {}
|
||||
rejects: []
|
||||
state_hash: ecff42c26b3fa005795f291e03d97b810225ab3b26af8677a92fd9a3c65adc9b
|
||||
149
trials/2026-08-08-2117-2.yaml
Normal file
149
trials/2026-08-08-2117-2.yaml
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
scenario: ground/cb-play-session
|
||||
description: recorded by cb-play (CB-WP-0008 T02)
|
||||
covers: []
|
||||
provisional: false
|
||||
provisional_owner: ''
|
||||
provisional_raised: ''
|
||||
ruled: ''
|
||||
ruled_by: ''
|
||||
ruled_note: ''
|
||||
encodes_u_item: ''
|
||||
seed: 2
|
||||
setup:
|
||||
players: 3
|
||||
preset: standard-3p
|
||||
patch: {}
|
||||
commands:
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 1
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 3
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 2
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P3
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: P3
|
||||
cmd: respond_to_support
|
||||
args:
|
||||
response: accept_bond
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 4
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P1
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: P2
|
||||
cmd: respond_to_support
|
||||
args:
|
||||
response: accept_bond
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
expect:
|
||||
events: []
|
||||
state: {}
|
||||
rejects: []
|
||||
state_hash: 57b438bb2fd7d7806cfd11410f0fe950897c5aac2f6e551677381a418d85c2d2
|
||||
145
trials/2026-08-08-2117.yaml
Normal file
145
trials/2026-08-08-2117.yaml
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
scenario: ground/cb-play-session
|
||||
description: recorded by cb-play (CB-WP-0008 T02)
|
||||
covers: []
|
||||
provisional: false
|
||||
provisional_owner: ''
|
||||
provisional_raised: ''
|
||||
ruled: ''
|
||||
ruled_by: ''
|
||||
ruled_note: ''
|
||||
encodes_u_item: ''
|
||||
seed: 1
|
||||
setup:
|
||||
players: 3
|
||||
preset: standard-3p
|
||||
patch: {}
|
||||
commands:
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 2
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 1
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 3
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 2
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 3
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: INVESTIGATE
|
||||
problem: 4
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
- actor: P1
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SUPPORT
|
||||
target: P3
|
||||
- actor: P2
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 4
|
||||
- actor: P3
|
||||
cmd: select_action
|
||||
args:
|
||||
action: SOLVE
|
||||
problem: 4
|
||||
- actor: SYSTEM
|
||||
cmd: reveal
|
||||
args: {}
|
||||
- actor: P3
|
||||
cmd: respond_to_support
|
||||
args:
|
||||
response: accept_bond
|
||||
- actor: SYSTEM
|
||||
cmd: resolve
|
||||
args: {}
|
||||
- actor: SYSTEM
|
||||
cmd: end_round
|
||||
args: {}
|
||||
expect:
|
||||
events: []
|
||||
state: {}
|
||||
rejects: []
|
||||
state_hash: e6349a916fa7aca9caac59a02d6b837d9c19fd60a8c26f10fcd21fc78b3b577b
|
||||
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