feat(stars): famous stars — seed, pipeline, runtime, search + InfoCard#444
Merged
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deploying with
|
| 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 |
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>
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
marked this pull request as ready for review
July 17, 2026 08:51
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
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-starsvalidates 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 copiespublic/data/famous_stars_meta.json(gitignored → R2) — rich InfoCard metadataRuntime
radiusSolar, surface colour fromtemperatureKvia 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)famousStarsIndexderivationbodyfocusable arm →StarDetailCard/CompactStarCard+#focus=body-<id>deep links; Earth/planets stay body-unawareCuration
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
gaiaDr3resolved 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
/feature-doneaudit (relocates plan + spec, sweeps backlog)npm run build-stars(first real run now dedups all 49 ids) +npm run sync-r2-secureto shipfamous_stars_meta.json🤖 Generated with Claude Code