**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-epic-2-viewer.md) · session 2026-06-11 · discussion: Talk: Incident Viewer Taos Engine App
**Bead:** cbf8b027 · **Date:** 2026-06-12 · **Status:** active (V-batch V-1..V-4 running as background agent — prerequisite polish) **Method:** devops/epic-step (WORK-QUEUE-driven, background agents per step, CDP verification, deploy-per-step).
## Goal Today the viewer reads ONE duck-typed projection (FMV clips only). Epic 2 ends with the viewer consuming the **canonical STAC directly** — all collections (fmv, perimeters, imagery-irhs, cameras, later tracks), an **items roster** (the agent-card hybrid of note 11), **timeline lanes**, and the **window-as-filter** generalized — for both incidents, deep-linkable, slots capturing layer state. This is `#catalog`'s proving-ground deliverable ("step-4 driven by the catalog") fully landed.
## Steps (each: spec → deliverable → CDP verification → deploy → sign-off) - **E2-S1 — STAC client.** Replace the projection fetch with a direct catalog walk: root → incident catalogs → collections → items (static-tree link-following; the projection stays as offline fallback). In-memory typed item registry `{collection, id, geometry, datetime|range, assets, properties}` per incident. *Verify:* registry counts match the catalog (29 Palisades + 59 Sandy items + cameras). - **E2-S2 — Items roster (hybrid agent-cards).** Left panel, grouped by collection with counts; per-item row = eye-toggle (fast path) + name + time + status dot; select → inspector (the gear panel's image rows become the FMV item's inspector); selected FMV item = `currentClip` (drives transport + `h`). Per note 11: cards carry provenance + capability affordances; archival items are degenerate agents. *Verify:* toggling/selecting drives the scene; roster reflects window-filter dimming (V-2). - **E2-S3 — Perimeter layer.** STAC perimeter Items already carry real MultiPolygons (WP-F). Render as terrain-following line ribbons (buildTrackMesh pattern at `heightAt`+2 m, ECEF-anchored). **Fire progression semantics:** show perimeters with `datetime ≤ playhead`; the latest ≤ t brightest, older ones embered/dim. *Verify:* scrubbing Palisades 22:09→21:05 grows 770→15,832 acres on screen. - **E2-S4 — IR/HS imagery overlays.** Items with paired PNG assets render as draped textured quads at their bbox (Texture from fetched image, transparent material, ECEF-anchored quad); KMZ-only items deferred (need unzip — note it on the card). Honor window-filter + opacity slider per item. *Verify:* Jan-9 N328SF IR frames appear at their footprints at the right times. - **E2-S5 — Timeline lanes.** Generalize the heat strip to one thin lane per visible collection (santafe.live `tlBuildDots` lane-packing): FMV = coverage/density (as now), perimeters = instant markers, imagery = dots, cameras = standing (no lane). V-3's 10px minimum applies to all marks. Click any mark = select that item (+ seek for timed items). *Verify:* lane marks match registry counts; clicking a perimeter mark selects + seeks. - **E2-S6 — LIVE + active-incident flag.** Incident catalogs gain `redfish:active` (catalog-side change, offered); LIVE button enables only for active incidents; wiring to `acequia.io/remote-camera.html` lands with Epic 3 cameras (stub remains otherwise). *Verify:* button state follows the flag. - **E2-S7 — View schema v2.** Slots + `?v=` capture the layer state: per-collection visibility + per-item overrides + selected item (schema versioned `v:2`, v1 links still apply with defaults). The animatable view-*track* (camera path + vis/z keyframes) is designed-but-deferred to the cinematography step. *Verify:* deep-link round-trip restores layer set. - **E2-S8 — Roster→agent bridge (exit to Epic 3).** Camera cards gain status dots + `latest` thumbnail on hover (still static archive); the roster card schema is exactly what Epic 3's live camera-agents will animate. *Verify:* cosmetic; sets the seam.
## Order + parallelism S1 → S2 → (S3 ∥ S4 ∥ S5 — separate render features + timeline, but same file: run sequential background agents per the V-batch pattern) → S6/S7 (small) → S8. Each step is one background-agent run with build+CDP+deploy, journaled in `log.md`; WORK-QUEUE rows added at S1 kickoff.
## Inputs already in place Bound catalog (149 geometry-enriched Items) · viewer-3d projection (fallback) · faststarted media · tracks/cap render-feature patterns + ECEF-delta model discipline · window-as-filter (V-2) · cameras prefetched by V-4 · gesture/picker/slots UX.
## Out of scope (parked) Sandy↔Palisades cross-incident master timeline (one incident at a time stands); splat/GIS/CAL-FIRE-PDF layers; the globe heat-map texture (note 09 — pairs with S3/S5 data but is its own step); catalog-manager dual surface (Epic 4); editing/phone intake (post-Epic-3).