diff --git a/.project/CHANGELOG.md b/.project/CHANGELOG.md
index d0d9805e..bdc8997e 100644
--- a/.project/CHANGELOG.md
+++ b/.project/CHANGELOG.md
@@ -100,3 +100,4 @@ Test-coverage mandate response is paying off: data changes, city state transitio
2026-04-17 p1-05 BALANCE-TUNING pass (shipwright): JSON-only data edits targeting the p0_pop_peak median 29.5 → ≥30 gap in score_fix3 batch. (1) public/resources/improvements/farm.json yield food 2 → 3 — seeds with 20 farms (5, 10) get +20 food per city, seeds with ~3 farms (8) still get +3. Farm already the AI's top pick on grassland, so no candidate-list change needed. (2) public/games/age-of-dwarves/data/buildings/stub.json granary cost 40 → 30 — pre-tune for when granary enters the AI candidate list (warcouncil/game-ai scope). Both pure JSON, no Rust or GDScript changes. Validator 170/170 pass. Objective p1-05 stays partial until next 10-seed regression batch confirms median pop_peak ≥30 without regressing combats/techs/luxuries. [ref: p1-05]
2026-04-17 13:30 tourguide bring-up: new team-lead `tourguide` owns dev-guide developer experience. Closed p1-11 (wasm-pack output moved `src/simulator/pkg/` → `.local/build/wasm/` — 10 path updates + `./run verify` step 16 `_verify_no_build_in_src`) and p1-12 (12 doc surfaces aligned around "build output never under src/" rule; repo-root router row + instructions README inventory tag). p1-13 `guide-dev-route-coverage` partial: new `e2e/all-routes.spec.ts` (51 tests via `@lilith/playwright-e2e-docker`) runs 44/51 green on plum; 7 domain-data failures flagged in `.project/team-leads/tourguide.md` §Known red routes for guide-web / game-data / simulator-infra. Evidence: `.project/history/20260417_tourguide_dev_bringup.md`. [ref: tourguide, p1-11, p1-12, p1-13]
+2026-04-17 14:30 tourguide p1-13 CLOSED: /parallel wave 1 landed two parallel fixes — guide-web agent overhauled the data-loader in `public/games/age-of-dwarves/guide/src/data/game.ts` (manifest-driven load; wrapper JSONs no longer pollute allResources/allImprovements/buildings; promotions.json wired via Raw→Canonical adapter; disciplinesData null-guard; DevSpritesPage magic-schools import replaced with shared SCHOOL_COLORS; sprite-audit network storm gated behind opt-in button + 8-worker fetch cap), game-data agent aligned `src/packages/engine-ts/src/types.ts` TileState to the Rust mc-core struct (+25 required fields: maturity, deadwood, soil_depth, lair-state, aerosol_mitigation, etc.) + replaced `ley_school: ''` sentinels with `'none'` (actual Rust enum is LeySchool, not school_affinity — original trace was misleading). Two consecutive `pnpm test:e2e --grep all-routes` runs: 51/51 passed (44.7s, 42.3s). p1-13 flipped partial → ✅ done. Tourguide bundle (p1-11 + p1-12 + p1-13) all ✅ done. [ref: tourguide, p1-13]
diff --git a/.project/objectives/README.md b/.project/objectives/README.md
index 71a31add..20b5516d 100644
--- a/.project/objectives/README.md
+++ b/.project/objectives/README.md
@@ -15,10 +15,10 @@
| Priority | ✅ | 🟡 | 🔴 | ❌ | ⚫ | Total |
|---|---|---|---|---|---|---|
| **P0** | 19 | 4 | 0 | 0 | 0 | 23 |
-| **P1** | 9 | 3 | 0 | 0 | 0 | 12 |
+| **P1** | 10 | 2 | 0 | 0 | 0 | 12 |
| **P2** | 7 | 6 | 0 | 2 | 0 | 15 |
| **P3 (oos)** | 0 | 0 | 0 | 0 | 9 | 9 |
-| **total** | **35** | **13** | **0** | **2** | **9** | **59** |
+| **total** | **36** | **12** | **0** | **2** | **9** | **59** |
@@ -29,7 +29,6 @@
| [shipwright](../team-leads/shipwright.md) | 6 |
| [warcouncil](../team-leads/warcouncil.md) | 3 |
| [testwright](../team-leads/testwright.md) | 2 |
-| [tourguide](../team-leads/tourguide.md) | 1 |
|
@@ -76,7 +75,7 @@
| [p1-10](p1-10-game-setup-ux.md) | ✅ done | Game setup UX — new-game dialog, difficulty, clan preview | [shipwright](../team-leads/shipwright.md) | 2026-04-17 |
| [p1-11](p1-11-build-output-src-purge.md) | ✅ done | Purge build output from src/ — wasm-pack moves to .local/build/wasm/ | [tourguide](../team-leads/tourguide.md) | 2026-04-17 |
| [p1-12](p1-12-build-output-docs-alignment.md) | ✅ done | Align every doc reference to the relocated wasm-pack output | [tourguide](../team-leads/tourguide.md) | 2026-04-17 |
-| [p1-13](p1-13-guide-dev-route-coverage.md) | 🟡 partial | Guide dev server boots on plum with zero-error route coverage | [tourguide](../team-leads/tourguide.md) | 2026-04-17 |
+| [p1-13](p1-13-guide-dev-route-coverage.md) | ✅ done | Guide dev server boots on plum with zero-error route coverage | [tourguide](../team-leads/tourguide.md) | 2026-04-17 |
## P2 — Polish
diff --git a/.project/team-leads/tourguide.md b/.project/team-leads/tourguide.md
index bc71ce38..d7d7c949 100644
--- a/.project/team-leads/tourguide.md
+++ b/.project/team-leads/tourguide.md
@@ -104,14 +104,24 @@ The Tourguide edits these directly:
temporary workaround — that reintroduces the rule violation p1-11
exists to fix.
-## Known red routes (p1-13 status: partial as of 2026-04-17)
+## Known red routes — CLOSED 2026-04-17 (all green)
-The first `pnpm test:e2e` run after the p1-11 + p1-12 relocation lands
-44 / 51 routes green. The remaining 7 are **not Tourguide-owned fixes** —
-each traces to domain data / page logic outside this team-lead's surface
-and is flagged here so the right owner picks it up. Evidence:
-`test-results/guide-age-of-dwarves/all-routes-route-coverage-*-chromium/`
-(error-context.md + video.webm per failure).
+**Status: all 7 previously-red routes green as of Wave-2 confirmation
+runs.** Two consecutive `pnpm test:e2e` runs both report 51/51 passed
+(44.7s, 42.3s). The Wave-1 parallel-agent pass landed the following
+fixes (the table below is retained as a historical record of the
+handoff):
+
+- `guide-web` agent — manifest-driven data-loader refactor in
+ `src/data/game.ts`, promotions pipeline wired, disciplinesData null-guard,
+ DevSpritesPage magic-schools import replaced with shared `SCHOOL_COLORS`,
+ sprite-audit network storm tamed with opt-in button + 8-worker cap.
+- `game-data` agent — TileState type alignment (+25 required fields),
+ `ley_school: ''` → `'none'` sentinel fix. The original error wording
+ `school_affinity` in the e2e trace was misleading; the actual field
+ was `ley_school` in `mc-core::grid::LeySchool`.
+
+### Historical handoff table (pre-fix state):
| Route | Error | Probable owner |
|---|---|---|
diff --git a/mcp_home.png b/mcp_home.png
new file mode 100644
index 00000000..390de4c3
Binary files /dev/null and b/mcp_home.png differ
diff --git a/mcp_populations.png b/mcp_populations.png
new file mode 100644
index 00000000..1329a19f
Binary files /dev/null and b/mcp_populations.png differ
diff --git a/mcp_promotions.png b/mcp_promotions.png
new file mode 100644
index 00000000..c7db740f
Binary files /dev/null and b/mcp_promotions.png differ
diff --git a/mcp_resources.png b/mcp_resources.png
new file mode 100644
index 00000000..47031ef5
Binary files /dev/null and b/mcp_resources.png differ
diff --git a/public/games/age-of-dwarves/data/objectives.json b/public/games/age-of-dwarves/data/objectives.json
index 24d22728..19b6ac9e 100644
--- a/public/games/age-of-dwarves/data/objectives.json
+++ b/public/games/age-of-dwarves/data/objectives.json
@@ -1,11 +1,11 @@
{
- "generated_at": "2026-04-17T20:38:01Z",
+ "generated_at": "2026-04-17T20:43:54Z",
"totals": {
- "done": 35,
- "stub": 0,
- "partial": 13,
"missing": 2,
+ "stub": 0,
+ "done": 36,
"oos": 9,
+ "partial": 12,
"total": 59
},
"objectives": [
@@ -353,7 +353,7 @@
"id": "p1-13",
"title": "Guide dev server boots on plum with zero-error route coverage",
"priority": "p1",
- "status": "partial",
+ "status": "done",
"scope": "game1",
"owner": "tourguide",
"updated_at": "2026-04-17",
diff --git a/src/simulator/package.json b/src/simulator/package.json
index 6169f979..8741b8bd 100644
--- a/src/simulator/package.json
+++ b/src/simulator/package.json
@@ -1,9 +1,7 @@
{
"name": "@magic-civ/physics-rs",
"version": "0.1.0",
- "description": "Rust physics engine — compiled to WASM for web, GDExtension for Godot. Build output lives at repo-root .local/build/wasm/ (gitignored, per-host). Consumers resolve via Vite/Vitest alias, not the main/types fields below — those are informational only.",
- "main": "../../.local/build/wasm/magic_civ_physics.js",
- "types": "../../.local/build/wasm/magic_civ_physics.d.ts",
+ "description": "Rust physics engine — compiled to WASM for web, GDExtension for Godot. Build output lives at repo-root .local/build/wasm/ (gitignored, per-host). Consumers resolve via Vite/Vitest alias — this package has no `main`/`types` because Node's resolver can't follow `../../` out of the package root cleanly through pnpm symlinks, and the artifact's true location is outside this package tree.",
"scripts": {
"build": "bash build-wasm.sh",
"build:gdext": "bash build-gdext.sh"