Origin in the Sandy STAC + the incident-viewer (Fire Progression)

**Note** from Bead: Fire Progression · [canonical source](https://redfish.acequia.io/guerin/.agents/182bd1a7-a376-4dd0-b445-578adc6635b9/2026-06-16/notes/02-stac-origin-and-incident-viewer.md) · session 2026-06-16 · discussion: Talk: Fire Progression

Stephen: put the reported ignition origin into the Sandy Fire STAC so it can be viewed in the incident-viewer (`incident-view.html`). First study the incident-viewer epics for structure/context.

## What I added to the Sandy STAC (`cbf8b027`) A new collection `origin/`, sibling of `perimeters`/`progression`, wired as a `rel=child` in the Sandy `catalog.json`, with one Point item: - `origin/collection.json` — `2026SandyFire-origin`. - `origin/items/sandy-ignition-origin.json` — `Point [-118.746484, 34.25235]`, `datetime 2026-05-18T17:17:00Z`, `properties.fire:role = "ignition-origin"` (+ `fire:address`, `fire:cause`, `fire:source_url`). Modeled on the existing `cameras` Point items (same links/bbox shape). Synced to the canonical URL `…/cbf8b027-…/2026-06-11/artifacts/stac/2026SandyFire/`.

## incident-viewer structure (epic-4 bead `be9c3efd`; repo `Documents/src/incident-viewer`) - **Catalog walk** (`walkStacInto` → `registerIncident`, index.ts ~837): generic — it registers EVERY `rel=child` collection's items into a per-incident registry. `COLLECTION_ORDER = ['fmv','perimeters','imagery-irhs','progression','cameras']` is **sort-only** (index.ts 821); an unknown shortId (`origin`) returns indexOf −1 and sorts first — it is **not** filtered out. So the origin item loads into the **registry + roster + layer-tree** with no code change. - **3D rendering is per-collection**: `fmv` = video projection, `perimeters` = draped polygons, `progression` = RGB TOA raster, `cameras` = green octahedron **Point glyphs** (`camerasFeature`, a `RenderFeature` at ~2782 using `ecefDeltaModel` + provisional-height re-anchor). **There is no generic Point-marker renderer.** So the origin shows in the roster but draws **no 3D marker** until a feature is added. - **Default visibility** = every item OFF until toggled on in the roster (per-catalog localStorage whitelist). - **Catalog source** = whatever URL is loaded (`?stac=` / per-domain IndexedDB / same-origin `./stac/catalog.json`); the Sandy STAC is served from the `cbf8b027` tree. Deployed viewer: `redfish.acequia.io/guerin/apps/incident-viewer/` + `santafe.live/`.

## To render the origin as a marker (proposed, ~30 lines) Mirror `camerasFeature`: iterate `regCollection(id, 'origin')?.items`, filter `geometry.type === 'Point'`, build a **distinct (red/orange) glyph** (pin/teardrop/inverted-cone vs the green camera octahedron) at the point with the same delta-anchor + provisional-height logic; add `'origin'` to `COLLECTION_ORDER`; standing item (timeline-exempt). Dropped a dock note to `be9c3efd/uploads/2026-06-16-sandy-ignition-origin-added-to-stac.md`.

## Viewer render feature — IMPLEMENTED + verified locally (NOT deployed) [2026-06-16, Stephen: "implement, verify, don't deploy"] On branch `dev/engine-update` (uncommitted), mirroring `camerasFeature`: - **`originFeature`** (`RenderFeature`, "IgnitionOrigin"): iterates `regCollection(id, 'origin')?.items`, filters `geometry.type === 'Point'`, builds a **red** (`albedo [1,0.25,0.15]`) octahedron-on-stem glyph (same `buildCamGlyphMesh`, R=34/lift=90) with the same `ecefDeltaModel` + provisional-height re-anchor; standing/timeline-exempt. `loadOrigin(id)` single-flight cache; wired into `switchIncident` next to `loadCameras`; `'origin'` appended to `COLLECTION_ORDER`. Added a `window.__misb.origins()` inventory hook (mirrors `cameras()`). - **Build:** clean typecheck, chunk `index-CmHfQXWf.js`. - **CDP verify** (`tools/origin-check.mjs`, real-GPU Chrome :9222, served `dist` :8123, `?stac=<Sandy canonical catalog>`): - `[stac] 2026SandyFire: … progression=1 cameras=30 origin=1 (total 61)` — the origin item ingests. - layer-tree shows an `origin (1)` row; per-catalog visibility whitelist restores it visible. - via the real `switchIncident` path: `[cameras] 30 loaded` + `[origin] 1 loaded`. - `window.__misb.origins()` → `[{id:"sandy-ignition-origin", lon:-118.746484, lat:34.25235, built:true, provisional:false, glyph:true, hidden:false}]` — the glyph mesh is constructed, terrain-anchored, and pushed to the transparent pass every frame (authoritative "it draws"; identical builder/path as the green camera markers that render in production). - **Note (pre-existing, not mine):** the point-loaders fire from `switchIncident` (select) only, not from startup `adoptIncidents`; cameras have the same gap. Interactive use (select / reload with the app-appended `?v=` deep-link) triggers it. Left as-is to keep the change surgical; flagged to the viewer thread.

## DEPLOYED [2026-06-17, Stephen: "deploy the marker"] - Committed `8b5806c` on `dev/engine-update`; deployed `dist/` (chunk `index-CmHfQXWf.js`) to **both** hosts — `redfish.acequia.io/guerin/apps/incident-viewer/` + `santafe.live/` — old chunk `iRV1S1l3` DELETEd (204) on both. - **CDP-verified on LIVE redfish:** `[origin] 1 loaded`, `__misb.origins()` → `built:true, provisional:false, glyph:true, hidden:false`. - **Caveat:** deploying the marker shipped the entire `dev/engine-update` branch (it carried the previously review-pending items-panel re-platform `71cf433` + STAC-manager + engine bump). Flagged in the dashboard `project.json` (`q-deploy-origin` resolution) + the viewer `log.md`. - **Project dashboard:** added `be9c3efd/{project.json,dashboard.html}` (shape-up pattern, copied from `74c30681`) — featured deploy link = the Sandy deep-link; served at `redfish.acequia.io/guerin/.agents/be9c3efd-…/dashboard.html`. - **Showcase UX note:** items default OFF + loaders fire on incident-select (pre-existing, cameras too) — to see the red marker, toggle `origin (1)` in the layer-tree and re-pick the Sandy incident.

## Branch/deploy state at the time (now superseded) The repo was mid-flight: HEAD = `dev/engine-update` (items-panel re-platform `71cf433`); LIVE was `master` (`6175c57`). Deploying the marker from this branch published the engine-update work too.