magicciv/.project/RELEASE_READINESS.md
Natalie 52c71010c3 docs(release): cite specific sim_scenario proof artifact (.local/proofs/... full BatchResult PASS from committed harness)
- 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>
2026-06-28 14:28:07 -04:00

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.md and public/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 --lib297 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).
  • 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 --headless compatible (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). See 9e32eedf + 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