You are CONTINUING a build that was killed by a session cap. Be efficient. Tight scope. Don't rewrite — extend.

WHAT EXISTS IN THIS DIR (verify with `ls`):
- `src/game.ts`, `src/level.ts`, `src/assets.ts`, `src/input.ts`, `src/main.ts`, `src/particles.ts`, `src/sfx.ts`, `src/style.css` — full v1 of **Lumen Vale** (working metroidvania, ships at /fable-metroidvania/). Read these first to understand the engine.
- `public/sprites/` — has 7 v1 sprites (player-idle, player-run, enemy, pickup-wings, platform, ground, background) AND 4 NEW V2 sprites ALREADY GENERATED that you should integrate: `pickup-dash.png`, `enemy-spore.png`, `background-grove.png`, `background-shrine.png`. **Do NOT re-generate these.** They cost $0.16 already, they're done.
- `scripts/gen-sprites.ts` — the sprite gen script. You can ignore it; the new sprites are already on disk.
- `package.json`, `vite.config.ts`, `playwright.config.ts`, `tests/` — all set up.

YOUR JOB — EXTEND, DO NOT REBUILD:
1. **3 connected rooms total** (v1 has 1 room — keep it as the starting "vale", add 2 more):
   - Room 1: existing Lumen Vale (no changes to art/layout)
   - Room 2: **Spore Grove** — uses `background-grove.png`. Introduces the spore enemy (`enemy-spore.png`). Layout: long horizontal cave with multiple spore enemies patrolling.
   - Room 3: **Sky Shrine** — uses `background-shrine.png`. Tall vertical room requiring the dash ability to cross a wide gap. Contains the level goal (a small altar/sprite — you can paint a procgen one in canvas, no new gpt-image needed).
2. **Room transitions**: walking off the right edge of room 1 enters room 2 from the left; walking off the right edge of room 2 enters room 3 from the left. Keep it simple — no doors needed, just edge triggers.
3. **Dash ability**: the `pickup-dash.png` is found mid-room 2. Touching it grants horizontal dash (double-tap A/D or press Shift). Dash distance = ~100px, cooldown ~0.6s. **Required to cross room 3's gap.**
4. **Spore enemy**: different AI from the existing enemy. Suggestion: stationary OR slow-floating, releases a damage cloud every ~3s. Use `enemy-spore.png`. Tune the damage cloud radius so the player can dodge by jumping.
5. **Save state** to `localStorage`: save `{ currentRoom, hasWings, hasDash, playerSpawn }` after each pickup or room transition. On boot, restore. Add a "RESET" button to the title screen for clearing.
6. **Mini-map HUD**: top-left corner, 3 small room thumbnails in a row. Highlight the current room. Show pickup status (filled circle if collected). Pure canvas drawing — no new assets.

BUILD + VERIFY:
- `npm install` if needed, then `npm run build`. dist/ must populate.
- Playwright e2e: title loads → click play → player visible in room 1 → walk right → enter room 2 → take damage from spore → collect dash → enter room 3. Don't have to complete it, just verify rooms transition and dash works.

OUT OF SCOPE — don't do:
- Don't regenerate sprites. The new ones are paid for and on disk.
- Don't redo v1's room. It works.
- Don't add a 4th room, a new ability beyond dash, a boss, save slots, settings menus, audio overhaul. None of it.
- Don't switch frameworks.

BUDGET: keep this under 40 turns. Be efficient. If you finish faster, that's better.

WHEN DONE: print a one-line summary of changes made. The result event closes the session.
