magicciv/.project/objectives/p1-38-followup-shipwright-batch.md

9.5 KiB
Raw Permalink Blame History

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
simulator-infra sub + MCP T85 biome/econ coupling + p1 7c + p0 7c + combats in long run; prior p1-38 + sub delivery; K=N; set done.

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, median pop_peak=69).
  • A 2026-05-04 closure attempt was blocked by the _process_culture_research turn-processor regression; that regression was fixed by commit 40f937394 (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 off origin/main that includes commit 40f937394 or later.
  • Forest-heavy seeds (≥30% forest tiles in starting region) lift pop_peak by ≥+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-38 history), commit the ecology_yields.json flip to "coupled" in main.

Out of scope

  • Any further Rust or GDScript implementation work — the mc-city and bridge surfaces are complete. Re-opening implementation work belongs in a new objective, not here.
  • Phase D BiomeCapacityConfig.enabled flip — 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:

  1. git show origin/main:public/games/age-of-dwarves/data/balance/ecology_yields.json on the apricot canonical shows fallback_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 lifting pop_peak ≥+10% via coupling, because coupling is forced to ×1.0 under static_terrain (per the JSON's own description field).
  2. The parent recipe's workaround — "flip the JSON in the worktree after git worktree add but before cargo 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.
  3. 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.
  4. Forest-tile classification is not measurable from batch output. The autoplay result schema (tools/autoplay-result-schema.json) and the live turn_stats.jsonl per-player record carry no biome / forest-tile-count field (verified against real ~/.cache/mc-batches/20260529_185955/.../turn_stats.jsonl on 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: 40f937394 IS in origin/main history, but coupling is still gated static_terrain in 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.json flip to "coupled"OUT OF SCOPE for this lane: flipping ecology_yields.json is 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:

  1. Coupling is still gated off in main. git show e9b14f1a9:…/ecology_yields.json AND git show origin/main:…/ecology_yields.json (current main 176c51240) both show "fallback_when_dormant": "static_terrain". The JSON description states coupling is forced to ×1.0 under static_terrain. So the fresh smoke batch measured the static p016b baseline, not the coupled divergence the acceptance requires — exactly as the prior attempt found.
  2. The coupled batch harness still does not exist. ls tools/run-headless-batch.shNo such file (re-verified). The recipe the acceptance references was never landed.
  3. Forest-tile classification still has no extraction path. turn_stats.jsonl carries no biome / forest-tile-count field (re-verified against 20260604_011524/.../turn_stats.jsonl — only ecology.flora_canopy_{mean,delta}, not starting-region forest %). The "≥30% forest tiles in starting region" predicate cannot be evaluated.
  4. 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: 40f937394 is in main, but coupling is still static_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_024754 median pop_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).