ground-game/workplans/GROUND-WP-0002-rulings-clay-borg-is-blocked-on.md
tegwick 1ef0550cc4 GROUND-WP-0002 T06: the group cannot win below 5 seats
Confirmed by play and by reproduction. The maintainer could not win any
3-player game on 2026-08-03; the engine computes why from its own
constants: GR-S01 deals 2/3/4 Problems and GR-E01 asks for 5/7/9, so a
perfect group still loses at 2, 3 and 4 seats.

Not a dataset problem -- the stand-in gives 3/6/10 and this repo's
Problems.csv gives 4/6/9 against the same thresholds. No edition data
reconciles them.

Reproduction named so the ruling can be checked against it:
gd0001_group_success_is_unreachable_below_five_seats in clay-borg.

Three possibilities offered rather than one assumed: the deal is too
small, the thresholds are too high, or low seat counts are deliberately
not SHARED GROUND games -- in which case nothing currently says so and
the engine will keep offering an unwinnable game.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 23:50:14 +02:00

320 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: GROUND-WP-0002
type: workplan
title: "Rulings the engine is blocked on, and the dataset it never loaded"
domain: consumer
repo: ground-game
status: finished
owner: bernd
topic_slug: whynot
created: "2026-08-03"
updated: "2026-08-03"
state_hub_workstream_id: "d8fc3a69-a5ae-4f6e-b4fc-b07d1ff9c783"
---
# Rulings the engine is blocked on
`clay-borg` implements the engine that simulates GROUND. Its INTENT says
game-semantics questions defer to **this** repo. Ten underdetermined rules points, six provisional scenarios and three
questions raised by play have accumulated there, and none has been
answered, because none had a home.
This is their home.
**Nothing here is a clay-borg change.** Every item is a ruling only the
game's owner can make; the engine already carries a provisional default
for each and will flip it when the ruling lands.
**Session 2026-08-03:** all rulings below were decided with the maintainer
in a guided pass. Residual playtest work handed to
[GROUND-WP-0003](GROUND-WP-0003-playtest-semi-and-coalitions.md).
## The finding that reframes most of this
**The engine has never loaded this repository's edition data.**
`games/ground/src/lib.rs:1839` builds Problems with `value: priority` and
suits cycled by index — a stand-in it has always labelled as such. Mean-
while `editions/ground-darvo-r0/Problems.csv` has carried the real thing
since 2026-07-31:
| | problems per scenario | values | total available |
|---|---:|---|---:|
| `Problems.csv` (real) | **5** | 2, 2, 2, 3, 3 | **12** |
| the engine's stand-in | 3 | 1, 2, 3 | **6** |
The dataset also defines `required_solution` (Repair / Clarify /
Boundary), `visibility` (Surface / Hidden) and `hidden_priority` (04) —
all of which the engine currently invents.
**GR-E01's thresholds are 2p → 5, 34p → 7, 56p → 9.** Against 12
available points those are ordinary targets. Against a stand-in worth 6
they are unreachable, which is exactly what clay-borg reported as a rules
gap needing a ruling here.
**So the first question is not a rules question at all.** It is whether
this dataset is authoritative — and if it is, several of the items below
dissolve without anyone changing a rule.
## Task: declare the dataset authoritative, and say what the engine may rely on
```task
id: GROUND-WP-0002-T01
status: done
priority: high
state_hub_task_id: "431cca12-e6d9-4eba-9360-f4f13ed263c1"
```
State whether `editions/ground-darvo-r0/` is the **authoritative** source
for Problem values, required solutions, visibility and priority — and what
the engine may treat as stable.
`SCOPE.md` already promises *"stable IDs suitable for layout templates,
print merges, and later digital import."* This task turns that into a
contract clay-borg can build against:
- which columns are authoritative vs presentational;
- whether `point_value` and `required_solution` may change between `r0`
and a later revision without a version bump;
- what a version bump looks like, so the engine can pin one.
**Until this is answered the engine cannot import the data, and every
threshold question below stays unanswerable.**
**RULED 2026-08-03, by the maintainer:** *"The edition dataset is
authoritative."*
So `editions/ground-darvo-r0/` is the source of truth for Problem values,
required solutions, visibility and priority, and **the engine must import
it rather than invent them**. That unblocks clay-borg and it very likely
dissolves `gr-e01-threshold-unreachable-2p` — see T03.
### Dataset contract (confirmed 2026-08-03)
| question | ruling |
|---|---|
| authoritative vs presentational columns | **Authoritative:** `problem_id`, `scenario_id`, `visibility`, `hidden_priority`, `required_solution`, `point_value`. **Presentational:** `title`, `problem_text`, `symbol_id`, `front_rules`, `reveal_effect`, `unresolved_effect`, `back_design_id` |
| may `point_value` / `required_solution` change within `r0`? | **No** — a change to either is a new revision |
| what a version bump looks like | the directory name: `ground-darvo-r0``-r1`. The engine pins a directory, so a bump is visible in a diff and never silent |
**Rationale:** Problem value and required suit are *in* hashed game state.
Silent in-revision edits would rot every recorded scenario hash in
clay-borg.
## Task: rule on SOLVE's legality
```task
id: GROUND-WP-0002-T02
status: done
priority: high
state_hub_task_id: "895573ac-d7b9-4160-a118-5bc8866c28c8"
```
Three related questions, all raised by play, all currently decided by the
engine's default rather than by the rules.
**(a) May SOLVE be selected against a *face-down* Problem?** Measured in
the browser on 2026-08-03: a player selected SOLVE on a face-down Problem
in three consecutive rounds. Nothing happened, three times, because
GR-A02's resolver skips a Problem that is not face up. The engine offered
the move each time.
A face-down commit you cannot fulfil is a plausible **bluff** in a
commit/reveal game with DARVO — which is why this is a ruling and not a
bug. But if it is a bluff it should be *intended*; if it is not, the move
should not be offered.
**(b) May SOLVE be selected when the seat holds no Solution of the
required suit?** Same shape: currently offered, silently does nothing.
**(c) GR-A13 — SOLVE against an already-claimed Problem.** Long-standing
in clay-borg's evidence as *"wasted SOLVE"*. Intended cost of a bad read,
or a gap?
For each: **intended, or not offered.** If intended, say what the player
is meant to learn from the waste.
### RULED 2026-08-03
| sub | ruling | what the player learns |
|---|---|---|
| **(a)** face-down Problem | **Not offered** — illegal target | Matches ACT_SOLVE target and Rules §Problems: only face-up, non-Denied. Browser no-ops were a filter bug, not a bluff mechanic. |
| **(b)** no matching Solution in hand | **Not offered** — digital legality filter | Player always knows their hand; engine only offers SOLVE when a matching suit is held. Physical tables self-police the same way. |
| **(c)** already-claimed Problem | **Same-round race legal; prior-round claim not offered** | Competing SOLVEs resolve Lead-then-clockwise; losers keep their Solution. That race is the intended cost of a bad read. Targeting a Problem claimed in a prior round is illegal (nothing left to race for). |
## Task: answer the ten underdetermined points (U1U10)
```task
id: GROUND-WP-0002-T05
status: done
priority: high
state_hub_task_id: "e1d6a548-dedf-473a-9ebd-a2e3a286d510"
```
**This is the oldest item and it has never been read.** `clay-borg`
messaged this repo on **2026-07-30** with ten points the dataset does not
decide, each simulated under a provisional default, asking for *"confirm /
correct (with ruling)"* per item. Four days later the message was still
unopened, because there was nowhere for it to land. Now there is.
| | question | the default clay-borg simulates |
|---|---|---|
| **U1** | Bond-acceptance timing | the target decides during Support resolution, post-reveal |
| **U2** | Stress clamping | clamp on **every** application, not only at End — this changes when DARVO triggers mid-round |
| **U3** | DENY with no legal target | no-op; the sequence still advances |
| **U4** | Solution deck exhaustion | deterministic reshuffle of the discard, else skip the draw |
| **U5** | rejected REVERSE self-effects | owner still gets 2 Stress and the sequence ends; no Blame, no +1, no Protection |
| **U6** | same-round Bond-Support vs DARVO | the Support cancels that round's DARVO stage **before it fires** (step order 2 before 3) |
| **U7** | player elimination | none exists — **confirm** |
| **U8** | GROUND—OU vs Attack | OU cancels the Attack **before** Protection is consumed |
| **U9** | simultaneous double DARVO trigger | needs no extra rule — **confirm** |
| **U10** | hand limit | none |
Full text of each default is in `clay-borg/specs/GroundRules.md`
§Underdetermined. **U2, U6 and U8 are the ones that change play**, because
each decides whether a DARVO stage fires at all; the rest are edge cases
or confirmations.
Answer per item: **confirm**, or **correct with the ruling**.
### RULED 2026-08-03 — all ten confirmed as clay-borg defaults
| | ruling | note |
|---|---|---|
| **U1** | **Confirm** | Target accepts during Support resolution, with full knowledge of revealed Actions. Bond formed by *this* Support still does not cancel DARVO (printed designer note). |
| **U2** | **Confirm** | Clamp Stress to 05 on **every** application. Matches physical mats. DARVO still arms only at End when at Stress 5 (GR-R08). |
| **U3** | **Confirm** | DENY with no legal target is a no-op; sequence still advances. |
| **U4** | **Confirm** | Deterministic reshuffle of discard into new deck; if both empty, skip the draw. |
| **U5** | **Confirm** | GROUND—ND rejection cancels target effects (no Blame, no +1, no Protection) **and** owner still gets 2 Stress and the sequence ends. |
| **U6** | **Confirm** | Pre-existing Bond Support (step 2) cancels that round's DARVO stage before it fires (step 3) and ends the sequence. |
| **U7** | **Confirm** | No player elimination. |
| **U8** | **Confirm** | When both GROUND—OU and Protection could cancel the same Attack: OU applies first; Protection is consumed only if it actually cancels. |
| **U9** | **Confirm** | Two players at Stress 5 at the same End both trigger; later stages resolve in Lead order. No extra interaction rule. |
| **U10** | **Confirm** | No hand limit in r0. Revisit only if playtest shows bloat. |
## Task: confirm or overturn the six provisional defaults
```task
id: GROUND-WP-0002-T03
status: done
priority: medium
state_hub_task_id: "52cc157f-8fbd-469d-9da7-a96f1c60b654"
```
Six engine scenarios are tagged `provisional: true` with
`provisional_owner: ground-game`. These are the **scenarios** that encode
T05's defaults — answering U1U10 will settle most of them, so take T05
first and use this list to check nothing was missed. A ruling flips the
scenario; it does not change the kernel.
| scenario | the default currently in force |
|---|---|
| `gr-a04-bond-support` | a Support with no existing relation forms **no** Bond, because GR-L02 requires the target's consent |
| `gr-d01-darvo-trigger` | Stress **clamps** at 5 on every application (GR-F01 under the U2 default) |
| `gr-d05-darvo-reverse` | the REVERSE stage's default resolution |
| `gr-e01-threshold-unreachable-2p` | thresholds measured against the **stand-in** values — see the finding above |
| `gr-e02-shared-ground` | SHARED GROUND scoring default |
| `gr-e04-coalitions` | Bond networks score together; Rivalries do not connect; an unbonded player is a coalition of one |
Confirm each or overturn it. **`gr-e01` should be taken last**, because
T01 may dissolve it.
### RULED 2026-08-03
| scenario | ruling |
|---|---|
| `gr-a04-bond-support` | **Confirm** — consent required; no auto-Bond from no-relation Support |
| `gr-d01-darvo-trigger` | **Confirm** — follows U2 |
| `gr-d05-darvo-reverse` | **Confirm** — follows printed REVERSE + U5 |
| `gr-e01-threshold-unreachable-2p` | **Void / overturn as a rules gap** — stand-in artifact. With authoritative `Problems.csv` (12 pts available) the printed thresholds (2p→5, 34p→7, 56p→9) stand. Retire or rewrite the scenario as a non-provisional data-import check, not a design ruling. |
| `gr-e02-shared-ground` | **Confirm** — encode `Modes.csv` MODE_COOP as printed |
| `gr-e04-coalitions` | **Confirm** — encode `Modes.csv` MODE_COALITION as printed |
## Task: GR-E01 vs GR-S01 — the group cannot win below 5 seats
```task
id: GROUND-WP-0002-T06
status: todo
priority: high
```
**This is the sharpest finding the engine has produced, it is confirmed by
play, and it has a reproduction.**
The maintainer played several 3-player games on 2026-08-03 and could not
win any of them. The engine says why, computed from its own constants:
| seats | Problems dealt (GR-S01) | maximum achievable | GR-E01 threshold | |
|---:|---:|---:|---:|---|
| 2 | 2 | 3 | 5 | **unreachable** |
| 3 | 3 | 6 | 7 | **unreachable** |
| 4 | 3 | 6 | 7 | **unreachable** |
| 5 | 4 | 10 | 9 | reachable |
| 6 | 4 | 10 | 9 | reachable |
**Claim every Problem in play, concede nothing, play perfectly — and at 2,
3 and 4 seats the group still loses.** In SHARED GROUND (GR-E02), where
the group total *is* the outcome, those games cannot be won.
**It is not a dataset problem.** The stand-in the engine used gives
3 / 6 / 10; this repository's `Problems.csv` gives 4 / 6 / 9. Both fall
short of the same 5 / 7 / 9. No edition data reconciles them.
**Reproduction:** `games/ground/src/lib.rs`
`gd0001_group_success_is_unreachable_below_five_seats`, run with
`cargo test -p games-ground --all-features gd0001 -- --nocapture`. It
reads `problem_priorities` (GR-S01) and `threshold` (GR-E01) out of the
engine, so it cannot drift from the rules it is testing.
### The ruling needed
Two numbers disagree and **only one of them can be right**:
- **GR-S01's deal** — 2 / 3 / 4 Problems by player count, from a scenario
of five. Should more of the five be in play at low seat counts?
- **GR-E01's thresholds** — 5 / 7 / 9. Were these set for a game that
deals more Problems than GR-S01 deals?
A third possibility worth ruling out explicitly: **the thresholds may be
intended to be unreachable at low seat counts**, with SHARED GROUND being
a 56 player mode and the smaller counts played in another mode. If so,
say it, because nothing currently does and the engine will keep offering
a game that cannot be won.
**Until this is ruled the engine cannot claim a working scoring mode**, and
`gr-e01-threshold-unreachable-2p` stays as a failing-in-fact record.
## Task: GR-E03 and GR-E04 have never been played to the end
```task
id: GROUND-WP-0002-T04
status: done
priority: medium
state_hub_task_id: "6c55eb56-22dc-4ee2-ac1a-4ced0dedfab9"
```
Both scoring modes are implemented and neither has been played through a
full game — by a person or by the engine. Whatever the rules say, nobody
knows what these modes feel like at the table.
This is a **playtest** task, not an engine task, and it belongs here.
### Handed off 2026-08-03 (residual)
Rules encoding for both modes is confirmed under T03 (`gr-e02`,
`gr-e04`). Full-game felt experience is **not** a ruling and is residual
work:
- **Residual workplan:** [GROUND-WP-0003](GROUND-WP-0003-playtest-semi-and-coalitions.md)
- **origin:** residual of GROUND-WP-0002-T04
This task is **done** as a handoff, not as a completed playtest.
## Ruling index (for clay-borg)
One-page flip list. Engine may clear `provisional: true` against these.
1. **Dataset**`editions/ground-darvo-r0/` authoritative; contract rows under T01.
2. **SOLVE legality** — offer only face-up non-Denied, unclaimed (or same-round race), with matching suit in hand.
3. **U1U10** — all confirmed as prior clay-borg defaults (table under T05).
4. **Provisional scenarios** — confirm five; void `gr-e01` as stand-in artifact.
5. **Playtest residual** — GROUND-WP-0003.