CB-WP-0049 T02/T03: a seat that plays its objective, and F27 splits in two
Some checks failed
ci / check (push) Has been cancelled
Some checks failed
ci / check (push) Has been cancelled
objective() reads GroundState::score (now public) rather than restating
what winning is; a copy in the bot would disagree with the kernel the
first time ground-game rules on F28.
Working out WHERE the modes can differ was most of the task and it
bounds the result: SOLVE always claims for the actor, so own-score and
group-score want the same SOLVE nearly everywhere. That is a fact about
GROUND's action set, not a shortcoming of the bot. Two real divergences,
both readable off the table: SUPPORT regulates someone else (worth less
against a rival, worth MORE under coalitions where a Bond merges them
into my side), and SOLVE's value is the card's value, which greedy
ignores entirely.
THE RESULT — F27 splits in two:
group success UNCHANGED in 34 of 36 cells
who wins MOVES: BONDED COALITIONS at 4p goes 2.04 -> 2.98,
2.12 -> 3.29, 2.05 -> 3.01 winning seats per game
So "the competitive modes are scoring lenses over cooperative play" was
too strong and is withdrawn. The sharper claim: GROUND's scoring modes
change WHO WINS, not WHETHER THE GROUP SUCCEEDS. And the effect is
seat-band dependent -- 2p none, 4p largest, 6p none under coalitions;
two relation slots capping network growth is a candidate explanation and
is untested.
The panel now prints BOTH policies side by side. That was a correction
mid-task: the first version printed only the new one and I compared it
against a figure remembered from CB-WP-0047 -- a comparison against a
board nobody re-ran.
Control that makes the numbers mean anything: under SHARED GROUND the
two policies agree at all but <=2 decision points across 12 boards, so a
moving column is mode-awareness and not simply a different bot.
Also: two T01 tests keyed on `status: proposed`, which ground-game
renamed to `ready-for-implement` mid-session. They now find the module
by asking resolve() -- the structural property is ours and does not move
when another repo edits its vocabulary.
Also: `make vendor` replaces three hand re-vendors with a tool that
regenerates digests by walking editions/, and reports one-sided files
rather than resolving them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
82b9e7df31
commit
3045eb03f8
16 changed files with 859 additions and 94 deletions
|
|
@ -100,7 +100,7 @@ can fail is decoration.
|
|||
|
||||
```task
|
||||
id: CB-WP-0049-T02
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "7e3611bf-4cfb-412c-8e33-695778c7980b"
|
||||
```
|
||||
|
|
@ -126,11 +126,17 @@ ground-game rules on F28.
|
|||
- **the objective is blind** (T01's control applies to anything that
|
||||
reaches a policy).
|
||||
|
||||
**Done 2026-08-08.** `GroundState::score` is now public and
|
||||
`bot::objective` reads it. Nothing about winning is restated in the bot.
|
||||
Because `score` is a pure function of the state it answers mid-game too —
|
||||
*"what would this position score if it stopped now"* — which is what a
|
||||
policy needs and what a second implementation would have had to invent.
|
||||
|
||||
## Task: a seat that plays it, and the F27 re-measurement
|
||||
|
||||
```task
|
||||
id: CB-WP-0049-T03
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "a842c0a3-9374-4f08-8e2b-1571b8f241ef"
|
||||
```
|
||||
|
|
@ -156,6 +162,54 @@ and the workplan must not be written as though one is expected.
|
|||
- **greedy's numbers are unchanged**, so the new policy is an addition
|
||||
and not a silent edit of the published baseline.
|
||||
|
||||
**Done 2026-08-08.** `ObjectivePolicy` delegates to `GreedyPolicy::rank`
|
||||
and overrides two arms.
|
||||
|
||||
### Where the modes can differ at all
|
||||
|
||||
Working this out was most of the task, and it bounds the result:
|
||||
**SOLVE always claims for the actor**, so a seat maximising its own score
|
||||
and one maximising the group's want the same SOLVE in nearly every
|
||||
position. That is a fact about GROUND's action set, not a shortcoming of
|
||||
the bot. Two places the objective genuinely diverges, both readable off
|
||||
the table:
|
||||
|
||||
- **SUPPORT regulates someone else** — worth less when the beneficiary is
|
||||
a rival (COMMON PROBLEM), worth *more* when a Bond merges them into my
|
||||
coalition and my score is the coalition's sum (BONDED COALITIONS).
|
||||
- **SOLVE's value is the card's value** — greedy ranks every legal SOLVE
|
||||
at 90 regardless, and under a competitive objective the difference
|
||||
between a 2 and a 3 is the margin.
|
||||
|
||||
### The result — F27 splits in two
|
||||
|
||||
The panel now prints **both policies side by side**. That was a
|
||||
correction mid-task: the first version printed only the new policy's
|
||||
`win/g` and I compared it against a figure remembered from CB-WP-0047,
|
||||
which is a comparison against a board nobody re-ran.
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **group success** | **unchanged** — 34 of 36 cells identical; SCN_03 at 4p goes 99→100 in all three modes, which is the SOLVE-by-value refinement, not a mode effect |
|
||||
| **who wins** | **moves** — BONDED COALITIONS at 4p: 2.04 → 2.98, 2.12 → 3.29, 2.05 → 3.01 winning seats per game. COMMON PROBLEM at 6p: 1.10 → 1.17 |
|
||||
|
||||
**So the original claim was too strong.** The modes are not "scoring
|
||||
lenses over cooperative play" — they reach decisions. The sharper
|
||||
statement: **GROUND's scoring modes change who wins, not whether the
|
||||
group succeeds.**
|
||||
|
||||
**And the effect is seat-band dependent**: 2p shows no divergence in any
|
||||
mode, 4p the largest, 6p none under BONDED COALITIONS. A candidate
|
||||
explanation is that two relation slots per seat cap network growth, so at
|
||||
6p the incentive exists and cannot be acted on. **That is untested** and
|
||||
is the next variable to move.
|
||||
|
||||
**Under SHARED GROUND the two policies agree** at all but ≤2 decision
|
||||
points across 12 boards — the control that separates "attends to the
|
||||
objective" from "is simply a different bot". Without it, every number
|
||||
above could have been the new policy being different rather than being
|
||||
mode-aware.
|
||||
|
||||
## Task: module-aware evaluation
|
||||
|
||||
```task
|
||||
|
|
@ -182,6 +236,31 @@ achievable cheaply, the honest move is one policy that reads the resolved
|
|||
control that separates "attends to the module" from "plays differently";
|
||||
- **blind** (T01).
|
||||
|
||||
## Two things this pass fixed that were not the task
|
||||
|
||||
**A test keyed on a word another repo owns.** T01's controls found their
|
||||
example module by searching the catalog for `status: proposed` — and
|
||||
ground-game renamed those to `ready-for-implement` mid-session, so two
|
||||
tests failed over a string neither was about. The property they actually
|
||||
need is *"a module the catalog has that this kernel cannot run"*, which
|
||||
`resolve()` determines and which does not move when someone edits their
|
||||
vocabulary. Same lesson as matching a rules passage by heading rather
|
||||
than row number (CB-WP-0046) and reading a module's `aspect:` field
|
||||
rather than splitting its id on the dot.
|
||||
|
||||
**The mirror was re-vendored by hand three times in one session.**
|
||||
`make vendor` now does it and regenerates the digest block by **walking**
|
||||
`editions/`, never by typing it. It reports files only one side has
|
||||
rather than resolving them — deleting a file upstream dropped, or copying
|
||||
one it added, are decisions (ADR-0011), not a sync.
|
||||
|
||||
Its self-test caught a defect in itself on first run: it read *both*
|
||||
digest blocks in `PROVENANCE.md` and reported ten edition CSVs as
|
||||
"recorded but absent", when they are absent only from the *sibling* walk
|
||||
— a different question from absent. Mutation-proved: touch a vendored
|
||||
file without re-running and *"every recorded digest is the file's current
|
||||
bytes"* goes red.
|
||||
|
||||
## Not done here
|
||||
|
||||
- **The trait still takes `&GroundState`.** ADR-0023 D2 chose the
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue