Skip to content

feat(stars): famous stars — seed, pipeline, runtime, search + InfoCard#444

Merged
rulkens merged 52 commits into
mainfrom
worktree-famous-stars-seed-pipeline
Jul 17, 2026
Merged

feat(stars): famous stars — seed, pipeline, runtime, search + InfoCard#444
rulkens merged 52 commits into
mainfrom
worktree-famous-stars-seed-pipeline

Conversation

@rulkens

@rulkens rulkens commented Jul 17, 2026

Copy link
Copy Markdown
Owner

What this is

One committed seed — data/seeds/famous_stars.seed.json, 119 curated stars — is now the single source of truth for every named star skymap draws. npm run build-famous-stars validates it and emits three artifacts:

  • src/data/bodies/famousStars.generated.ts (committed) — consumed synchronously; SCENE_STARS = FAMOUS_STARS_GENERATED.map(star)
  • tools/stars-rs/src/famous_ids.generated.rs (committed) — the Gaia-dedup id set for the Rust star-catalog builder (49 ids), replacing two hand-maintained copies
  • public/data/famous_stars_meta.json (gitignored → R2) — rich InfoCard metadata

Runtime

  • Real physics per star: radius from radiusSolar, surface colour from temperatureK via a new blackbody fit (temperatureToLinearRgb), oblateness as a per-axis MVP scale (Achernar 0.35, Gamma Cas 0.275, Alderamin 0.21, Altair 0.20, Regulus 0.23, Rasalhague 0.16)
  • Search: every star findable by all its names (Bayer + catalogue aliases) with a constellation secondary, via a shared famousStarsIndex derivation
  • Selection: star-only body focusable arm → StarDetailCard / CompactStarCard + #focus=body-<id> deep links; Earth/planets stay body-unaware
  • Growth-proofing found by the data itself: foreground-gate fixtures + label capacity now derive from the roster (the 64-label GPU clamp would have silently swallowed captions); the gate margin was recalibrated (×1000 → ×100) for the deep roster — gate = 0.23 Mpc

Curation

25 migrated batch-0 stars + 94 net-new across 5 reviewed batches (Wikipedia brightest-stars table to V +2.50 ∪ iconic extras: Mira, Albireo, Eta Carinae, 51 Pegasi, Delta Cephei, VY CMa, UY Scuti, T CrB). Every gaiaDr3 resolved via SIMBAD identifier lists (never positional); 49 real DR3 ids, 70 SIMBAD-confirmed saturation nulls with provenance notes.

Process

Executed via subagent-driven development: 15 plan-01 tasks + 7 plan-02 tasks, each with an independent spec+quality review; entanglement-radar pass (4/4 un-braiding checks, 1 knot fixed); final whole-branch review verdict: ready to merge after curation (curation now complete). Full suite green: 697 files / 4,163 tests.

Before merge

  • User visual pass: label density at ~119 captions, oblate stars render flattened, and the new 0.23 Mpc gate/fade onset feels right (was ~0.01 before deep stars joined the roster)
  • /feature-done audit (relocates plan + spec, sweeps backlog)
  • After merge, from the main worktree: npm run build-stars (first real run now dedups all 49 ids) + npm run sync-r2-secure to ship famous_stars_meta.json

🤖 Generated with Claude Code

rulkens and others added 2 commits July 17, 2026 01:40
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 17, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
skymap 7aa187d Commit Preview URL

Branch Preview URL
Jul 17 2026, 10:00 AM

rulkens and others added 27 commits July 17, 2026 02:05
Add FamousStarRow (generated-table projection), StarInfo (sync selection
display record), and FamousStarMetaEntry (async physical-properties sidecar)
type declarations, one per file per house rules. Extend StarBody with an
optional oblateness field for per-axis MVP flattening and re-note that colour
derives from blackbody temperatureK.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Planckian-locus tint (Tanner Helland fit) converted sRGB→linear for the
HDR pass, max-channel normalised. Leaf util for reuse by the star maker
and future Gaia teff_gspphot tinting.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Hand-rolled parser for data/seeds/famous_stars.seed.json modelled on
famousSeed.ts: FamousStarEntry authoring type, validateFamousStarEntry,
parseFamousStarsSeed. Duplicate ids and a missing gaiaDr3 field are hard
errors; gaiaDr3 is required-but-nullable so 'not yet resolved' can never
read as 'nothing to subtract'. Rule tests run against inline fixtures; the
real-seed coverage invariant is guarded to skip until Task 5 authors the seed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add a variable sub-validation (non-empty type; magRange of exactly two
finite numbers, bright-first) and physical bounds for magV [-27, 16] and
absMag [-12, 20], mirroring the existing fail-loud range checks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Split the curated famous_stars.seed.json into its two runtime artefacts:
the committed generated render/search table (src/data/bodies/
famousStars.generated.ts) and the gitignored InfoCard meta sidecar
(public/data/famous_stars_meta.json, via writeMetaSidecar). Add the
'famous-stars.seed' registry row and the build-famous-stars npm script.
The seed→row and seed→meta projections are pure exported functions,
tested against an inline fixture (spherical / oblate+variable / null
gaiaDr3 + omitted massSolar) with no filesystem access.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rated

Positions/absMag migrated verbatim from sceneStars.ts (frame + f64-anchor
tests pin them); gaiaDr3 migrated digit-for-digit from famousStarGaiaIds.ts
with provenance notes. Authored + fact-checked: constellation, spectral
type, magV, radius, temperature, optional mass/luminosity/age/variable,
and curated descriptions. Generated table committed in lockstep (npm run
build-famous-stars).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Switch SCENE_STARS to FAMOUS_STARS_GENERATED.map(star). The star maker
now takes a FamousStarRow: colour comes from the blackbody temperature
(temperatureToLinearRgb) instead of a spectral-class palette bucket, and
radius comes from the row's real radiusSolar instead of a uniform 1 R.
Delete the four now-unused star-bucket constants from palette.ts.

Retune the star-LOD partition fixtures: with real sub-solar dwarf radii,
Proxima no longer resolves at half an AU, so the near-resolver role moves
to Sirius (1.71 R), keeping the sphere/point XOR intact.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Anchors are authored inline as this ramp's own definition; hand-seeded scene stars colour independently via temperatureToLinearRgb (kelvin, not BP-RP).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…starTint

The inline anchor comment now points at the module header instead of palette.ts, which no longer holds spectral-class star data.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…resLayer wiring

Grow composeBodyMvp with an optional oblateness parameter (default 0) that
flattens the polar (model-Z) axis to radiusMpc·(1−oblateness). Sphere is the
oblateness-0 case, so Earth/planets compose unchanged. starSpheresLayer forwards
star.oblateness. No uniform or shader change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The famous-stars seed is the single source of the Gaia-dedup fact. Both
copies of the id set are eliminated: the standalone TS table
(tools/catalog/famousStarGaiaIds.ts) and the hardcoded Rust const in
population.rs.

- buildStars.ts derives the ReadonlySet<bigint> from the seed via a new
  pure seedToFamousGaiaIds projection (null gaiaDr3 drops out).
- buildFamousStars.ts gains a third emit target, seedToRustConst, writing
  the committed tools/stars-rs/src/famous_ids.generated.rs; population.rs
  include!()s it (no serde dep by design). Array length tracks the
  non-null seed count, nothing hardcodes 17.
- Delete famousStarGaiaIds.ts + its test; refresh stale comment refs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cargo check (now part of the famous-stars regeneration loop) creates
tools/stars-rs/target, and CMake emits zlib-ng timestamp files with a .ts
extension there. tsconfig.tools.json includes "tools" with an empty exclude,
so tsc parses those as TypeScript and fails. Exclude the target dir.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…cope note

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…condary

famousStarsIndex.ts derives FAMOUS_STAR_IDS + FAMOUS_STAR_SEARCH once from
the generated seed table; rankPaletteMatches scores star bodies over their
full names[] (Bayer + catalogue aliases), and ROW_VIEW.body resolves the
alias/constellation secondary from the same index. Earth/planets keep the
label-only path and Solar System chip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add the React-side loading pair for the famous_stars_meta.json sidecar,
mirroring the famous-galaxy twins (famousMetaFetcher / useFamousMeta):

- famousStarsMetaFetcher: tier-agnostic fetch of famous_stars_meta.json,
  throws HttpError on !ok, exposes parseFamousStarsMeta for unit testing.
- useFamousStarsMeta: fetch once at mount, fail-soft to empty + ready=true
  so a build without the sidecar never deadlocks a card consumer.
- FamousStarsPayload + UseFamousStarsMetaReturn types (one per file).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Mirror the galaxy twin's 4th fetcher-contract test — assert the fetcher
rejects (rather than resolves) when handed an already-aborted signal, so a
refactor dropping the { signal } option can't pass silently.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Grow the FocusableTarget union + its dispatch tables so a famous star
becomes selectable end-to-end: clicking/deep-linking a star produces a
StarInfo focusable that drives the InfoCard and the #focus=body-<id>
link. The body arm is STAR-ONLY (correction 1) — buildFocusable gates on
FAMOUS_STAR_IDS, so Earth/planets return null and stay body-unaware (no
InfoCard, no hash), preserving today's behaviour.

- FocusableTargetType gains 'body'; FocusableTarget gains the StarInfo arm.
- SelectionRow body arm carries `label` (rides the row, not the async meta
  sidecar) so a star's name shows the instant it is selected.
- URL_HASH_FOR.body emits `body-<id>` under BODY_FOCUS_PREFIX, matching the
  sibling encoders (focusIdOf, focusIdForRow) so the deep-link round-trips.
- TARGET_IDENTITY_KEY and REF_OF gain their body arms (REF_OF is the
  boundary mapper the star's Focus dispatch needs).

tsc intentionally still fails at DETAIL_CARD's missing 'body' key — Task 12
lands that row immediately after.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Land the 'body' arm's cards and its DETAIL_CARD row, completing the
Record<FocusableTargetType, DetailCardEntry> exhaustiveness. StarDetailCard
resolves its properties block + description from the useFamousStarsMeta
sidecar by id, rendering headline-only until the fetch settles (fail-soft)
and dropping absent optional rows. CompactStarCard is the fetch-free hover
preview off StarInfo.label.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Resolve the constellation synchronously from the compile-time
FAMOUS_STAR_SEARCH map (the same derivation the command palette's body
row uses) so the hover preview shows headline + constellation with no
sidecar dependency. Guards an unindexed body to name-only, never a crash.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The famous-stars metadata sidecar is a gitignored build artefact fetched
by the runtime and shipped only via R2, exactly like famous_meta.json.
Add its ALLOW clause (+ docstring enumeration) so the deploy sweep ships
it instead of silently skipping the new sidecar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rulkens and others added 15 commits July 17, 2026 05:20
The "which famous-stars seed entries contribute a Gaia dedup id"
predicate (gaiaDr3 !== null) was restated in two independent build
paths — buildStars.ts (Set<bigint>) and buildFamousStars.ts (Rust
[u64; N] const). A future clause could drift them apart with no test
binding the Rust side. Extract the selection into one exported
selectDedupEntries in famousStarsSeed.ts; each caller keeps its own
encoding. The generic return narrows gaiaDr3 to string, dropping the
`as string` assertion.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…omplete

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e body roster

Batch-1 grew the famous-stars seed to 44 entries; Deneb at 802 pc pushed
FOREGROUND_MAX_DISTANCE_MPC to ~0.8 Mpc and the roster to 66 bodies, breaking
11 tests that pinned pre-growth values.

- Gate-class fixtures (earth/planets/starPoints/orbitTrails): replace the
  hardcoded 0.43 Mpc "galaxy scale" with FOREGROUND_MAX_DISTANCE_MPC * 10 so the
  above-gate assertions track the gate as the seed roster grows it.
- Label capacity (real bug): createLabelRenderer's default maxLabels 64 silently
  clamps setLabels, so past 64 bodies captions vanish. Add FOREGROUND_LABEL_CAPACITY
  derived from SCENE_BODIES.length (next power of two) and size the foreground
  caption renderer with it in initGpu.
- produceMilkyWayLabel + foregroundLabelsLayer tests: re-derive the fade/neighbourhood
  expectations from SCALE_FADE_BANDS instead of pinning stale absolutes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Canopus through Bellatrix, brightest-first from the roster. All 19 are
Gaia-saturated naked-eye stars with SIMBAD-confirmed absent DR3 rows
(gaiaDr3: null + provenance notes); achernar/regulus carry oblateness,
seven systems carry structured variability.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Elnath through Alsephina. Three Gaia DR3 ids resolved via SIMBAD
identifier lists (Alnair, Alioth, Alkaid — the dedup const grows 17 → 20);
the other 16 are SIMBAD-confirmed saturation holes with provenance notes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Mirzam through Aspidiske, including Polaris (Cepheid) and Algol (the
Demon Star, eclipsing-binary prototype). Four DR3 ids resolved (dedup
const 20 → 24); fifteen SIMBAD-confirmed saturation nulls with notes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Suhail through Girtab. Eleven DR3 ids resolved via SIMBAD identifier
lists (dedup const 24 → 35); eight saturation nulls with notes. Almach
mass omitted over an implausible published figure (omit-not-guess).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The famous-stars roster now reaches Eta Carinae (~2300 pc), so the ×1000
margin pushed FOREGROUND_MAX_DISTANCE_MPC to 2.3 Mpc — above galaxy scale,
breaking the near-field invariant. Drop the margin to ×100 so the gate lands
at ~0.23 Mpc: still a two-decade enclosure over every seeded body, still well
under 1 Mpc, and back below the Milky-Way label's 0.6 Mpc near band so the
coupled surveyDeepZoom band lets the 'You are here' annotation reach full
alpha in the Local Group.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…119, roster complete)

Scheat through Acrab plus the extras: Mira, Albireo, Delta Cephei,
Eta Carinae, 51 Pegasi, VY Canis Majoris, UY Scuti, T Coronae Borealis.
Fourteen DR3 ids resolved (dedup const 35 → 49) — including Eta Carinae,
which does carry a DR3 row despite its brightness. TRAPPIST-1 dropped
from the roster (V ≈ 18.8: not a night-sky star, fails the magV bound).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, Altair oblateness, backlog note

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, visual spot-check open

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…from the roster

Two visual regressions surfaced by the roster's growth (25 → 119 stars,
seed extent 10 pc → 2300 pc), both from Pollux-era constants that never
rederived when deep stars were seeded:

1. Bright non-fading blob at Milky-Way scale. The point-partition stars
   drew as minimum-size additive sprites with no distance fade until the
   hard FOREGROUND_MAX_DISTANCE_MPC gate, so 119 sprites clustered inside
   2.3 kpc collapsed onto a few pixels — a bright blob that popped off at
   the gate. New starBackdrop fade band (keyed on camera distance from the
   origin) dissolves the backdrop smoothly, completing strictly inside the
   gate so its cut lands on already-black sprites; starPointsLayer scales
   each uploaded colour by the band and disables outright at alpha 0.

2. Deep-star captions never appeared. The caption gate
   (SOLAR_SYSTEM_LABEL_MAX_DISTANCE_MPC = 1 kpc hand literal) and the
   starCaption fade band ({12, 25} pc) both stranded every star past a
   kiloparsec. Both now derive from FARTHEST_BODY_MPC (exported): the gate
   is ×4, the caption band {×1.1, ×2} — sized so from Earth every seed sits
   at full alpha and the pop-free inequality (band reaches 0 before the gate
   cuts the layer) holds with equality.

New invariant tests pin both pop-free relationships; layer tests cover the
band-gated disable and the colour scale.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The solar-system caption gate is now derived from the star roster
(FARTHEST_BODY_MPC x 4), so it no longer numerically coincides with
EARTH_TEXTURE_MAX_DISTANCE_MPC; the docblock claimed it did.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@rulkens
rulkens marked this pull request as ready for review July 17, 2026 08:51
rulkens and others added 7 commits July 17, 2026 11:15
Move the sizing floor/ceiling + size reference, the inverse-square
apparent-flux reference distance + fly-through floor, the calibrated
exposure baseline, and the peak-from-flux relation out of
starCatalog/vertex.wesl into lib/starPhotometry.wesl, and relocate the
hue-preserving knee from starCatalog/knee.wesl to lib/starKnee.wesl. Both
are now shared homes the famous / scene star stage can sit on without a
cross-family import, so the two stages can never drift a leaf's look
apart. Pure extraction — the survey (Gaia bin) output is unchanged: the
vertex stage keeps its exact arithmetic (now sourcing the constants +
starPeakIntensity from lib), and the two knee importers only change
their import path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The famous / scene star point sprites used a self-declared placeholder
size ramp (radius grew with magnitude, full-peak Gaussian, no distance
term, no slider), so they read as fat bright dots beside the survey
(Gaia bin) starfield and ignored the star-size slider. Rewrite the
bodies/starPoints vertex + fragment stages on the shared photometric
core (lib/starPhotometry.wesl + lib/starKnee.wesl): a fixed
slider-scaled floor radius carrying inverse-square apparent flux as a
luminance-conserving peak intensity, the rim-zeroed Gaussian profile,
and the hue-preserving knee — so a famous star renders pixel-identically
to a Gaia leaf of the same absMag, colour and camera distance.

The uniform grows a sizePx / brightness tail (StarPointUniforms, 96 B);
starPointRenderer.draw writes it and starPointsLayer forwards
starCatalogs.sizePx and brightness folded with the SAME starExposureRamp
starCatalogLayer applies. Not gated on starCatalogs.enabled — that is
the Gaia survey's master toggle; the famous layer keeps its own gate.
The vp-fix-1 backdrop colour-scale fade is unchanged (linear on the
additive output, same as intensity).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add a user-facing on/off toggle for the seeded famous-star map as its own
row under Stars → Star catalogs. New settings.famousStars singleton-overlay
cluster (default on, registry-derived), gating both star content layers and
the star-map captions — the Sun is exempt (it anchors the descent), so
muting the map never hides the solar system.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Move the "Famous stars" row ahead of the mapped star-catalog rows and give
it a count chip showing the seeded roster size (SCENE_STARS.length, a
compile-time constant off the seed table), styled identically to the Gaia
rows' loaded-count chip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ted/

DoD audit READY: 4177/4177 tests + typecheck clean at 236705b; plan 01
68/68, plan 02 14/14 (oblateness spot-check waived by user at audit);
zero new TODOs; backlog already clean of famous-stars items. Visual-pass
follow-ups (fade bands, Gaia photometry parity, catalog toggle, EDGE
fold) reviewed and landed on the same PR.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…l union

Conflict: FocusableTargetType.d.ts. Took main's derived form
(FocusableTarget['type'], #446) — the branch's 'body' arm rides in
through the union's own StarInfo tag, so the literal restatement this
branch carried is obsolete.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@rulkens
rulkens merged commit 6027e8c into main Jul 17, 2026
2 checks passed
@rulkens
rulkens deleted the worktree-famous-stars-seed-pipeline branch July 17, 2026 10:06
rulkens added a commit that referenced this pull request Jul 17, 2026
Both features added a star-ish focusable with different discriminants:
#444's 'body' arm (named famous stars, seed ids) and this branch's
'star' arm (anonymous Gaia survey stars, bin record indices). Kept
both arms in every dispatch table; renamed our colliding identifiers
to FieldStarInfo / FieldStarDetailCard / CompactFieldStarCard, leaving
#444's shipped surface pristine. Full resolution + impacts on the
remaining plan tasks: .superpowers/sdd/merge-444-report.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rulkens added a commit that referenced this pull request Jul 17, 2026
…ting body arm

#444 shipped the body arm's display half (focusable/cards/URL/framing) but
star-only and mis-named. T9 becomes the BodyInfo rename + guard lift; T10-T12
carry the actual pick side; old T13 mostly folds; the SelectionRow stellar
extension drops (famous-meta sidecar supersedes it).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rulkens added a commit that referenced this pull request Jul 17, 2026
… (target, slab) steps

Both panels were flat draw-order lists that interleaved cosmological,
near-field, overlay, and infra rows after #444/#445 + the picking branch
added ~10 near-field layers. Rows now carry a groupKey from the producing
render step; PASS_GROUP_TITLES merges steps into six shared human titles
(the walk stays one-key-per-step — merging lives only in the adjustable
table). Same group order in both panels for positional scanning, per-group
ms subtotals in the timings headers, per-row slab badge dropped (the header
carries slab identity). Unmapped keys fall back to their raw key as title.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rulkens added a commit that referenced this pull request Jul 18, 2026
Eight rungs flipped to "Built in skymap" now that their subsystems
landed on main since #401 opened:

- 10^21 Milky Way    → GPU star + dust point cloud (#408, impostor gone)
- 10^20 Orion Arm    → true-position Gaia star bin (#442)
- 10^17 nearest stars → Sun + Proxima at true parallax (#444)
- 10^12/10^11/10^10/10^8 planets, solar system, Earth+Moon → planet rendering (#445)
- 10^9  the Sun      → emissive scene-star sphere (#444)

10^19 Local Bubble downgraded research → buildable (star field renders;
the local dust volume is the remaining wiring). 10^7 Earth stays built
but its viz no longer claims the geolocation pin / atmosphere, neither
of which is rendered yet.

Each newly-built rung carries a `ref` link to the PR that shipped it,
rendered next to the badge — making the footer's "'Built in skymap'
links point at the subsystem" promise real.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant