- Replace single-file architecture with ES module system
- Define modules/ directory structure (core, data, panels, effects, terrain, portals, narrative, utils)
- Establish module contract: init(scene, state, theme) + update(elapsed, delta)
- Single animation clock (ticker.js) — no direct RAF calls from modules
- Theme is law — no inline hex codes
- Data flows through state.js — no fetch() outside data/ modules
- Atomic PRs — target <150 lines per PR
- No new code in app.js — new features go in modules
Refs #409, #429