- `_applyResearchEffects` now receives the node id explicitly instead of
reading `node.id`, which is undefined (the id is the key in the tree's
`nodes` map, not a field on the object) — this was silently skipping
`activateGates` so researched jumpgates stayed dark
- Add `systemIdOfGatesNode()` as the pure inverse of `systemNodeId()` for
the gates node, with round-trip tests
- Reconcile gate activation in `_onEnterSystem()`: if the gates tech is
already unlocked, re-run `_activateSystemJumpgates` (idempotent) so a
missed activation self-heals on the next entry/jump/reload
- Make `_activateSystemJumpgates` idempotent by tracking fresh keys and
early-returning when everything is already online
- Add `navPoints()` and `navChart()` to SystemCategory.js as pure,
testable cores for the jumpgate unlock condition (discovered/missing
split over all NAV points)
- Add `js/dev/NavDiag.js` with `orbitNav()` / `orbitNavBrief()` console
commands that print the live NAV chart and which objects are still
undiscovered, installed by `main.js` on every page load
- Update `data/landing.json` to reference the correct gasgiant surface/shop
videos for slot 03
- Add tests for `navPoints`, `navChart`, and `systemIdOfGatesNode`
- Document the activation wiring bug, the `orbitNav()` diagnostic, and the
new pure functions in PROJECT_NOTES.md
- Introduce the BUILD deck slot on planet surfaces: full-screen BuildWindow
(looping feed video, category tabs, build list, dossier + cost + BUILD
button) backed by pure BuildModel/BuildState rules
- Move tether level 2 from a research effect to a one-off planet build
(200 minerals, 20 s, requires L1 tether on the world); home world starts
with tether-l1 pre-installed as a rule re-asserted after load
- Add `node dev/server.mjs` static server sending Cache-Control: no-store to
stop browsers heuristically caching ES modules (the "new data + old JS" bug)
- Fix world-name casing leak: CommsPanel keeps canonical spelling in the
landing payload; GameScene.startLanding normalizes via WorldNames.canonicalPlanetName
so name-keyed build/tether lookups match
- Add in-game diagnostics (orbitDiag/orbitDiagBrief), dev/build-check.html
self-check page, and Node tests for builds, world names, and save staging
- Persist builds (built records + in-flight remaining time) in the save bank;
tick on the game-loop clock so a build survives takeoff mid-build