**Note** from Bead: Time Line Web Component · [canonical source](https://redfish.acequia.io/guerin/.agents/ade9cea6-f50e-4922-8266-4bdd14ed9c73/2026-06-21/notes/08-sandy-plume-slice-first-light.md) · session 2026-06-21 · discussion: Talk: Time Line Web Component
Stephen: "where are we on the sandy plume app" → "yes proceed." Built the [note 06](06-plume-pipeline-flow-and-fork.md) **smallest slice** end-to-end. Commit `cc1874e`, in `repo/camera-grid/` as **`plume.html` + `plume.js`** (served alongside the camera-grid at `/plume.html`; reuses `cameras-sandy.json` + the same frame-loading). **Not deployed.**
## What it does (zero ML, level-mount projection) 1. **Load + co-view select.** Loads all Sandy cameras + frames, picks t = mid-extent, attaches each camera's pose@t. `selectCoView` finds the **forward** pair-ray intersection that the most cameras' rays pass near (≤2200 m, RANSAC-style vote) → the co-viewing cluster (≤3 cams) + a grid center. This fixed the first attempt's bug: a least-squares crossing of *infinite* lines can fall **behind** a camera → nothing carves; forward-only convergence is required. 2. **Paint masks.** Each selected camera shows its frame + a brush canvas — hand-paint the plume (the stubbed `🖌` mask tool, realized). Mask = an alpha raster at 192×108. 3. **Space-carve (silhouette intersection).** A 32×32×20 voxel grid (3600 m × 3600 m × 2400 m) is centered at the co-view point. A voxel **survives only if it projects inside the painted mask of EVERY painted camera**. `projVoxel`: ENU voxel → (bearing, elevation) from the camera → image `(u,v)` via the **inverse level-mount model** (`u = 0.5 + angDiff(az,camAz)/hfov`, `v = 0.5 − (el−camEl)/vfov`). **Camera elevation is assumed 0** — coarse; refines with DEM/calibration. 4. **Render.** A rotatable **3D voxel preview** on a canvas (orthographic, height-shaded) — the **stand-in for the taos-engine `taos-render-pane`** (note 06) — plus a **Leaflet top-down footprint** (column-height shaded). `window.__plume` (paint/carve/grid) drives scripted demos + tests.
## Verified (CDP) Co-view picked **Las_Virgenes_1 + Castro_Peak_1 + South_Mountain_East_1**; painting central masks on all three carved **1609 voxels**; the 3D preview + map footprint rendered; no page errors. (Uniform test rects → a slab; real hand-painted plume outlines give a plume-shaped hull.)
## Honest status / next (per note 06) - This is the **proof slice**, not the production plane. Coarse by design. - **Next, in order:** real plume-shaped masks (vs the test's rects) · a **frame-diff / learned segmenter** to propose masks ([scene-description `bb0dd4b5`](https://redfish.acequia.io/guerin/.agents/bb0dd4b5-09a3-4d98-ac0f-eadc3ad52949/) is the tag→box→mask ladder) · the real **taos-engine render-pane** · **DEM/GP3T** for true camera+voxel elevation (replaces the assumed-0) · **calibration sharpening** (level-mount → panosphere φ–θ, [`9943ac1c`](https://redfish.acequia.io/guerin/.agents/9943ac1c-caa1-479d-b17e-89ef7ca326b6/)) · the carved volume + masks as **STAC assets** (`plume:volume`, `role:annotation-mask`). - Open: is `plume.html` the right home, or fold into the camera-grid as a mode / a separate `plume-studio` (note 06's fork question — lean: a plane + the embeddable render-pane, not a monolith).
## References (bead cross-links) - Bead: Scene Description · [canonical](https://redfish.acequia.io/guerin/.agents/bb0dd4b5-09a3-4d98-ac0f-eadc3ad52949/) - Bead: Astronomical Pano · [canonical](https://redfish.acequia.io/guerin/.agents/9943ac1c-caa1-479d-b17e-89ef7ca326b6/)