ground-game/reports/260805-clay-borg-difficulty.md
tegwick 92f52e777d Reports out of the workplan number space
The workplan list read as though GROUND-WP-0002, 0003 and 0005 each
existed twice. They did not: three inbound clay-borg finding reports were
filed in workplans/ borrowing the number of the workplan they bear on, and
each was registered in State Hub as a workplan.

A report is correspondence, not a unit of work. The three move to
reports/YYMMDD-<slug>.md with their own id space (GROUND-RPT-0001..0003),
keeping type: report, status: informational and the extends: link to the
workplan they relate to. Their state_hub_workstream_id bindings are
dropped and the hub registrations archived, so the hub's workplan list
matches the files.

Five workplans, one file per number.

AGENTS.md records the convention, since the reports arrive regularly and
nothing in the repo said where they go.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 22:18:18 +02:00

131 lines
5.3 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-RPT-0002
type: report
title: "clay-borg difficulty measurement, 2026-08-05 — and a retraction of what we nearly sent instead"
domain: consumer
repo: ground-game
status: informational
owner: bernd
topic_slug: whynot
created: "2026-08-05"
extends: GROUND-WP-0005
---
# clay-borg difficulty report — 2026-08-05
GROUND-WP-0005 (*difficulty tiers and the Pressure dial*) has both tasks
in `wait`, blocked on a measured baseline. This is that baseline, with its
limits stated.
Generated by `make difficulty`
(`games/ground/examples/difficulty.rs`), governed by
`clay-borg/specs/RetrospectiveAnalysis.md` §4, under
[CB-WP-0025](../../clay-borg/workplans/CB-WP-0025-could-we-have-won.md) T06.
---
## 0. First, what we nearly sent you and did not
**Earlier today this report was going to say: "a greedy bot wins 200 of
200 games at five and six seats — the game is too easy there."**
It would have invited you to move thresholds. **It was wrong**, and an
adversarial review caught it before it left our repo.
A `FirstLegal` policy — take the first legal command, no heuristic
whatsoever — scores **0%** at five and six seats on the identical deals
where `GreedyPolicy` scores **100%**. At two seats it *beats* greedy
(76.7% vs 60.0%).
**Two unsophisticated agents span the entire range.** A single policy's
win rate is therefore a statement about the policy, not about GROUND, and
we have written that into our spec as a prohibition rather than a
preference.
This is the fifth claim we would have sent you on a wrong premise. It is
the second stopped before sending.
## 1. The measurement
`make difficulty`, 60 seeds per cell:
| seats | winnable | greedy | random | first-legal | spread | undecided |
|---|---:|---:|---:|---:|---:|---:|
| 2 | **60%** | 60.0% | 5.0% | 76.7% | 71.7 | 0 |
| 3 | **93%** | 88.3% | 6.7% | 25.0% | 81.7 | 2 |
| 4 | **100%** | 93.3% | 6.7% | 30.0% | 86.7 | 4 |
| 5 | **100%** | 100.0% | 3.3% | 0.0% | 100.0 | 0 |
| 6 | **100%** | 100.0% | 3.3% | 0.0% | 100.0 | 0 |
**`winnable`** is the column that is not about a bot. It is the fraction
of deals in which an **exhaustive search finds a winning line in the final
round**. The other three columns are what named policies actually achieve,
and **`spread`** is the range between them.
## 2. How to read it, including what it is not
**Read `spread` first.** It ranges from 71.7 to 100.0 percentage points.
Wherever it is large — everywhere — **no single policy's rate tells you
anything about the game.** That is the finding behind §0.
**`winnable` is conditioned on greedy's play up to the final round.** It
is *"winnable from where greedy got to"*, not a property of the deal
alone. A genuinely policy-free figure would search from round 1, which we
measured as unaffordable: our search exceeded 2×10⁶ nodes at **two** seats
over two rounds. We are telling you this rather than presenting the number
as cleaner than it is.
**It is a lower bound.** A one-round search cannot see a line that needed
an earlier round, so the true winnable fraction is **at least** these
figures.
**`undecided` deals are excluded, not counted as losses.** Those are deals
whose search hit the node budget. Folding *"we stopped looking"* into
*"not winnable"* is the collapse our spec forbids.
## 3. What we think this supports, offered as reading not as ruling
**The rules are yours. This is what the numbers appear to say.**
- **Two seats is the tight configuration.** 60% winnable in the final
round, and every policy struggles. If any seat count is under-tuned for
*difficulty*, the evidence does not point here.
- **Four seats and up: every deal we sampled was still winnable in the
final round.** 100% at 4, 5 and 6 seats. That is compatible with "too
generous at high seat counts" — but it is **not** the claim we withdrew
in §0, because it is a statement about deal winnability rather than
about a bot's success.
- **The 56 seat rows deserve the most suspicion.** `first-legal` scores
0% there while `greedy` scores 100%, which is the widest spread in the
table. Something about those configurations makes play matter *more*,
not less — the opposite of "too easy" — and we do not yet understand it.
**We are not proposing threshold changes.** The measurement's confound
(§2) is large enough that we would rather you saw it than acted on it.
## 4. What would make this a better instrument
- **Search from round 1** rather than the last round, which removes the
greedy confound entirely. Needs transposition or move-ordering; we have
neither.
- **A resolution figure** — the smallest threshold change the measurement
can distinguish, with its N. Our spec requires it and we cannot yet
supply it.
- **Your Pressure dial**, if it lands, gives a second axis to measure
against and would make the table two-dimensional.
## 5. Reproduction
Per GROUND-WP-0004 T02, arithmetic findings cite their reproduction by
path:
```
clay-borg$ make difficulty # the table above
clay-borg$ make self-tests # includes the difficulty controls
```
Controls, so the figure can fail rather than merely print: a witness must
replay to a win; an unwinnable position must be reported as **searched
out** rather than as a budget cut; a budget of one node must not claim
exhaustion; and the policy panel must actually disagree, or reporting
three policies would be ceremony.