- 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