feat(@projects/@magic-civilization): mark p2-46 as complete

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Natalie 2026-05-07 18:19:53 -07:00
parent 155e7ea5f4
commit 657a88026c
7 changed files with 15 additions and 13 deletions

View file

@ -284,7 +284,7 @@
| [p2-44a](p2-44a-dataloader-promotion-trees-path.md) | ✅ done | P2 | DataLoader path mismatch — `get_promotion(\"trees\")` returns empty | [unassigned](../team-leads/unassigned.md) | 🟢 |
| [p2-44b](p2-44b-promotion-dispatch-instrumentation.md) | ✅ done | P2 | AI promotion dispatch — instrumentation pass to identify the silent gate | [unassigned](../team-leads/unassigned.md) | 🟢 |
| [p2-45](p2-45-elimination-reconciliation.md) | ✅ done | P2 | Player elimination reconciliation — emit `player_eliminated` on every transition | — | 🟢 |
| [p2-46](p2-46-past-games-archive-replay-viewer.md) | 🟡 partial | P2 | Past-games archive & replay viewer — `mc-replay` crate, on-disk archive, projection-based playback | [shipwright](../team-leads/shipwright.md) | 🟢 |
| [p2-46](p2-46-past-games-archive-replay-viewer.md) | ✅ done | P2 | Past-games archive & replay viewer — `mc-replay` crate, on-disk archive, projection-based playback | [shipwright](../team-leads/shipwright.md) | 🟢 |
| [p2-47](p2-47-in-game-statistics-screens.md) | 🟡 partial | P2 | In-game statistics screens — Civ-style 5-tab modal (Demographics / Graphs / Rankings / Replay / Histories) | [shipwright](../team-leads/shipwright.md) | 🟢 |
| [p2-48](p2-48-end-of-game-summary-screen.md) | 🟡 partial | P2 | End-of-game summary screen — outcome banner, standings, score graph, awards, timeline, footer actions | [shipwright](../team-leads/shipwright.md) | 🟢 |
| [p2-49](p2-49-climate-axes-latitude-continentality.md) | ✅ done | P2 | Climate axes refactor — latitude + continentality + zonal winds as first-class per-hex inputs | [terraformer](../team-leads/terraformer.md) | 🟢 |

View file

@ -154,6 +154,7 @@
| [p2-44a](p2-44a-dataloader-promotion-trees-path.md) | DataLoader path mismatch — `get_promotion(\"trees\")` returns empty | — | [unassigned](../team-leads/unassigned.md) | 2026-05-06 |
| [p2-44b](p2-44b-promotion-dispatch-instrumentation.md) | AI promotion dispatch — instrumentation pass to identify the silent gate | — | [unassigned](../team-leads/unassigned.md) | 2026-05-06 |
| [p2-45](p2-45-elimination-reconciliation.md) | Player elimination reconciliation — emit `player_eliminated` on every transition | — | — | 2026-04-30 |
| [p2-46](p2-46-past-games-archive-replay-viewer.md) | Past-games archive & replay viewer — `mc-replay` crate, on-disk archive, projection-based playback | — | [shipwright](../team-leads/shipwright.md) | 2026-05-07 |
| [p2-49](p2-49-climate-axes-latitude-continentality.md) | Climate axes refactor — latitude + continentality + zonal winds as first-class per-hex inputs | — | [terraformer](../team-leads/terraformer.md) | 2026-04-30 |
| [p2-50](p2-50-rng-determinism-pin.md) | Deterministic RNG + seed-derivation pin across mc-mapgen / mc-climate / mc-ecology | — | [terraformer](../team-leads/terraformer.md) | 2026-05-01 |
| [p2-51](p2-51-world-shape-knobs.md) | Player-facing world-shape parameters on new-game screen | — | [terraformer](../team-leads/terraformer.md) | 2026-05-01 |

View file

@ -16,9 +16,9 @@
|---|---|---|---|---|---|---|---|
| **P0** | 0 | 0 | 0 | 0 | 0 | 44 | 44 |
| **P1** | 1 | 13 | 1 | 5 | 1 | 55 | 76 |
| **P2** | 0 | 9 | 11 | 0 | 6 | 68 | 94 |
| **P2** | 0 | 8 | 11 | 0 | 6 | 69 | 94 |
| **P3 (oos)** | 0 | 7 | 6 | 0 | 21 | 9 | 43 |
| **total** | **1** | **29** | **18** | **5** | **28** | **176** | **257** |
| **total** | **1** | **28** | **18** | **5** | **28** | **177** | **257** |
</td><td valign='top' style='padding-left:2em'>
@ -29,7 +29,7 @@
| [unassigned](../team-leads/unassigned.md) | 19 |
| [asset-sprite](../team-leads/asset-sprite.md) | 6 |
| [combat-dev](../team-leads/combat-dev.md) | 6 |
| [shipwright](../team-leads/shipwright.md) | 5 |
| [shipwright](../team-leads/shipwright.md) | 4 |
| [testwright](../team-leads/testwright.md) | 3 |
| [warcouncil](../team-leads/warcouncil.md) | 2 |
| [asset-audio](../team-leads/asset-audio.md) | 1 |
@ -79,7 +79,6 @@
| [p2-10k](p2-10k-gdlint-cleanup.md) | 🟡 partial | CI: fix 51 gdlint violations so Stage 3 is hard-green | — | [testwright](../team-leads/testwright.md) | 2026-05-07 | 🟢 unblocked |
| [p2-10l](p2-10l-gut-regression-triage.md) | 🟡 partial | CI: fix 15 GUT regressions so Stage 5 is hard-green | — | [testwright](../team-leads/testwright.md) | 2026-05-07 | 🟢 unblocked |
| [p2-18](p2-18-guide-public-deployment.md) | 🟡 partial | Guide web app — public hosting + deploy pipeline | — | — | 2026-04-17 | 🟢 unblocked |
| [p2-46](p2-46-past-games-archive-replay-viewer.md) | 🟡 partial | Past-games archive & replay viewer — `mc-replay` crate, on-disk archive, projection-based playback | — | [shipwright](../team-leads/shipwright.md) | 2026-05-07 | 🟢 unblocked |
| [p2-47](p2-47-in-game-statistics-screens.md) | 🟡 partial | In-game statistics screens — Civ-style 5-tab modal (Demographics / Graphs / Rankings / Replay / Histories) | — | [shipwright](../team-leads/shipwright.md) | 2026-05-07 (cycle-51) | 🟢 unblocked |
| [p2-48](p2-48-end-of-game-summary-screen.md) | 🟡 partial | End-of-game summary screen — outcome banner, standings, score graph, awards, timeline, footer actions | — | [shipwright](../team-leads/shipwright.md) | 2026-05-03 | 🟢 unblocked |
| [p2-55](p2-55-civilian-capture-system.md) | 🟡 partial | Civilian Capture / Destroy / Ransom | — | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | 🟢 unblocked |

View file

@ -1,9 +1,9 @@
{
"generated_at": "2026-05-07T23:55:28Z",
"generated_at": "2026-05-08T01:19:32Z",
"totals": {
"done": 176,
"done": 177,
"in_progress": 1,
"partial": 29,
"partial": 28,
"stub": 18,
"missing": 5,
"oos": 28,
@ -1841,7 +1841,7 @@
"id": "p2-46",
"title": "Past-games archive & replay viewer — `mc-replay` crate, on-disk archive, projection-based playback",
"priority": "p2",
"status": "partial",
"status": "done",
"scope": "game1-stretch",
"owner": "shipwright",
"updated_at": "2026-05-07",
@ -2998,7 +2998,7 @@
},
{
"owner": "shipwright",
"remaining": 5
"remaining": 4
},
{
"owner": "testwright",

View file

@ -2,7 +2,7 @@
id: p2-46
title: "Past-games archive & replay viewer — `mc-replay` crate, on-disk archive, projection-based playback"
priority: p2
status: partial
status: done
scope: game1-stretch
owner: shipwright
updated_at: 2026-05-07
@ -36,7 +36,9 @@ evidence:
- "src/game/engine/tests/integration/test_p2_46_replay_bridge.gd (GUT test: list+open+goto_turn, cycle 49)"
- "src/simulator/api-gdext/src/replay.rs GdReplayArchive::write_fixture — synthetic 50-turn GameHistory (1 clan, 50 snapshots, CityFounded×2 + TechResearched×3), written via mc_replay::archive::write_game, returns UUID GString (cycle 50)"
- "src/game/engine/scenes/tests/proof_replay_viewer.tscn + proof_replay_viewer.gd — instantiates GdReplayArchive.write_fixture, wires GdReplayPlayer via game_id export, drives _goto_turn(25)+hold 3s then _goto_turn(50)+hold 3s, captures screenshot via _capture_and_quit (cycle 50)"
- "src/game/engine/scenes/tests/capture_screenshot.gd relay_viewer_proof branch — dispatches to proof_replay_viewer.tscn (cycle 50)"
- "src/game/engine/scenes/tests/capture_screenshot.gd replay_viewer_proof branch — add_child instantiation (no change_scene_to_file) to prevent Weston/llvmpipe framebuffer stale (cycle 58 fix)"
- ".project/screenshots/p2-46-replay-viewer-T25.png — 1920x1080, replay viewer Turn 25/100, scrubber at T25, pop=1500 cities=3 gold=125 score=212.5, reviewed in-conversation 2026-05-07"
- ".project/screenshots/p2-46-replay-viewer-T50.png — 1920x1080, replay viewer Turn 50/100, scrubber at T50, pop=2000 cities=6 gold=200 score=325.0, reviewed in-conversation 2026-05-07"
---
## Summary
@ -69,7 +71,7 @@ No tunable values are hardcoded. Retention policy (max archived games) lives in
- [x] **`past_games.gd` index scene** — `src/game/engine/scenes/menus/past_games.gd/.tscn` authored (cycle 48). Card grid with outcome + sort filters, per-card Watch Replay + Delete actions, back button. GdReplayArchive bridge stubbed with push_warning; wired once bridge lands (GUT test deferred to that milestone).
- [x] **`replay_viewer.gd` projection-based playback** — `src/game/engine/scenes/menus/replay_viewer.gd/.tscn` authored (cycle 48). HSlider scrubber, play/pause/speed (0.5×/1×/2×)/step controls, `_goto_turn(t)` stub ready for GdReplayPlayer.goto_turn wiring. Renderer mutation deferred until bridge lands.
- [x] **GDExtension bridge**`src/simulator/api-gdext/src/replay.rs` (cycle 49). `GdReplayArchive` exposes `list(root, pack) → Array[Dictionary]`, `open(root, pack, game_id) → bool`, `rename(root, pack, game_id, title) → bool`, `delete(root, pack, game_id) → bool`, `export_game(root, pack, game_id, dest) → bool`. `GdReplayPlayer` exposes `load_history(root, pack, game_id) → bool`, `goto_turn(turn_idx) → Dictionary` (projects first-clan TurnSnapshot ≤ turn_idx), `event_count() → u32`, `event_at(idx) → Dictionary` (full variant coverage), `final_turn() → u32`. Wired via `pub mod replay;` in `api-gdext/src/lib.rs`. `mc-replay` + `uuid` added to `api-gdext/Cargo.toml`. `cargo check --workspace` clean. `past_games.gd._load_games` and `replay_viewer.gd._ready` updated to call the real bridge. GUT `test_p2_46_replay_bridge.gd` exercises list+open+goto_turn (3 assertions, headless). (cycle 49)
- [ ] **Headless proof scene**`src/game/engine/scenes/tests/replay_viewer_proof.tscn` boots the replay viewer with a fixture archive, advances the scrubber to turn 25 and turn 50, screenshots both. Captured via `tools/screenshot.sh`, SCP'd to `$SCREENSHOT_HOST`, screenshots reviewed in conversation.
- [x] **Headless proof scene**`src/game/engine/scenes/tests/proof_replay_viewer.tscn` boots the replay viewer with a fixture archive (UUID c061868c-6fec-4291-b7ca-6698017647c0), advances scrubber to turn 25 (pop=1500, cities=3) and turn 50 (pop=2000, cities=6), captures both screenshots. fix: `capture_screenshot.gd` now uses `add_child` (not `change_scene_to_file`) to avoid Weston/llvmpipe framebuffer stale. Screenshots reviewed in-conversation 2026-05-07. **(✓ 2026-05-07.)**
## Dependencies

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB