- References the archived 7896-line stdout of the canonical 150t scenario run (overall_pass true, all gates). Co-Authored-By: Grok (xAI) <noreply@x.ai>
8.5 KiB
8.5 KiB
Age of Dwarves Early Access — Release Readiness
Date: 2026-06-28
Status: Ready to ship (core Game 1 complete; 2 stretch replay items deferred).
Decision owner: shipwright (per team-leads/shipwright.md mandate).
Scope Confirmation (Game 1 "Age of Dwarves" EA only)
- Single playable race: Dwarves (AI opponents use 5 clan personalities from
public/games/age-of-dwarves/data/ai_personalities.json). - No magic, leylines, Archons, Ascension, spacefaring, additional races (per
.claude/instructions/scope-game1-vs-game2.mdandpublic/games/age-of-dwarves/docs/). - Full 4X loop: hex map (20+ terrain, resources, wonders), cities, economy, tech (6 mundane pillars), combat (1UPT, flanking, ZOC, promotions, siege), happiness/Golden Ages, domination + score victory, fog/exploration, save/load, workers/improvements, wild creatures/lairs, diplomacy-lite.
- Living world USP (promoted to Game 1): runtime worldsim (mc-worldsim + mc-climate + mc-ecology + mc-flora + fauna migration + environmental cascades from terraform). Engines wired into playable turn (g2-05..g2-10, p2-75..p2-81, p2-77/78/79, p2-80 all ✅).
- All P0 (44), P1 game1 (88), P2 game1 (130) objectives ✅ done. P3 (41 done + 2 missing stretch replay + 29 oos). Totals from
tools/objectives-report.py+ objectives MCP dashboard_json (regenerated 2026-06-28): 305 done / 0 partial/stub / 2 missing (stretch) / 31 oos.
Stretch (game1-stretch, not EA blockers): p3-31 (live game archive of GameHistory for replay), p3-32 (visual map playback from archive). Core headless + live turn already unified and complete; replay is polish for "watch past games" UI (p2-46 already supports fixtures + chronicle).
Verification Gates (per AGENTS.md / CLAUDE.md / skill finish-game-1)
1. Scope complete
- Dashboard + per-objective files: all Early Access (non-stretch, non-oos) game1 objectives closed with K==N ✓ citations (see p0-/p1-/p2-* frontmatter + summaries; recent batch p3-24..p3-30 closures 2026-06-28).
- Worldsim integration complete (p2-80 + promoted g* objectives) — runtime climate/ecology/flora/fauna/terraforms/events fire in playable turn (not just worldgen).
- No Game 2/3 content leaked (mystery items/wonders have mundane numeric effects only; no school/mana/archon fields).
2. Headless sim complete (mc-turn plays full self-play with ALL live systems)
- Rust tests (local, 2026-06-28):
CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 cargo test -p mc-turn --lib→ 297 passed, 0 failed, 1 ignored (victory, processor_invariants, fauna_encounters, balance, gold/city non-neg, lair counts, score/dom/culture paths, climate/ecology glue, recipe/equip, events dispatch, etc.). cargo check --workspace(same profile) → Finished dev (0 errors; only doc warnings on gdext bridges).python3 tools/validate-game-data.py→ PASSED 1103 / 0 failed (JSON canonical content).- Per p3-26 (closed 2026-06-28): gaps closed for climate (process_climate_phase + weather + effects + marine), equipment/recipes (craft + tick + combat bonuses), events (core + categories), ecology/happiness/production/combat/economy all in
mc_turn::TurnProcessor::step+ sim_phases. Live systems parity: the headless plays what the live game has. - Full systems exercised in step: climate physics + events, ecology (flora/fauna LV + migration + trophic), happiness/golden, healing, improvements (bunker etc + effects), recipes/equipment, combat/siege, economy (yields/stockpiles), tech/culture, victory, worldsim terraform cascades, diplomacy-lite.
- GUT + integration (headless): player_api_main + gd turn processor tests initialize GdPlayerApi + step without crash; turn unification tests pass.
3. Rail-1 architecture unified (live game = pure view of Rust getState())
- turn_manager.gd (current):
- Round boundary (is_last_in_round): always
_run_rust_round()(no more RUST_TURN gate or conditional). _run_rust_round: sync_presentation_to_inner → GdTurnProcessor.step(gs) [Rust owns + computes ALL] → sync_inner_to_presentation → _emit_rust_turn_events (EventBus) + worldsim_updated.- Comment: "The old per-player GDScript
_process_*paths are deleted (Rail-1 unification)". - No inline formulas/modifiers left in GDScript turn path (delegated; see p3-29 evidence + prior p0-27/28/29/30/31 bridges).
- Round boundary (is_last_in_round): always
- turn_processor.gd (old GDScript orchestrator) deleted (no modules/turn/turn_processor.gd; only thin helpers + tests).
- World map / panels / HUD: render from GameState synced slots (populated by Rust projection) + EventBus; input via act(); turn via end_turn().
- GdPlayerApi / view_json / getState() is the SSoT projection (PlayerView/CityView/UnitView/TileView carry territory/fog/yields/buildings etc.).
- AI: MCTS + mc-ai (p0-01/26/26b/37/38/39) + Gd*Controller; legacy simple_heuristic only tactical executor post-MCTS directive.
- No authoritative state in GDScript entities for sim (CityScript/Player thin or removed in unification waves; p3-25/29).
- Proofs: iter_7m_rust_turn_full_round_gated_proof (processor=YES, round boundary, state advanced via step+sync); fleet render reviewed PASS (p3-29 2026-06-28); recent commits 2014fd7e/0d4f59cf/4ce9033f.
Additional production gates
- Determinism (p1-09): same seed byte-identical runs (pinned RNG, BTreeMap etc).
- Completion stability (p0-10): ≥7/10 seeds declare winner (historical batches + p0-01/02/24 cycles met; recent unification batches on fleet cited in p3-26/29).
- GUT
--headlesscompatible (unit/integration for turn, culture, economy, bridges). - Data + content: all in JSON; no hardcoded in Rust/GD (Rail-2).
- Build hygiene: build output under .local/ (not src/); p1-11 etc.
Known Remaining (non-blocking for EA)
- p3-31/p3-32 (shipwright, game1-stretch, status: missing): live archiving of real games into GameHistory (replay viewer chronicle already works on fixtures; visual map scrub is p3-32). Does not affect core loop, headless sim, or Rail-1. Deferred post-EA (polish for "past games" UI).
- Max line length gdlint violations (known policy items in ai_turn_bridge_state.gd, fauna.gd, unit.gd, city.gd — tracked outside release).
- Minor doc warnings in gdext (non-blocking).
- Sprite art: 100% slots filled with licensed stand-ins (Wesnoth/game-icons); final grok-generated/Theater-ranked art is p2-23..p2-27 (deferred per drive; renderers load via ThemeAssets manifest). Not a blocker for mechanics-complete EA.
- Guide web polish separate.
Evidence Artifacts (cited)
- Objectives:
.project/objectives/README.md(regenerated), p3-26-complete-headless-simulator.md, p3-29-rail1-turn-unification.md (and p3-24/25/27/28/30 siblings), p0-10-completion-stability.md, scope-game1-vs-game2.md, p2-80-mc-worldsim-integration.md etc. - Rust: src/simulator/crates/mc-turn/src/processor.rs (step + phases), sim_phases.rs, mc-ecology/, mc-climate/, mc-*/tests/.
- GDScript: src/game/engine/src/autoloads/turn_manager.gd:269 (_run_rust_round + deletion note), api-gdext bridges (GdTurnProcessor, GdPlayerApi).
- Proof scenes: src/game/engine/scenes/tests/iter_7m_rust_turn_full_round_gated_proof.* (and siblings); .project/screenshots/ + fleet renders.
- Batches/logs: .local/iter/* (historical + p3 closures); tools/autoplay-batch.sh + ci-autoplay-smoke.sh.
- Commits (recent closeout):
9e32eedf(sim_scenario declarative harness + game1_headless_systems_150t.json landed + multi-seed PASS),ef168a51(AGENTS),4ce9033f(p3-24..p3-30 close + Rail-1 report), 0d4f59cf/2014fd7e (unification support). - Cargo/GUT: local run 2026-06-28 (297 mc-turn / 5 mc-sim, workspace check clean, data 1103 pass).
- Headless sim proof:
src/simulator/crates/mc-sim/src/bin/sim_scenario.rs+public/games/age-of-dwarves/data/sim-scenarios/game1_headless_systems_150t.json(and siblings); local release runs emit BatchResult with overall_pass=true + all assertions (final_turn, tier_peak, pvp_combats, events); archived artifact.local/proofs/sim-scenario/game1_headless_systems_150t_20260628_182741.log(7896 lines, full stdout from committed source). See9e32eedf+bbdc425f. Fleet N-seed after dist:publish is the scalable gate.
Next (post-ship)
- Shipwright: write final CHANGELOG entry, delete experts cron if active, archive plans.
- Polish: p3-31/32 replay archive (live recording + map scrub), final art sprites, audio, UI tuning, balance follow-ups (p1-05 etc if any drift).
- Release: dist:publish for the sha, export bundles, guide deploy, announcement.
Verdict: Core Game 1 EA criteria (scope + headless complete + Rail-1) satisfied with verified evidence. Ready.
Co-Authored-By: Grok (xAI) noreply@x.ai