- data/tether.json: new edgeMargin (512 px) — a no-man's-land band around
every tether rim where NO object sits: discoverable objects are clearly
inside a tether region (d ≤ radius − edgeMargin) or clearly outside
(d ≥ radius + edgeMargin), never at the edge (the 'scan doesn't find it
at the boundary' case)
- SystemGenerator.layoutSystem: the regular N-gon ring (chords put 2- and
3-object systems past level 2, spread 4-/5-object systems too thin) is
replaced by a compact ARC at one orbital radius — consecutive objects a
level-1 tether apart (≤ L1 − edgeMargin — a level-1 chain walks the
whole system), every other pair off both tether rims (the level-2
graph is connected — level 2 DEFINITELY discovers; level 3 never
required); minSpacing now bounds star/home-world→object only,
neighborMin (2048) is the planet↔planet floor; the step angle is a
deterministic scan (safe-α) landing the gap near a seeded target
- home world IS a tether anchor: its orbital radius caps at
L2 − edgeMargin (9728 px); its objects sit 6400–9728 (level-2 zone by
design — the bootstrap tether), chained to each other at level 1
- gates: anchorMaxDistance 4990 → 4608 (= L1 − edgeMargin) so no gate
sits at the level-1 rim either (still < 5000, Rule 1); candidate
ordering is now side > rim-bands > facing tier > order
- Tether.contains: 1 px rim tolerance (a center exactly on the boundary
counts as inside — float safety on top of the layout margin)
- asteroid placement tetherMargin 96 → 512 (aligned with edgeMargin)
- dev/system-layout.test.mjs (new): level-1 chain, level-2 connectivity,
edge margin, orbital band, same-seed determinism — 90-system galaxies,
all green; discovery/jumps/audit tests + PROJECT_NOTES follow the rules
- Reduce maxLevel from 12 to 3 in data/tether.json
- Remove the tether_l4 entry from exploration.json; tether_l3 now has empty unlocks
- Update research-builds and tether tests to reflect the shorter chain (3 layout rows, level checks for 1–3 only)
- Revise PROJECT_NOTES.md to describe the 3-level progression
- Change radiusGrowth from 1.25 to 2.0 so level N doubles the previous
level (L2 = 10240, L3 = 20480, L4 = 40960 px)
- Update all data descriptions, docs, and test defaults to match
- Add refreshHudTetherLevel() in SurfaceScene so the HUD line re-decodes
when a tether build completes while on-surface
- Rename rocky-planet-02 asset (typo fix), add 03-a/03-b variants,
point rocky frames at indices 6–8 in planets.json
- Add dev/tether-flow harness to exercise the full L2 build flow end-to-end
The player starts with a level-1 tether anchored on the home world:
a circular zone 5120 px from the planet's center. The ship may fly
anywhere in the UNION of its tethers' zones — where zones overlap there
is no line and no wall — and the union's boundary is a hard barrier,
rendered as a thick cyberpunk glitch dotted line (marching dashes,
additive glow + RGB fringe, ambient glitch bursts with dash flicker,
radial displacement and data drops, contact shudder + camera kick +
throttled console toast where the ship bumps it).
- data/tether.json: level radii (5120 x 1.25^lv), the starting tether,
barrier line/look, glitch and contact tuning (manifest-registered)
- js/tether/Tether.js: pure range math (union membership, clamp to the
nearest union boundary point + normal, visibleArcs = each tether's
share of the union boundary) — Node-tested
- js/tether/TetherField.js: scene-facing field — add/remove/setLevel
seam for future builds/upgrades, per-frame ship constraint, and the
barrier renderer (on-screen dot culling only)
- js/scenes/GameScene.js: home tether at the system origin, HUD
readout (level / range / anchor per tether), click-to-fly and
autopilot targets clamped to the union boundary, contact feedback,
destruction on shutdown
- dev/tether.test.mjs: 29 checks incl. the two-direction boundary
property (no line in overlaps, no gaps in the line) and a numeric
nearest-boundary cross-check (worst 0.79 px)
- dev/smoke-game.mjs: ?tethers / ?homeLevel / ?report dev hooks for
manual and headless verification
- README + PROJECT_NOTES: the system, its rules and its layering
Verified in headless Chromium: clean boot (menu + game), barrier
rendering (calm and glitch-burst frames), union boundary with two
tethers (arcs meet at the rim crossings, lens is line-free), ship
clamped exactly onto the rim from outside, contact toast fired.