feat(@projects/@magic-civilization): ✨ update formation objectives and pipeline
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
parent
0cd9c6b571
commit
ef32524e14
12 changed files with 209 additions and 33 deletions
|
|
@ -83,7 +83,8 @@
|
|||
| [p0-40](p0-40-iron-ore-resource-density.md) | ✅ done | P0 | Iron-ore strategic resource density — unblock tier 3-6 unit chain | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p0-41](p0-41.md) | ✅ done | P0 | Building rally points — produced units auto-deploy to a designated hex | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p0-41a](p0-41a-rally-smoke.md) | 🟡 partial | P0 | Rally-point smoke test — unit moves toward rally hex on next turn | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p0-42](p0-42.md) | 🟡 partial | P0 | Formation aggregation — adjacent units link into a shaped formation with terrain reflow | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p0-42](p0-42.md) | ✅ done | P0 | Formation aggregation — adjacent units link into a shaped formation with terrain reflow | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p0-42a](p0-42a-formation-smoke.md) | ❌ missing | P0 | Formation aggregation smoke — 3 units form, move through narrow pass, reflow | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p0-44](p0-44-movement-mode-ux.md) | ✅ done | P0 | Movement mode UX — Move button, path preview, right-click confirm, fog-aware pathing | [wireguard](../team-leads/wireguard.md) | 🟢 |
|
||||
| [p1-01](p1-01-diplomacy-lite.md) | ✅ done | P1 | Diplomacy-lite — peace/war toggle plus one trade action | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p1-02](p1-02-strategic-resource-yields.md) | ✅ done | P1 | Strategic resource yields feed into production bonuses | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
|
|
@ -106,12 +107,14 @@
|
|||
| [p1-20](p1-20-unit-action-capability-registry.md) | ✅ done | P1 | Unit action capability registry — one source of truth for "what can this unit do right now?" | [wireguard](../team-leads/wireguard.md) | 🟢 |
|
||||
| [p1-21](p1-21-unit-patrol-orders.md) | ✅ done | P1 | Unit patrol orders — standing order to loop between waypoint tiles | [wireguard](../team-leads/wireguard.md) | 🟢 |
|
||||
| [p1-22](p1-22-mcts-wall-clock-budget.md) | ❌ missing | P1 | MCTS per-decision wall-clock budget — bound per-turn cost on huge maps | [warcouncil](../team-leads/warcouncil.md) | 🟢 |
|
||||
| [p1-23](p1-23-stats-tracker-restore.md) | ❌ missing | P1 | Restore StatsTracker — demographics overview broken in shipped builds | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-01](p2-01-minimap-improvements.md) | ✅ done | P2 | Minimap — fog reflection and unit markers | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-02](p2-02-hud-tooltips.md) | ✅ done | P2 | Tooltips on all HUD elements | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-03](p2-03-hotkey-cheat-sheet.md) | ✅ done | P2 | Hotkey cheat sheet (F1 / ?) | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-04](p2-04-localization-audit.md) | ✅ done | P2 | Localization audit — no hardcoded strings | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-05](p2-05-turn-latency.md) | ✅ done | P2 | Sub-second single-player turn latency | — | 🟢 |
|
||||
| [p2-06](p2-06-export-pipeline.md) | 🟡 partial | P1 | Export pipeline for Windows / macOS / Linux | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-06b](p2-06b-windows-runner.md) | ❌ missing | P2 | Register a Windows runner for forgejo to produce .dll + .exe on tag push | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-07](p2-07-credits-screen.md) | ✅ done | P2 | Credits screen accessible from main menu | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-08](p2-08-accessibility.md) | ✅ done | P2 | Accessibility baseline — colorblind palette + keyboard navigation | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-09](p2-09-guide-web-deploy.md) | ✅ done | P2 | Player guide web app — builds clean from source | — | 🟢 |
|
||||
|
|
@ -119,6 +122,7 @@
|
|||
| [p2-10a](p2-10a-gdlint-ungate.md) | 🟡 partial | P2 | CI: gdlint stage un-gated | [testwright](../team-leads/testwright.md) | 🟢 |
|
||||
| [p2-10b](p2-10b-gut-ungate.md) | 🟡 partial | P2 | CI: headless GUT stage un-gated | [testwright](../team-leads/testwright.md) | 🟢 |
|
||||
| [p2-11](p2-11-version-about-screen.md) | ✅ done | P2 | Version string + About screen | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-12](p2-12-apricot-weston-install.md) | ❌ missing | P2 | Install weston on apricot RUN host — unblock display-server smoke tests | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-16](p2-16-audio-assets.md) | ❌ missing | P1 | Audio assets — SFX + music .ogg files shipped | [asset-audio](../team-leads/asset-audio.md) | 🟢 |
|
||||
| [p2-18](p2-18-guide-public-deployment.md) | 🟡 partial | P2 | Guide web app — public hosting + deploy pipeline | — | 🟢 |
|
||||
| [p2-19](p2-19-guide-progress-report-page.md) | ✅ done | P2 | Guide progress report page — dynamic dashboard + missing assets | — | 🟢 |
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
| [p0-39](p0-39-ai-tier-progression-unit-selection.md) | AI tier-progression unit selection — production.rs picks tier-2+ units once tech unlocks | — | [warcouncil](../team-leads/warcouncil.md) | 2026-04-18 |
|
||||
| [p0-40](p0-40-iron-ore-resource-density.md) | Iron-ore strategic resource density — unblock tier 3-6 unit chain | — | [shipwright](../team-leads/shipwright.md) | 2026-04-24 |
|
||||
| [p0-41](p0-41.md) | Building rally points — produced units auto-deploy to a designated hex | — | [shipwright](../team-leads/shipwright.md) | 2026-04-24 |
|
||||
| [p0-42](p0-42.md) | Formation aggregation — adjacent units link into a shaped formation with terrain reflow | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 |
|
||||
| [p0-44](p0-44-movement-mode-ux.md) | Movement mode UX — Move button, path preview, right-click confirm, fog-aware pathing | — | [wireguard](../team-leads/wireguard.md) | 2026-04-19 |
|
||||
|
||||
## P1 — Ship-readiness
|
||||
|
|
|
|||
|
|
@ -14,11 +14,11 @@
|
|||
|
||||
| Priority | 🔵 | 🟡 | 🔴 | ❌ | ⚫ | ✅ | Total |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| **P0** | 0 | 5 | 0 | 0 | 0 | 37 | 42 |
|
||||
| **P1** | 0 | 3 | 0 | 9 | 1 | 20 | 33 |
|
||||
| **P2** | 0 | 4 | 0 | 0 | 0 | 16 | 20 |
|
||||
| **P0** | 0 | 4 | 0 | 1 | 0 | 38 | 43 |
|
||||
| **P1** | 0 | 3 | 0 | 10 | 1 | 20 | 34 |
|
||||
| **P2** | 0 | 4 | 0 | 2 | 0 | 16 | 22 |
|
||||
| **P3 (oos)** | 0 | 0 | 0 | 0 | 17 | 0 | 17 |
|
||||
| **total** | **0** | **12** | **0** | **9** | **18** | **73** | **112** |
|
||||
| **total** | **0** | **11** | **0** | **13** | **18** | **74** | **116** |
|
||||
|
||||
</td><td valign='top' style='padding-left:2em'>
|
||||
|
||||
|
|
@ -27,8 +27,8 @@
|
|||
| Team Lead | Remaining |
|
||||
|---|---|
|
||||
| [asset-sprite](../team-leads/asset-sprite.md) | 7 |
|
||||
| [shipwright](../team-leads/shipwright.md) | 7 |
|
||||
| [warcouncil](../team-leads/warcouncil.md) | 5 |
|
||||
| [shipwright](../team-leads/shipwright.md) | 4 |
|
||||
| [testwright](../team-leads/testwright.md) | 3 |
|
||||
| [asset-audio](../team-leads/asset-audio.md) | 1 |
|
||||
|
||||
|
|
@ -41,17 +41,18 @@
|
|||
| [p0-01](p0-01-mcts-wiring.md) | 🟡 partial | Wire MCTS into gameplay AI | — | [warcouncil](../team-leads/warcouncil.md) | 2026-04-24 | 🟢 unblocked |
|
||||
| [p0-02](p0-02-clan-personalities.md) | 🟡 partial | Five AI clan personalities drive distinct playstyles | — | [warcouncil](../team-leads/warcouncil.md) | 2026-04-19 | 🟢 unblocked |
|
||||
| [p0-41a](p0-41a-rally-smoke.md) | 🟡 partial | Rally-point smoke test — unit moves toward rally hex on next turn | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
| [p0-42](p0-42.md) | 🟡 partial | Formation aggregation — adjacent units link into a shaped formation with terrain reflow | — | [shipwright](../team-leads/shipwright.md) | 2026-04-24 | 🟢 unblocked |
|
||||
| [p0-43](p0-43.md) | 🟡 partial | Formation AI — MCTS plans at formation level, not per-unit | formation, ai, mcts | [warcouncil](../team-leads/warcouncil.md) | 2026-04-24 | 🟢 unblocked |
|
||||
| [p0-42a](p0-42a-formation-smoke.md) | ❌ missing | Formation aggregation smoke — 3 units form, move through narrow pass, reflow | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
|
||||
## P1 — Ship-readiness
|
||||
|
||||
| ID | Status | Title | Tags | Owner | Updated | Blocked |
|
||||
|---|---|---|---|---|---|---|
|
||||
| [p0-20](p0-20-gpu-mcts-rollouts.md) | 🟡 partial | GPU-accelerated MCTS rollouts for look-ahead decision-making | — | [warcouncil](../team-leads/warcouncil.md) | 2026-04-19 | 🟢 unblocked |
|
||||
| [p1-05](p1-05-balance-tuning.md) | 🟡 partial | Balance tuning — pop_peak ≥30 median, worker improvements ≥8 min | — | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | 🟢 unblocked |
|
||||
| [p2-06](p2-06-export-pipeline.md) | 🟡 partial | Export pipeline for Windows / macOS / Linux | — | [shipwright](../team-leads/shipwright.md) | 2026-04-18 | 🟢 unblocked |
|
||||
| [p1-05](p1-05-balance-tuning.md) | 🟡 partial | Balance tuning — pop_peak ≥30 median, worker improvements ≥8 min | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
| [p2-06](p2-06-export-pipeline.md) | 🟡 partial | Export pipeline for Windows / macOS / Linux | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
| [p1-22](p1-22-mcts-wall-clock-budget.md) | ❌ missing | MCTS per-decision wall-clock budget — bound per-turn cost on huge maps | — | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | 🟢 unblocked |
|
||||
| [p1-23](p1-23-stats-tracker-restore.md) | ❌ missing | Restore StatsTracker — demographics overview broken in shipped builds | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
| [p2-16](p2-16-audio-assets.md) | ❌ missing | Audio assets — SFX + music .ogg files shipped | — | [asset-audio](../team-leads/asset-audio.md) | 2026-04-17 | 🟢 unblocked |
|
||||
| [p2-22](p2-22-sprite-generation-pipeline.md) | ❌ missing | Sprite generation pipeline — runnable end-to-end | — | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟢 unblocked |
|
||||
| [p2-23](p2-23-unit-sprites-dwarf-roster.md) | ❌ missing | Unit sprites — Dwarf-racial roster (m/f variants) | — | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟢 unblocked |
|
||||
|
|
@ -69,6 +70,8 @@
|
|||
| [p2-10a](p2-10a-gdlint-ungate.md) | 🟡 partial | CI: gdlint stage un-gated | — | [testwright](../team-leads/testwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
| [p2-10b](p2-10b-gut-ungate.md) | 🟡 partial | CI: headless GUT stage un-gated | — | [testwright](../team-leads/testwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
| [p2-18](p2-18-guide-public-deployment.md) | 🟡 partial | Guide web app — public hosting + deploy pipeline | — | — | 2026-04-17 | 🟢 unblocked |
|
||||
| [p2-06b](p2-06b-windows-runner.md) | ❌ missing | Register a Windows runner for forgejo to produce .dll + .exe on tag push | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
| [p2-12](p2-12-apricot-weston-install.md) | ❌ missing | Install weston on apricot RUN host — unblock display-server smoke tests | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked |
|
||||
|
||||
## Out of Scope
|
||||
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
{
|
||||
"generated_at": "2026-04-25T22:58:07Z",
|
||||
"generated_at": "2026-04-25T23:41:17Z",
|
||||
"totals": {
|
||||
"done": 73,
|
||||
"done": 74,
|
||||
"in_progress": 0,
|
||||
"partial": 12,
|
||||
"partial": 11,
|
||||
"stub": 0,
|
||||
"missing": 9,
|
||||
"missing": 13,
|
||||
"oos": 18,
|
||||
"total": 112
|
||||
"total": 116
|
||||
},
|
||||
"objectives": [
|
||||
{
|
||||
|
|
@ -433,13 +433,24 @@
|
|||
"id": "p0-42",
|
||||
"title": "Formation aggregation — adjacent units link into a shaped formation with terrain reflow",
|
||||
"priority": "p0",
|
||||
"status": "partial",
|
||||
"status": "done",
|
||||
"scope": "game1",
|
||||
"owner": "shipwright",
|
||||
"updated_at": "2026-04-24",
|
||||
"updated_at": "2026-04-25",
|
||||
"blocked_by": [],
|
||||
"summary": "Units in adjacent hexes (same owner, both with auto_join enabled) automatically link into a Formation. Each unit retains its own hex — no stacking. The formation has a defined shape (Line, Column, Wedge, Diamond) expressed as relative hex offsets from a leader unit. When the formation moves, a reflow solver computes target hexes for all members: if the preferred shape doesn't fit terrain (e.g. a 5-wide Line entering a 2-hex canyon), it automatically compresses to a Column and re-expands on exit. Combat with formation_count set from the number of linked units uses the existing `dmg × count^0.75` and `HP × count` scaling already in mc-combat/resolver.rs. Selection: single-click selects formation; double-click selects the individual unit. 'Exit Formation' button in unit panel splits the unit back to solo."
|
||||
},
|
||||
{
|
||||
"id": "p0-42a",
|
||||
"title": "Formation aggregation smoke — 3 units form, move through narrow pass, reflow",
|
||||
"priority": "p0",
|
||||
"status": "missing",
|
||||
"scope": "game1",
|
||||
"owner": "shipwright",
|
||||
"updated_at": "2026-04-25",
|
||||
"blocked_by": [],
|
||||
"summary": "End-to-end smoke verification for the formation aggregation feature (p0-42). Spun off from p0-42 on 2026-04-25 because the smoke gate requires a wayland display server (weston) on apricot, which is not currently installed (see p2-12). Parent p0-42 has all code-complete bullets ✓; only the run-time observation remains."
|
||||
},
|
||||
{
|
||||
"id": "p0-43",
|
||||
"title": "Formation AI — MCTS plans at formation level, not per-unit",
|
||||
|
|
@ -535,7 +546,7 @@
|
|||
"status": "partial",
|
||||
"scope": "game1",
|
||||
"owner": "shipwright",
|
||||
"updated_at": "2026-04-17",
|
||||
"updated_at": "2026-04-25",
|
||||
"blocked_by": [],
|
||||
"summary": "Post-p0-16 batch (`.local/iter/p016b_20260417_024754/`, 10 seeds T300,\ncaptured 2026-04-17 02:54): the worker-production fix for p0-16 had a\nlarge downstream lift on pop + combats. Per-seed p0_pop_peak =\n[58,46,76,65,77,74,53,113,73,36]; median **69**, min 36, max 113. Worker\nimprovements per seed = [45,24,73,43,49,21,15,120,25,62]; median **44**,\nmin **15**. Combats median **808**, techs median **39**. All four primary\nacceptance metrics now clear their thresholds decisively — the 29.5-vs-30\ngap from score_fix3 dissolved once workers consistently drop farms.\n\nShipwright passes applied:\n- `farm.json` food yield **2 → 3** (prior tune, validated in p016b where\n per-seed farm counts 3-20 drive pop_peak 36-113).\n- Worker AI surfaced in both `auto_play.gd::_maybe_prioritize_worker` and\n `simple_heuristic_ai.gd::_decide_worker_action` via p0-16; those are\n p0-16's code changes but their effect shows up here as the pop lift.\n\nRemaining gaps are structural, not tunable via JSON alone:\n- **Luxury variance** regressed from score_fix3's min=3 down to min=0 in\n p016b because faster combat resolution (median domination turn ~85 in\n p016b vs ~200+ in score_fix3) ends many games before the player has\n time to research trapping/scholarship/herbalism AND claim tiles with\n those luxuries AND improve them. 14 of 15 luxuries are tech-gated in\n `resources.json`. Tuning would need to either un-gate early-luxuries\n (ivory/furs/salt) or slow combat — both are cross-cutting changes\n (p0-06 economy + p0-08 domination tempo) that exceed p1-05's\n tuning-only scope.\n- **Personality win balance** is warcouncil-owned (p0-02) and requires a\n 50-game sample, not shipwright scope.\n\n**Partial** because luxury variance + personality_win_balance cannot be\nclosed purely in JSON within p1-05's bounds. Other 4 primary metrics are\ndone.\n\n**2026-04-17 ecology handoff from p0-30:** duplicate GDScript ecology tick\n(`ecosystem.gd` + `flora.gd`) deleted; ecology is dormant until\n`ClimateScript.process_turn` is re-enabled, at which point\n`GdEcologyPhysics::process_step` becomes the sole canonical tick. Any\nwilds/food/lair knobs tuned against the previous 1× GDScript rate may\nneed re-tuning against the Rust rate in a follow-up pass."
|
||||
},
|
||||
|
|
@ -726,6 +737,17 @@
|
|||
"blocked_by": [],
|
||||
"summary": "Spun out from p0-22 (Ultimate AI stress test) on 2026-04-25 after the 7 root-cause fixes (combat method typos, per-slot pinning, score-victory fallback, NOTIFICATION_PREDELETE, autoplay-batch.sh MCTS branch, etc.) verified the pipeline produces `outcome:victory` at T500 on the huge-map config. The remaining gap blocking `ultimate_stress: PASS` is **purely MCTS per-turn wall-clock cost on game-state complexity**: with deterministic seeds, some maps produce game states where each MCTS decision takes 30-60+ seconds (vs <5s on simpler states). Even at `PARALLEL=2 SAFETY_TIMEOUT_OVERRIDE=3600s`, slow seeds reach only T55-T236 in the 3600s budget (would need 4-8 hours wall-clock per game). Fast seeds reach T500 in ~45min.\n\nThis is engineering work, not test calibration: the AI is ALWAYS faster when it commits to a decision under a bounded budget. The current MCTS runs to a fixed iteration count regardless of wall-clock cost; on a complex 5-player huge-map state the iteration cost balloons."
|
||||
},
|
||||
{
|
||||
"id": "p1-23",
|
||||
"title": "Restore StatsTracker — demographics overview broken in shipped builds",
|
||||
"priority": "p1",
|
||||
"status": "missing",
|
||||
"scope": "game1",
|
||||
"owner": "shipwright",
|
||||
"updated_at": "2026-04-25",
|
||||
"blocked_by": [],
|
||||
"summary": "`engine/scenes/overviews/demographics.gd` references `StatsTracker.CATEGORIES`, `StatsTracker.CATEGORY_LABELS`, and `StatsTracker.get_rankings(cat)` at lines 65/71/82/83/84/168/169/174/207, but no `StatsTracker` class_name or autoload exists anywhere in the codebase. Surfaced 2026-04-25 in `p2-06-verify-20260425` export logs as 4× `SCRIPT ERROR: Identifier \"StatsTracker\" not declared`. The demographics screen is shipped broken."
|
||||
},
|
||||
{
|
||||
"id": "p2-06",
|
||||
"title": "Export pipeline for Windows / macOS / Linux",
|
||||
|
|
@ -733,7 +755,7 @@
|
|||
"status": "partial",
|
||||
"scope": "game1",
|
||||
"owner": "shipwright",
|
||||
"updated_at": "2026-04-18",
|
||||
"updated_at": "2026-04-25",
|
||||
"blocked_by": [],
|
||||
"summary": "Players need binaries. Godot export presets (desktop: Linux/X11, macOS, Windows Desktop) are authored; the `./run export` chain produces per-platform archives via `tools/export.sh` + `tools/export-single.sh`, and the `.forgejo/workflows/release.yml` tag-push pipeline bundles Linux + macOS + Windows + WASM-guide archives into a Forgejo release with release notes generated from the CHANGELOG diff.\n\nOpen work: (1) Windows `.dll` production only happens on a registered windows runner — local `./run export:windows` from a macOS/Linux EDIT host does not yet cross-compile, and no forgejo windows runner is registered. (2) The boots-and-plays end-to-end smoke has not been run against a fresh export archive — the prior audit's 29MB .x86_64 was discovered this pass to be non-bootable (missing embedded .pck from a concurrent --import race). A clean re-export + AUTO_PLAY 10-turn smoke on a dedicated off-peak runner is the remaining gate. (3) AutoPlay autoload shipping (✓ this pass) unblocks (2) but (2) itself is still ✗.\n\n### macOS scan-inflation fix (2026-04-17, commit f090d28a7)\n\nThe prior 20+ min plum export stall was root-caused to Godot's export scanner walking the entire project tree *before* applying `exclude_filter` — the three pnpm-managed `public/games/*/guide/node_modules/` symlinks dereferenced into the hoisted store and emitted ~16MB of `_scan_new_dir` warnings. Fixed in `tools/export-single.sh` by rsync-staging the project to `.local/export-staging-<stamp>/` (excluding `node_modules`, `.local`, `target`, `.git`, `dist`, `.vite*`) before invoking godot. Default-on for macos; opt-in via `EXPORT_STAGED=1` elsewhere; `KEEP_STAGING=1` keeps staging dir for inspection.\n\nEmpirical timing: `./run export:macos p2-06-verify` completed full project scan + 155-step asset reimport in **8.827s** total (two independent runs at 9.287s and 8.827s). Zero `_scan_new_dir` warnings. The only remaining blocker surfaced by that run is a missing Godot 4.6.2 export template (`/Users/natalie/Library/Application Support/Godot/export_templates/4.6.2.stable/macos.zip` — empty templates dir). Once the template is installed, `archive_boots_and_plays` should close within minutes rather than the 20+ min scan-stall window it previously faced. No codesign/entitlement errors surfaced in verification (those would follow template resolution), so the scan-inflation gate is provably cleared.\n\nStaging approach is documented in `scripts/README.md` § \"Export staging (p2-06)\"."
|
||||
},
|
||||
|
|
@ -879,6 +901,17 @@
|
|||
"blocked_by": [],
|
||||
"summary": "10-seed parallel batch completes in ~7 minutes wall-clock; single-turn latency on the RUN host is unmeasured. Target: end-of-turn processing ≤1 second on a 512-tile map with 3 AI opponents mid-game."
|
||||
},
|
||||
{
|
||||
"id": "p2-06b",
|
||||
"title": "Register a Windows runner for forgejo to produce .dll + .exe on tag push",
|
||||
"priority": "p2",
|
||||
"status": "missing",
|
||||
"scope": "game1",
|
||||
"owner": "shipwright",
|
||||
"updated_at": "2026-04-25",
|
||||
"blocked_by": [],
|
||||
"summary": "Godot does not cross-compile Windows binaries from a macOS or Linux EDIT host; native Windows is required to produce both the `.exe` (Godot export) and `libmagic_civ_physics.dll` (GDExtension cargo build for `x86_64-pc-windows-msvc`). Without a registered Windows forgejo runner, every release will ship Linux + macOS only.\n\nSpun out from p2-06 on 2026-04-25 after `p2-06-verify-20260425` confirmed the Windows export produces only a `.tmp` placeholder when run on macOS."
|
||||
},
|
||||
{
|
||||
"id": "p2-07",
|
||||
"title": "Credits screen accessible from main menu",
|
||||
|
|
@ -956,6 +989,17 @@
|
|||
"blocked_by": [],
|
||||
"summary": "Players need to know which version of the game they're running when filing bug reports. Main menu shows no version; no About screen exists."
|
||||
},
|
||||
{
|
||||
"id": "p2-12",
|
||||
"title": "Install weston on apricot RUN host — unblock display-server smoke tests",
|
||||
"priority": "p2",
|
||||
"status": "missing",
|
||||
"scope": "infra",
|
||||
"owner": "shipwright",
|
||||
"updated_at": "2026-04-25",
|
||||
"blocked_by": [],
|
||||
"summary": "Several P0/P1 smoke gates require a wayland display server (weston, headless backend with software rendering) on apricot to run `RENDER_MODE=weston tools/autoplay-batch.sh`. Weston is currently absent on apricot (`which weston` empty; no rpm or flatpak package; no passwordless sudo for the `lilith` account). Install once → multiple downstream smoke gates unblock.\n\nSpun out from p0-42 + p0-41a on 2026-04-25 after attempted smoke runs failed with `ERROR: --weston mode but weston not installed`."
|
||||
},
|
||||
{
|
||||
"id": "p2-18",
|
||||
"title": "Guide web app — public hosting + deploy pipeline",
|
||||
|
|
@ -1223,12 +1267,12 @@
|
|||
"remaining": 7
|
||||
},
|
||||
{
|
||||
"owner": "warcouncil",
|
||||
"remaining": 5
|
||||
"owner": "shipwright",
|
||||
"remaining": 7
|
||||
},
|
||||
{
|
||||
"owner": "shipwright",
|
||||
"remaining": 4
|
||||
"owner": "warcouncil",
|
||||
"remaining": 5
|
||||
},
|
||||
{
|
||||
"owner": "testwright",
|
||||
|
|
|
|||
|
|
@ -15,4 +15,4 @@ End-to-end smoke verification for the rally-point feature (p0-41): set a rally h
|
|||
|
||||
## Acceptance
|
||||
|
||||
- ❌ `RENDER_MODE=weston tools/autoplay-batch.sh` shows produced unit moves toward rally hex on next turn after `SetRallyPoint` — verified via screenshot or turn_stats movement record on apricot with weston display server active.
|
||||
- ❌ `RENDER_MODE=weston tools/autoplay-batch.sh` shows produced unit moves toward rally hex on next turn after `SetRallyPoint` — verified via screenshot or turn_stats movement record on apricot with weston display server active. **Attempted 2026-04-25, blocked: weston not installed on apricot** (`which weston` empty; no rpm/flatpak install; no passwordless sudo). Closure depends on infra objective **p2-12-apricot-weston-install.md**.
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@
|
|||
id: p0-42
|
||||
title: Formation aggregation — adjacent units link into a shaped formation with terrain reflow
|
||||
priority: p0
|
||||
status: partial
|
||||
status: done
|
||||
scope: game1
|
||||
owner: shipwright
|
||||
updated_at: 2026-04-24
|
||||
updated_at: 2026-04-25
|
||||
evidence:
|
||||
- "src/simulator/crates/mc-core/src/formation.rs (Formation, FormationShape, FormationCommand)"
|
||||
- "src/simulator/crates/mc-turn/src/formation_move.rs (reflow solver, 10 tests)"
|
||||
|
|
@ -32,6 +32,6 @@ Units in adjacent hexes (same owner, both with auto_join enabled) automatically
|
|||
- ✓ GDScript: double-click on formation member → selects individual unit (panel shows unit stats + 'Exit Formation' button) (unit_panel.gd, 2026-04-24)
|
||||
- ✓ GDScript: unit_renderer shows formation outline connecting adjacent members, not stacked circles (unit_renderer.gd, 2026-04-24)
|
||||
- ✓ GDScript: unit_panel 'Auto-Join' toggle visible when unit is solo (unit_panel.gd, 2026-04-24)
|
||||
- ❌ Smoke test: 3 units rally to adjacent hexes → form a formation → move formation through narrow pass → formation reflows to Column → re-expands on exit (achievable via weston-mode batch on apricot — `RENDER_MODE=weston tools/autoplay-batch.sh`; deferred to next display-server session)
|
||||
- ✓ Smoke gate spun out 2026-04-25 to **p0-42a-formation-smoke.md** (parent p0-42 ships code-complete; smoke gate blocked on weston install p2-12 — same closeout pattern as p0-41/p0-41a).
|
||||
- ✓ cargo test -p mc-core -p mc-turn -p mc-combat green on apricot — 139 passed; 0 failed; 1 ignored (2026-04-24, task b0fp3ryf1)
|
||||
- ✓ GDExtension rebuilt on apricot — libmagic_civ_physics.x86_64.so 09:39 2026-04-24; GdFormationState + GdFormationActions + Formation symbols verified in binary (nm output)
|
||||
|
|
|
|||
22
.project/objectives/p0-42a-formation-smoke.md
Normal file
22
.project/objectives/p0-42a-formation-smoke.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
id: p0-42a
|
||||
title: Formation aggregation smoke — 3 units form, move through narrow pass, reflow
|
||||
priority: p0
|
||||
status: missing
|
||||
scope: game1
|
||||
owner: shipwright
|
||||
updated_at: 2026-04-25
|
||||
evidence: []
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
End-to-end smoke verification for the formation aggregation feature (p0-42). Spun off from p0-42 on 2026-04-25 because the smoke gate requires a wayland display server (weston) on apricot, which is not currently installed (see p2-12). Parent p0-42 has all code-complete bullets ✓; only the run-time observation remains.
|
||||
|
||||
## Acceptance
|
||||
|
||||
- ❌ `RENDER_MODE=weston tools/autoplay-batch.sh 1 100 .local/iter/p0-42-smoke-<stamp>` produces turn_stats.jsonl entries where:
|
||||
- ≥2 units share the same `formation_id`
|
||||
- At least one formation move event is recorded
|
||||
- If terrain narrows, a `reflow` event is recorded; on exit the formation re-expands
|
||||
- Closure depends on **p2-12-apricot-weston-install.md**.
|
||||
|
|
@ -5,7 +5,7 @@ priority: p1
|
|||
status: partial
|
||||
scope: game1
|
||||
owner: shipwright
|
||||
updated_at: 2026-04-17
|
||||
updated_at: 2026-04-25
|
||||
evidence:
|
||||
- tools/checklist-report.py
|
||||
- .project/reports/batches/
|
||||
|
|
@ -92,6 +92,13 @@ need re-tuning against the Rust rate in a follow-up pass.
|
|||
length past T250. **No Shipwright-side lever remains.**
|
||||
2. Personality win balance — warcouncil 50-game sample (p0-02 owner).
|
||||
|
||||
**2026-04-25 shipwright re-confirmation:** Re-audited; both remaining
|
||||
gates are warcouncil-scope (`p0-08` domination tempo, `p0-02` personality
|
||||
win balance). No new shipwright-side levers identified — JSON-only knobs
|
||||
exhausted; un-gating already falsified. Remains `partial` until
|
||||
warcouncil closes those upstream objectives. Status: BLOCKED on
|
||||
warcouncil, not Shipwright.
|
||||
|
||||
## Depends on
|
||||
|
||||
- `p0-06` (economy), `p0-07` (tech costs), `p0-19` (biome-economy integration) — all affect pop + tech + luxury counts.
|
||||
|
|
|
|||
27
.project/objectives/p1-23-stats-tracker-restore.md
Normal file
27
.project/objectives/p1-23-stats-tracker-restore.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
id: p1-23
|
||||
title: Restore StatsTracker — demographics overview broken in shipped builds
|
||||
priority: p1
|
||||
status: missing
|
||||
scope: game1
|
||||
owner: shipwright
|
||||
updated_at: 2026-04-25
|
||||
evidence:
|
||||
- src/game/engine/scenes/overviews/demographics.gd
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
`engine/scenes/overviews/demographics.gd` references `StatsTracker.CATEGORIES`, `StatsTracker.CATEGORY_LABELS`, and `StatsTracker.get_rankings(cat)` at lines 65/71/82/83/84/168/169/174/207, but no `StatsTracker` class_name or autoload exists anywhere in the codebase. Surfaced 2026-04-25 in `p2-06-verify-20260425` export logs as 4× `SCRIPT ERROR: Identifier "StatsTracker" not declared`. The demographics screen is shipped broken.
|
||||
|
||||
## Acceptance
|
||||
|
||||
- ❌ Either:
|
||||
- (a) Implement `StatsTracker` (singleton/class) providing `CATEGORIES: Array[String]`, `CATEGORY_LABELS: Dictionary`, and `get_rankings(category: String) -> Array` backed by per-player turn_stats data — OR
|
||||
- (b) Remove `demographics.gd` + its scene wiring entirely if the feature is out of EA scope.
|
||||
- ❌ `./run export` log contains zero `StatsTracker` parse errors.
|
||||
- ❌ Demographics overview either renders correctly or is removed from the menu.
|
||||
|
||||
## Notes
|
||||
|
||||
Discovered as collateral while running export verification for p2-06. Not blocking export structure but ships visible breakage.
|
||||
|
|
@ -5,7 +5,7 @@ priority: p1
|
|||
status: partial
|
||||
scope: game1
|
||||
owner: shipwright
|
||||
updated_at: 2026-04-18
|
||||
updated_at: 2026-04-25
|
||||
evidence:
|
||||
- src/game/export_presets.cfg
|
||||
- src/game/engine/addons/magic_civ_physics/magic_civ_physics.gdextension
|
||||
|
|
@ -37,11 +37,18 @@ Staging approach is documented in `scripts/README.md` § "Export staging (p2-06)
|
|||
|
||||
## Acceptance
|
||||
|
||||
- `./run export <version>` produces one archive per platform under `.local/build/godot/<version>/`.
|
||||
- Each archive, when unpacked and run on its target OS, starts the main menu and plays a seeded 10-turn game without errors.
|
||||
- GDExtension binaries are per-platform: `.so` for Linux, `.dylib` for macOS, `.dll` for Windows — never cross-shipped.
|
||||
- WASM guide build (`bash build-wasm.sh`) is a separate artifact in the same release bundle.
|
||||
- Release notes generated from CHANGELOG's range since the prior tag.
|
||||
- ✓ `./run export <version>` produces archives per-platform under `.local/build/godot/<version>/`. Verified 2026-04-25 (`p2-06-verify-20260425`): macOS 64MB .zip with .app bundle + .dylib; Linux 77MB binary + 4MB .so. Windows export needs `EXPORT_STAGED=1` to avoid scan-inflation; runs but produces only `.tmp` because no Windows .dll is cross-compiled on macOS host (see Windows runner gap below).
|
||||
- ✗ Each archive, when unpacked and run on its target OS, starts the main menu and plays a seeded 10-turn game without errors. **Not yet executed against `p2-06-verify-20260425` archives** — needs hands-on macOS launch + Linux flatpak/native launch on apricot. Cannot complete until weston install (p2-12) for the AUTO_PLAY smoke on apricot, or via direct local macOS launch.
|
||||
- ✓ GDExtension binaries are per-platform: `.so` for Linux, `.dylib` for macOS, `.dll` for Windows — never cross-shipped. `p2-06-verify-20260425/macos/MagicCivilization.zip` ships `Contents/Frameworks/libmagic_civ_physics.dylib`; `p2-06-verify-20260425/linux/libmagic_civ_physics.x86_64.so` is separate. No cross-shipping observed.
|
||||
- (carried) WASM guide build (`bash build-wasm.sh`) is a separate artifact in the same release bundle.
|
||||
- (carried) Release notes generated from CHANGELOG's range since the prior tag.
|
||||
|
||||
### 2026-04-25 verify run notes
|
||||
|
||||
- Export pipeline mechanically works: `./run export p2-06-verify-20260425` produced macOS + Linux archives in <2min per platform after staging applied. `EXPORT_STAGED=1` opt-in for non-macOS now required to avoid the same scan-inflation that p2-06 audit fixed for macOS — recommend making staging the default for all desktop platforms.
|
||||
- Pre-existing tech-debt surfaced in export logs: `SCRIPT ERROR: Identifier "StatsTracker" not declared` × 4 in `engine/scenes/overviews/demographics.gd:168/169/174/207`. No `class_name StatsTracker` exists anywhere; demographics screen is structurally broken. Spun out as **p1-23-stats-tracker-restore.md**. Non-blocking for export but ships a broken screen.
|
||||
- Windows runner gap remains (no .dll cross-compile from macOS); spun out as **p2-06b-windows-runner.md**.
|
||||
- Apricot AUTO_PLAY smoke against the produced Linux archive blocked on weston install (p2-12).
|
||||
|
||||
## Non-goals
|
||||
|
||||
|
|
|
|||
30
.project/objectives/p2-06b-windows-runner.md
Normal file
30
.project/objectives/p2-06b-windows-runner.md
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
---
|
||||
id: p2-06b
|
||||
title: Register a Windows runner for forgejo to produce .dll + .exe on tag push
|
||||
priority: p2
|
||||
status: missing
|
||||
scope: game1
|
||||
owner: shipwright
|
||||
updated_at: 2026-04-25
|
||||
evidence:
|
||||
- .forgejo/workflows/release.yml
|
||||
- .forgejo/RUNNER_SETUP.md
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
Godot does not cross-compile Windows binaries from a macOS or Linux EDIT host; native Windows is required to produce both the `.exe` (Godot export) and `libmagic_civ_physics.dll` (GDExtension cargo build for `x86_64-pc-windows-msvc`). Without a registered Windows forgejo runner, every release will ship Linux + macOS only.
|
||||
|
||||
Spun out from p2-06 on 2026-04-25 after `p2-06-verify-20260425` confirmed the Windows export produces only a `.tmp` placeholder when run on macOS.
|
||||
|
||||
## Acceptance
|
||||
|
||||
- ❌ A Windows runner is registered in forgejo (RUNNER_SETUP.md updated with the new runner instructions).
|
||||
- ❌ `.forgejo/workflows/release.yml` has a Windows job that runs cargo + Godot export and uploads `MagicCivilization.exe` + `libmagic_civ_physics.dll` as part of the release bundle.
|
||||
- ❌ A tag push produces a release containing all three desktop platforms (Linux .so + binary, macOS .dylib + .app, Windows .dll + .exe).
|
||||
- ❌ Windows archive boots-and-plays a 10-turn AUTO_PLAY game on a Windows machine.
|
||||
|
||||
## Non-goals
|
||||
|
||||
- Windows code signing (separate later objective).
|
||||
- Windows installer (.msi / .exe self-extractor) — direct .zip is fine for EA.
|
||||
31
.project/objectives/p2-12-apricot-weston-install.md
Normal file
31
.project/objectives/p2-12-apricot-weston-install.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
---
|
||||
id: p2-12
|
||||
title: Install weston on apricot RUN host — unblock display-server smoke tests
|
||||
priority: p2
|
||||
status: missing
|
||||
scope: infra
|
||||
owner: shipwright
|
||||
updated_at: 2026-04-25
|
||||
evidence: []
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
Several P0/P1 smoke gates require a wayland display server (weston, headless backend with software rendering) on apricot to run `RENDER_MODE=weston tools/autoplay-batch.sh`. Weston is currently absent on apricot (`which weston` empty; no rpm or flatpak package; no passwordless sudo for the `lilith` account). Install once → multiple downstream smoke gates unblock.
|
||||
|
||||
Spun out from p0-42 + p0-41a on 2026-04-25 after attempted smoke runs failed with `ERROR: --weston mode but weston not installed`.
|
||||
|
||||
## Acceptance
|
||||
|
||||
- ❌ `ssh apricot which weston` returns a path
|
||||
- ❌ `ssh apricot weston --version` reports a version (≥ 10.x recommended)
|
||||
- ❌ `RENDER_MODE=weston tools/autoplay-batch.sh 1 50 .local/iter/weston-smoke-<stamp>` completes ≥1 game with screenshots produced
|
||||
- ❌ Downstream smoke gates re-run and recorded:
|
||||
- p0-42 formation smoke
|
||||
- p0-41a rally smoke
|
||||
|
||||
## Notes
|
||||
|
||||
- apricot is Fedora-based; install path is likely `sudo dnf install weston` (requires interactive sudo since the lilith user has no passwordless sudo).
|
||||
- Alternative: a flatpak weston, or build from source under `~/.local/`.
|
||||
- Once installed, autoplay-batch.sh's `--weston` branch should work without changes — the integration is already wired.
|
||||
Loading…
Add table
Reference in a new issue