Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@ Diagnosed but unplanned. Captured here so they don't get lost; promote to a spec
- **Milliquas needs its own colormap (AGN ≠ galaxy)** — Milliquas points render overwhelmingly blue. The *clamp* half shipped (#282): the redshift K-correction (`kPerZ`) was subtracting more than the whole `[0,2]` ramp span for high-z quasars and pinning every row to the blue floor; `kPerZ` is now 0 so the real B−R spread survives. What remains is the **semantic mismatch**: quasars genuinely have small B−R, so on the galaxy star-forming↔elliptical ramp they legitimately land in the blue third, but "blue" there means "star-forming galaxy" — the wrong reading for a non-thermal AGN continuum. The fix is to give AGN their own visual encoding instead of reusing the galaxy ramp. Directions to weigh in the brainstorm: (a) a distinct AGN ramp (violet/amber) keyed on B−R so quasars read as a different object class; (b) encode **redshift** instead of colour (z is the meaningful axis for objects spanning the observable universe); (c) tint by the Milliquas **class byte** (Q/A/B/K/N/S) or parent-survey byte — both already on the `.bin`. Likely needs a `colourMode` discriminant on `SOURCE_REGISTRY` + a shader ramp branch; brainstorm → spec → plan, not a drop-in.
- **Tour feature (full)** — finish the camera tour beyond the Part-2 seed. Tracked design: [splash-screen Part 2 plan](superpowers/plans/2026-05-20-splash-screen-02-stub-tour.md) (ready to execute; engine-side `engine.tour` seed, verified current 2026-06-04) and [2026-05-07 tour-animation spec](superpowers/specs/2026-05-07-tour-animation-design.md) (re-grounded 2026-06-04; labels + MW impostor + engine-API decisions resolved, cinematic palette documented). Execute Part 2 first, then resolve the spec's remaining open decisions (rotation slerp, caption producer, beat list/timing), promote to a plan, and extend the seed into the real waypoint tour.
- **Label declutter flickers under continuous camera motion (make it a toggle)** — surfaced 2026-06-18 while spiking the cosmic-flows orbit capture. The label director's greedy screen-space overlap cull (`labelDirectorSubsystem.ts` `declutter`, `DECLUTTER_MARGIN_PX = 48`) suppresses the lower-`prominencePx` of any two anchors landing within 48 px in both x and y. Under a slow orbit (or any sustained camera move) labels repeatedly cross that margin and get suppressed-then-released frame-to-frame, which reads as flicker — distracting on a screen recording, and arguably on normal navigation. Two threads: (1) **add a user setting** to disable declutter — belongs under **Settings → Labels → Advanced** (the Labels section already exists; this is a new per-section Advanced toggle, plumbed `settings.labels.declutter` → `labelDirectorSubsystem`). A throwaway `?nodeclutter` URL gate was added in the `fly-to-edge-spike` worktree as a stopgap and should be replaced by the real setting. (2) **Stabilise the cull itself** so on/off decisions hysteresis-damp rather than toggle per-frame (e.g. a release margin wider than the suppress margin, or a short cooldown before a suppressed label can re-show) — the proper fix if labels are wanted *on* during the cosmic-web clip (Post 1) and the tour.
- **GPU-handle nullability + the `ctx`/`PassDeps` re-threading it forces (revisit)** — surfaced 2026-06-21 while specing the [RenderFrameSettings dissolution](superpowers/specs/2026-06-21-dissolve-render-frame-settings-design.md). **Tackle *after* that dissolution lands** — RFS is the smaller, cleaner first cut of the identical "bag re-threads what's already on state" pattern, and finishing it makes this one obvious.
- **The root fact.** Every field on `EngineGpuHandles` is `Renderer | null` because `createEngine` returns synchronously but the GPU pipelines are built in an async `requestAdapter`→`requestDevice`→shader/atlas chain — absent for ~2 bootstrap frames (and re-nulled by `destroy()`). One *transient* lifecycle fact is encoded as *perpetual* per-field nullability, so every access forever pays a null-check tax though the handle is provably non-null after `initGpu`.
- **The inconsistency.** Four different access styles coexist for the same kind of thing: (1) **ctx-narrowed** — `renderer`/`postProcess`/`volumeOffscreen`/`texturedDisks` narrowed once via `isEngineReady`/`ReadyFrameContext` (`frameContext.ts:57-72`), read as `ctx.renderer`; (2) **`!`-asserted** at point of use (`pointSpritesPass.ts:98` `state.gpu.focusUniform!`); (3) **null-checked** at point of use (~15 renderers); (4) **always-non-null null-object** (`timingService`'s no-op stub — the better pattern, already in the tree). The `runFrame`→`renderFrame` assembly even pulls renderers from two sources inconsistently (`runFrame.ts:344-348`: some from `deps`, some from `state.gpu`).
- **`PassDeps` is the renderer-equivalent of `RenderFrameSettings`.** It re-threads renderers already on `state.gpu` purely to launder the `| null` into a non-null shape at the `renderFrame` boundary — the docblock admits `texturedDiskRenderer`/`proceduralDiskRenderer`/`milkyWayRenderer` live on the bag *only* for `destroy()` reachability and "are not consumed via this bag at runtime (the frame loop receives them through `RunFrameDeps`)." Fix the nullability once and passes read `state.gpu.X` directly (they already get `state`); `PassDeps` sheds its renderer fields. Also folds in the `ctx` half: `ctx` re-declaring `state.gpu.*` handles is the same narrowing-laundering.
- **The careful caveat (scar tissue).** The point-of-use checks are *partly deliberate*: the docblocks exclude handles from `isEngineReady` because "bootstrap progression isn't the inverse of teardown" — the 2026-05-08 black-screen incident (memory `feedback_lifecycle_vs_teardown_invariants`), where consolidating a multi-handle "ready" predicate over-constrained mid-bootstrap callbacks and blanked the canvas. So the naive "one big ready flag" is exactly the move that bit us.
- **Target.** Separate the three concerns currently fused under one `| null`: **existence** (non-null after `initGpu` — nearly all), **data readiness** (`filamentRenderer` exists but empty until `loadFilaments`; `flowFieldRenderer` until demand — genuinely still absent at draw time), and **destroy reachability**. Narrow the bootstrap-guaranteed handles once into a non-null "ready GPU" view (extend `ReadyFrameContext` or a `ReadyGpu` bag), keep `| null` only for the genuinely-absent-at-draw-time ones (some via a `timingService`-style null-object), let `destroy()` iterate the raw bag — done incrementally, respecting the teardown asymmetry, never a big-bang ready flag.
- **Thumbnail quality (SDSS / DSS branches)** — the auto-fetched SDSS-cutout and CDS-DSS thumbnails still have the original quality issues: ranked fix options are mask, sky-sub, per-galaxy size, DESI source, brightness norm (see memory `project_thumbnail_quality`). The *famous-galaxy* branch is now fully addressed — procedural-disk fade-out, high-res LOD (#214), and thumbnail calibration + square deproject + disk-plane unification (#229/#234/#235/#240) all shipped — so this item is scoped to the non-curated SDSS/DSS path only.
- **Supercluster/wall shape accuracy (focus mode)** — cluster-focus mode (PR #242) renders membership as a sphere of radius `apparentRadiusMpc ?? physicalRadiusMpc` centred on the catalog centroid. For superclusters/walls (MSCC) this is crude: the structure is a flattened sheet, so the sphere swallows foreground/background voids and clips the wall's arms (e.g. Hydra Wall reads ~847 galaxies at medium tier). No all-sky per-galaxy membership catalog exists to replace it — redMaPPer/WHL give cluster member galaxies but only in the SDSS footprint; Liivamägi+2012 gives galaxy→supercluster IDs but is also SDSS-limited and threshold-dependent. Investigate a better proxy: (a) **ellipsoid fit** from MSCC member-cluster positions (`memCl` column — data we already have); (b) **density-field membership** reusing the rhizome/MCPM cosmic-web field or DisPerSE filaments (all-sky, same method the literature uses). Option (a) is cheap and immediate; (b) is more principled and reuses existing plumbing.
- **GLADE shell artifact at ~400 Mpc** — hard depth boundary created by Task 7 abs-mag filter; 3 fix options deferred 2026-05-04. See memory `project_glade_shell_artifact`.
Expand Down
Loading
Loading