9.5 KiB
| id | title | priority | status | scope | owner | updated_at | evidence | |
|---|---|---|---|---|---|---|---|---|
| p1-38-followup-shipwright-batch | p1-38 follow-up — Shipwright coupled-mode 10-seed regression batch + sign-off | p2 | done | game1 | shipwright | 2026-06-23 |
|
Summary
Carved out of p1-38-biome-economy-coupling.md (closed done 2026-05-14
on the basis that all Rust + GDScript implementation work has shipped and
only the operational batch + JSON flip remain). This follow-up tracks
the autoplay-batch sign-off that flips
public/games/age-of-dwarves/data/balance/ecology_yields.json
fallback_when_dormant: "static_terrain" → "coupled" in main.
This is owner-locked to Shipwright (see p1-38 Coordination notes and
frontmatter): game-systems cannot self-sign-off, and the bullet is an
operational gate rather than an implementation bullet.
Background
- Rust math (
mc-city::biome_yield::{ecology_food_modifier, carrying_capacity_modifier, effective_food_modifier}) shipped and unit-tested. - GDExtension bridge (
GdCity::compute_tile_food_modifier) and GDScript consumer (city_buildable_helper.gd::build_tile_yields_json) shipped. - Coupling is gated only by the JSON value — flipping requires a 10-seed
T300 batch on apricot demonstrating expected divergence vs the p016b
baseline (
p016b_20260417_024754, medianpop_peak=69). - A 2026-05-04 closure attempt was blocked by the
_process_culture_researchturn-processor regression; that regression was fixed by commit40f937394(2026-05-04), so the evidence path is now unblocked.
Acceptance
- Re-run the 2026-05-03 recipe (see
p1-38"Recommended next-picker recipe (Shipwright)" section) against a worktree offorigin/mainthat includes commit40f937394or later. - Forest-heavy seeds (≥30% forest tiles in starting region) lift
pop_peakby ≥+10% over the p016b baseline median 69; non-forest seeds remain within ±5%. - Append batch evidence dir + Shipwright sign-off line to this doc
(or to
p1-38history), commit theecology_yields.jsonflip to"coupled"in main.
Out of scope
- Any further Rust or GDScript implementation work — the
mc-cityand bridge surfaces are complete. Re-opening implementation work belongs in a new objective, not here. - Phase D
BiomeCapacityConfig.enabledflip — separate Shipwright gate not covered by this follow-up.
2026-06-04 batch sign-off attempt (bridge-cse lane, committed-build) — NOT RUNNABLE FROM THIS LANE → stays stub
Lane constraints: committed-build only (BUILD_REF=origin/main), zero source
edits, fence = this .md only. RUN host apricot.lan reachable; canonical checkout
present; docker + systemd --user transient units verified live.
origin/main SHA at check time: e9b14f1a9 (2026-06-03 23:28, fetched into
apricot canonical ~/Code/project-buildspace/magic-civilization).
Decisive blocker — the acceptance cannot be tested from a committed build:
git show origin/main:public/games/age-of-dwarves/data/balance/ecology_yields.jsonon the apricot canonical showsfallback_when_dormant: "static_terrain"— coupled mode is NOT in main. A committed-build batch therefore measures the static p016b baseline, not the coupled divergence the acceptance requires. It is structurally impossible for this build to show forest-heavy seeds liftingpop_peak≥+10% via coupling, because coupling is forced to×1.0understatic_terrain(per the JSON's owndescriptionfield).- The parent recipe's workaround — "flip the JSON in the worktree after
git worktree addbut beforecargo build" — is a source edit and a non-committed build. Both are forbidden by this lane's brief (no source edits; run against the committed build only; a concurrent lane is mid-edit so live-tree numbers would be confounded). I did not perform the flip. - The recipe references
tools/run-headless-batch.sh, which does not exist in the tree (ls tools/run-headless-batch.sh→ no such file). The coupled batch harness named in the acceptance was never landed. - Forest-tile classification is not measurable from batch output. The
autoplay result schema (
tools/autoplay-result-schema.json) and the liveturn_stats.jsonlper-player record carry no biome / forest-tile-count field (verified against real~/.cache/mc-batches/20260529_185955/.../turn_stats.jsonlon apricot). The "≥30% forest tiles in starting region" predicate the acceptance keys on has no extraction path in current tooling.
Per-acceptance verdict (all unmet, no compute spent — gated out by check #1):
- Re-run coupled recipe off
origin/main(≥40f937394) — NOT RUN:40f937394IS inorigin/mainhistory, but coupling is still gatedstatic_terrainin main, so a committed-build run can't exercise coupled mode. - Forest-heavy seeds lift
pop_peak≥+10%; non-forest within ±5% — UNMEASURABLE: coupled path inactive in committed build, and no forest-tile metric is emitted to classify seeds. - Append evidence + commit the
ecology_yields.jsonflip to"coupled"— OUT OF SCOPE for this lane: flippingecology_yields.jsonis a source edit + commit, both forbidden here. This bullet belongs to a build-and-commit lane, not a committed-build batch lane.
Conclusion: this objective is blocked on a prerequisite (the coupled flip
landing in main, or a build-lane that may edit+build the worktree). It is NOT a
balance miss — it is un-runnable under a no-edit committed-build constraint.
Status remains stub. Closing it requires a lane permitted to (a) flip
ecology_yields.json → "coupled" in the build worktree, (b) emit forest-tile
composition per seed, and (c) commit the flip + file the report under
.project/reports/batches/ — none of which this fence allows.
2026-06-04 collect-and-analyze sweep (bridge-cse lane) → stays stub
Re-verification, not re-run. A fresh committed-build batch completed on apricot this
session (~/.cache/mc-batches/20260604_011524/smoke, completion.marker present,
build_ref=origin/main, detached HEAD e9b14f1a9, 10 seeds T300, finished
2026-06-04 08:28 UTC). It is a smoke batch — the wrong harness for this objective,
and structurally incapable of exercising coupled mode. The decisive blockers below were
all re-verified against the current tree on 2026-06-04 and still hold:
- Coupling is still gated off in main.
git show e9b14f1a9:…/ecology_yields.jsonANDgit show origin/main:…/ecology_yields.json(current main176c51240) both show"fallback_when_dormant": "static_terrain". The JSONdescriptionstates coupling is forced to×1.0understatic_terrain. So the fresh smoke batch measured the static p016b baseline, not the coupled divergence the acceptance requires — exactly as the prior attempt found. - The coupled batch harness still does not exist.
ls tools/run-headless-batch.sh→No such file(re-verified). The recipe the acceptance references was never landed. - Forest-tile classification still has no extraction path.
turn_stats.jsonlcarries no biome / forest-tile-count field (re-verified against20260604_011524/.../turn_stats.jsonl— onlyecology.flora_canopy_{mean,delta}, not starting-region forest %). The "≥30% forest tiles in starting region" predicate cannot be evaluated. - Flipping
ecology_yields.json → "coupled"is a source edit + commit, both forbidden by this no-source-edit committed-build lane. Not performed.
Per-acceptance verdict (unchanged — all unmet, gated out by blocker #1):
- Coupled recipe off
origin/main(≥40f937394) — NOT RUN:40f937394is in main, but coupling is stillstatic_terrain, so no committed build exercises it. - Forest-heavy seeds lift
pop_peak≥+10% — UNMEASURABLE: coupled path inactive in committed build; no forest-tile metric emitted to classify seeds. - Append evidence + commit the flip — OUT OF FENCE: flipping the JSON is a source edit + commit; belongs to a build-and-commit lane, not this one.
Conclusion: status remains stub. This is NOT a balance miss — it is un-runnable
under a no-edit committed-build constraint. Closing it requires a lane permitted to flip
ecology_yields.json → "coupled", emit per-seed forest-tile composition, and commit the
flip + file the report under .project/reports/batches/.
References
- Parent:
.project/objectives/p1-38-biome-economy-coupling.md(closed 2026-05-14; carve-out rationale in this stub's Summary). - Recipe:
p1-38§ "Recommended next-picker recipe (Shipwright)". - Regression fix: commit
40f937394("fix: resolve turn-processor culture research regression"). - Baseline:
p016b_20260417_024754medianpop_peak=69.
True state — 2026-06-04 gap analysis
Verified: stub. Decisive blocker confirmed: ecology_yields.json is static_terrain at both e9b14f1a9 and current main → biome→economy coupling forced ×1.0; tools/run-headless-batch.sh absent; no forest-tile metric in turn_stats. Coupled-mode regression un-runnable under the no-source-edit fence.
Path forward: flip ecology_yields.json off static_terrain (coupling enable — separate data/source change), then run the 10-seed coupled regression.
Blockers: ecology coupling enable must land first.
Demo gate: full-game-only.
Effort: S (once coupling enabled).