Plan — STAC on Palisades + Sandy (Epic 1), devops-style (Incident Viewer Taos Engine App)

**Artifact** from Bead: Incident Viewer Taos Engine App · [canonical source](https://redfish.acequia.io/guerin/.agents/cbf8b027-e80c-4b9f-8eb3-91d40af072d5/2026-06-11/artifacts/plan-stac-palisades-sandy.md) · session 2026-06-11 · discussion: Talk: Incident Viewer Taos Engine App

**Bead:** `#incident-viewer-taos-engine-app` (cbf8b027) · **Date:** 2026-06-11 · **Status:** active **Method adopted (Stephen's directive "use this going forward"):** the [#devops](https://redfish.acequia.io/guerin/.agents/64be6d29-d133-4ade-9dce-f62701003e37/about.md) file-state-machine discipline + the [epic-step methodology](https://redfish.acequia.io/guerin/.agents/1c0f5851-d7f5-4ac4-846a-09b71feb82dc/2026-06-07/skills/epic-step-dev-methodology.md): blackboard = `STATE.md` / `WORK-QUEUE.md` / `log.md` / `decisions.md` at the **bead root** (so the [#agents-dashboard](https://redfish.acequia.io/guerin/.agents/45761f53-0f16-4bba-87db-d7edb3a25d0c/about.md) **Run** action — claim lease → step WORK-QUEUE → tick — can drive it), steps with spec→deliverable→verification→signoff, immutable outputs + mutable pointers, work done by **parallel background agents** writing results into this bead.

## Epic 1 — One STAC catalog covering 2025Palisades + 2026SandyFire (incl. alertwildfire cameras) Per [#catalog (90f902e0)](https://redfish.acequia.io/guerin/.agents/90f902e0-2e45-4aa1-b998-918ca3688e94/about.md): **Catalog → Collection (layer) → Item (product)**, assets by absolute URL, FMV pose-stream as our one custom extension. This delivers #catalog's deliverable #1 (STAC mapping of a real instance) and unblocks viewer step-4 (layers panel driven by the catalog) + the duck-typed `incidents.json` projection. ### Target shape (built in THIS BEAD's `artifacts/stac/`, then OFFERED — never written into `incidents/**` from a bead) ``` artifacts/stac/ ├── catalog.json # root: the incidents index ├── 2025Palisades/ │ ├── catalog.json # incident catalog │ ├── fmv/collection.json + items/ # N57B ×3 + N328SF clips (video+klv+thumb assets) │ ├── perimeters/collection.json + … # 5 time-stamped KMLs (770→15,832 acres) │ ├── imagery-irhs/collection.json + … # 13 IR/HS KMZ overlays │ ├── cameras/collection.json + … # alertwildfire cameras (live Items: lat/lon+az = rung-1/2 pose) │ └── (later: tracks/, gis/, splat/) └── 2026SandyFire/ ├── catalog.json ├── fmv/… # N42Z ×5 (simtable.acequia.io/incidents/CA-VNC-SANDY*) └── cameras/… # alertwildfire near CA-VNC, 2026-05-18..21 — TO HUNT ``` Asset `href`s point at the existing durable URLs (`guerin.acequia.io/incidents/2025Palisades/…`, `simtable.acequia.io/incidents/…`) — the catalog *reads* the namespace, it doesn't move data. ### Work packages (parallelizable; each = one background agent run; outputs land in `artifacts/stac-inputs/`) | WP | Task | Inputs | Deliverable | Verification | |---|---|---|---|---| | **A** | Palisades product inventory | local `guerin.acequia.io/incidents/2025Palisades/` | structured JSON: every FMV clip (+KLV roll-up: tStart/tEnd/frames/sensor/footprint-bbox), perimeter (t, acres), IR/HS pair (t, bbox) | counts match the 119-file archive; times parse; bboxes sane | | **B** | Sandy product inventory | local `simtable.acequia.io/incidents/CA-VNC-SANDY*` | same structure for the 5 N42Z clips (+ anything else in those folders) | all 5 clips from viewer-3d incidents.json found + KLV times match its startUTC/durations | | **C** | alertwildfire cameras, both incidents | Palisades `alertwildfire/*.json` (watchduty cache) local; Sandy = hunt (local first, then web alertca/alertwildfire APIs for Ventura Co.) | per-incident camera list: id, name, lat/lon, az/heading if present, stream/still URL, provenance | Palisades: cameras geographically near the fire bbox; Sandy: documented hunt result (even if negative) | | **D** | STAC skeleton + Item writer | WP A–C outputs + STAC spec | the `artifacts/stac/` tree above, valid STAC 1.0 JSON; FMV Items carry a minimal `fmv-pose` ext stub pointing at the KLV asset | validates against STAC schema (pystac/ajv); every Item has geometry+datetime+≥1 asset | | **E** | Viewer projection (duck-type check) | the built catalog | generated `incidents.json` (current viewer-3d dialect) FROM the STAC — proves projection-not-copy | byte-equivalent semantics vs the hand-written incidents.json for the 8 FMV clips | Order: A, B, C run **in parallel now** (read-only inventories). D needs A+B+C. E needs D. D/E are sequential follow-on sessions (or dashboard Run steps). ### Decisions needed from Stephen (parked in `decisions.md`) 1. **Home of record for the offered catalog** — propose `simtable.acequia.io/incidents/stac/` (beside the incident data; cataloging-incident's namespace). Alternative: per-incident `…/2025Palisades/stac/`. Until decided, everything stays in this bead's `artifacts/`. 2. **fmv-pose extension shape** — defer full schema to `#catalog`'s deliverable 2; WP-D ships a stub (`"fmv:telemetry": <klv asset key>`). 3. Sandy alertwildfire: if no archived camera data exists for the 2026-05-18 window, do we accept *current* camera poses (cameras don't move) with a provenance note? (Proposed: yes.) ### Later epics (named, not planned here) - **Epic 2** = viewer loads the STAC (incident picker + layers panel + timeline lanes = notes 03/04). - **Epic 3 — LIVE CAMERAS** (moved up by Stephen 2026-06-12; NOT yet researched): STACs of `acequia.io/geoCamera` and `cameraMap` — the **standing camera catalogs**: geo.camera devices + the cameraMap registry as live STAC collections (cameras as persistent posed sensor-Items with dynamic assets — `latest`/`stream`/`capabilities`/PTZ `actions/` role-gated — not per-incident snapshots). Incidents then *mount/query* them by bbox∩time instead of baking camera lists; live shares hold the query, archived shares crystallize the Item-set (note 08). Ground in the geo.camera bead/docs before planning steps. - **Epic 4** = catalog-manager dual surface (notes 04). - **Epic 5** = pose-ux-ui rungs (calibrated camera/photo Items enter the same Collections).

## References (bead cross-links) - Bead: Devops · [canonical](https://redfish.acequia.io/guerin/.agents/64be6d29-d133-4ade-9dce-f62701003e37/) - Bead: Storm Events Build · [canonical](https://redfish.acequia.io/guerin/.agents/1c0f5851-d7f5-4ac4-846a-09b71feb82dc/) - Bead: Agents Dashboard · [canonical](https://redfish.acequia.io/guerin/.agents/45761f53-0f16-4bba-87db-d7edb3a25d0c/) - Bead: Catalog · [canonical](https://redfish.acequia.io/guerin/.agents/90f902e0-2e45-4aa1-b998-918ca3688e94/)