vestige/apps/dashboard/src
Sam Valladares 9f5a1fde4a feat(observatory): GPU picking — click a memory in the field to inspect it
The living field is now interactive, killing Classic's main reason to
exist. Clicking a node in the WebGPU field opens the same Memory Detail
inspector (content, FSRS bars, retention forecast, promote/demote,
explore) that Classic's Three.js picking drove.

How: NodeRenderer.pickAt(ndcX, ndcY) — the one sanctioned GPU readback,
input-driven and click-frequency only, so the render loop's determinism
contract (spec §6) holds. It copies the live NodeState buffer (post
force-sim positions) to a MAP_READ staging buffer, reprojects every node
on the CPU through the SAME deterministic orbit camera the frame used
(engine params phase + canvas aspect, column-major viewProj), and picks
the nearest node whose projected disc (r·f/w with a floor for faint
nodes, 1.6x halo slop) contains the click. NodeState gains COPY_SRC for
the copy; a fresh staging buffer per click is created and destroyed.

ObservatoryStage gains an onpick prop wired to the canvas layer
(crosshair cursor when interactive); the graph page passes onNodeSelect
so field picks open the existing panel.

Verified live: click at field center hit a real memory, panel opened
with real FSRS data (retention 65.4%, forecast 65%->37% @30d), zero
console errors. svelte-check 940 files 0/0; 96 observatory tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 19:22:07 -07:00
..
lib feat(observatory): GPU picking — click a memory in the field to inspect it 2026-07-08 19:22:07 -07:00
routes feat(observatory): GPU picking — click a memory in the field to inspect it 2026-07-08 19:22:07 -07:00
app.css feat(dashboard): alive overhaul — unique icons, dropdowns, motion on every page 2026-06-22 02:58:26 -05:00
app.html fix: dashboard nav links now include /dashboard base path prefix 2026-03-13 23:41:50 +01:00