bead-bind-startup — firewatch-camera-grid (Firewatch Camera Grid)

**Bead document** from Bead: Firewatch Camera Grid · [canonical source](https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/bead-bind-startup.md) · discussion: Talk: Firewatch Camera Grid

**DO THIS FIRST (binder/resume contract):** you are picking up the #firewatch-camera-grid thread. Read this file, then **[`2026-06-14/notes/10-handoff-2026-06-14.md`](2026-06-14/notes/10-handoff-2026-06-14.md) — the CURRENT handoff**; note 09 (2026-06-13) is the camera-wall/adsb history. Write target = this bead (`65783732-7907-4a36-983a-3b015e75e80b`); also mount #incident-viewer-taos-engine-app (`cbf8b027`, 3D-viewer ships), **#stac-camera-telemetry (`31f69717`, AIR7 telemetry collab — local-only bead)**, **#taos-engine (`c66cbd1d`, the taos-orama query index)**.

## De-novo resume prompt (paste into a fresh chat) — updated 2026-06-14 > Mount #firewatch-camera-grid (write target) + #incident-viewer (`cbf8b027`) + #stac-camera-telemetry (`31f69717`) + #taos-engine (`c66cbd1d`). Read this bead's `bead-bind-startup.md` then `2026-06-14/notes/10-handoff-2026-06-14.md` FIRST. THE THING = the **incident-viewer 3D STAC viewer** (`Documents/src/incident-viewer`, local git no remote; `npm run build` → dist; deploy = WebDAV PUT chunk+index.html + DELETE old chunk to BOTH `redfish.acequia.io/guerin/apps/incident-viewer/` AND `santafe.live/`; current chunk `Dw0d792j` / commit `44d6487`). Maps are token-free (AWS Terrarium DEM + Esri imagery); NO service worker. CDP-verify PIXELS (`tools/cdp-shot.mjs`/`ev.mjs`, serve dist :8123, `?cb=$RANDOM`). NEXT = camera-follow the AIR7 track (soft node — closes 31f69717's GO) → adaptive billboard sizing (subsumes close-range look-through) → editable Properties panel. Query the engine API via the **taos-orama** skill (`c66cbd1d/2026-06-14/skills/taos-orama`). The 2D camera wall (separate app) is at `…/65783732…/app/`. Every ship = commit (Co-Authored-By Claude) + deploy BOTH + CDP **pixel** verify + log line; chat log incrementally; `/bead-close-chat` + `/bead-sync` at end.

## GOALS 1. **Firewatch catalog manager** (the bead's build): fork of santafe.live → grid ⇄ geospatial morph, time-scrub, bound-select → STAC. Camera **wall × time** is the primitive (tile = camera, scrub swaps to nearest frame). Live (S1–S3b). [STATE.md](STATE.md) · [WORK-QUEUE.md](WORK-QUEUE.md) · [plan-firewatch-manager](2026-06-13/artifacts/plan-firewatch-manager.md). 2. **Cameras → incident-viewer 3D → "cloud sculpting"** (the big one): posed billboards/projectors → frame-diff saliency → **dual-airbrush space carving** (maker in silhouette / eraser in inverse). [plan-cameras-into-incident-viewer](2026-06-13/artifacts/plan-cameras-into-incident-viewer.md) · model in [note 02](2026-06-13/notes/02-camera-wall-framesets-and-uri-authz.md). 3. **Calibration → measurement** (the value, post-"detection is not the problem"): pose calibration (city-light/ridgeline render-and-compare + citizen star-finding; FOV(zoom) 0–40→62.5°…2.5°) → surface ROS, **annotation→GIS** (draw point/line/polygon/raster on a calibrated frame → georeferenced), 3D plume (fluid-fit / 3DGS). [notes 05](2026-06-13/notes/05-calibration-and-measurement-pipeline.md)/[07](2026-06-13/notes/07-aerial-pose-estimation-methods.md). 4. **Active cataloger** (how): AI composes extractors, edge-executed, **reified as skills** (e.g. [pull-adsblol-history](2026-06-13/skills/pull-adsblol-history.md), [derive-alertwildfire-sidecars](2026-06-13/skills/derive-alertwildfire-sidecars.md)) — vs passive catalog mgmt. [note 03](2026-06-13/notes/03-active-cataloger-vs-catalog-management.md). 5. **Ultimate:** catalog = the substrate; managing it = managing access/authz pathways via **STAC bind-to-URI** (acequia). [note 02 §3].

## CONSTRAINTS / invariants - **RTE remote-first: qualified absolute URLs, never relative for data**; don't co-locate large media (externalize videos / the 3.37 GB ADS-B day; keep small subsets/sidecars only). [note 02 §4] - **Detection is NOT the problem** (amateur framing) — value is measure / retrieve / verify. [note 04] - **MISB sensor flights (N57B/N328SF/N42Z) are NOT in ADS-B** (ISR not transmitting); ADS-B = news/fire/military only. N328SF has no pose → needs SfM/landmark, not ADS-B. [note 08] - **ADS-B source = adsb.lol open archive** (free, unfiltered, self-hostable; `globe_history_<YEAR>`); FR24 = paid fallback (token → `.credentials/flightradar24-api-token.txt`). [note 05] - **Verify PIXELS, not just counts** — features can push/build geometry yet not be visible (camera-marker + the "live but off-screen" episodes). Always screenshot. - **Ship discipline:** commit (Co-Authored-By Claude) + deploy + CDP verify + one log.md line; chat log verbatim+incremental; bead synced at end. Git-in-bead at `repo/` for firewatch; the incident-viewer repo is `Documents/src/incident-viewer` (vendor-coupled, NOT in a bead) → its ships log to `cbf8b027`. - **Windows gotchas:** `python3` is Windows Python (MSYS `/tmp` won't resolve; write real paths); console cp1252 (keep prints ASCII); `grep -v "platform independent"`. - Deploy bearer `.credentials/redfish-acequia-jwt.txt`; simtable STAC writes use `.credentials/simtable-webdav-token.txt` (additive enrichment only, user-authorized).

## TODOS (linked, next actions) - [x] **Roster select → current item** (DONE 2026-06-13, incident-viewer `6afbad4`, chunk `BYwoFvin`): `selectItem` generalized — any non-FMV row sets `selectedTarget` (item centroid), recenters the timeline (cameras exempt), and flies the map camera to it; `H`=`focusSelected` re-flies / FMV sensor-lock. Verified (camera/perimeter/FMV). - [x] **Default Sandy view framing** (DONE 2026-06-13, incident-viewer `c24b3f5`): `fitAll` bounding-sphere overview (footprint + AWF cameras + AIR7); Sandy switch defers one auto-fit until data loads (user-cancellable); ⛶ button + `G` key. Verified 30/30 cameras in-frame, AIR7 in the fit. - [ ] **Follow-up (small):** move `Documents/src/incident-viewer/air7-track.json` into `public/` so a clean `dist` rebuild+redeploy carries it (today it's repo-root + a manual server PUT only). - [ ] **Cloud-sculpting Phase A→D** (plan-cameras-into-incident-viewer): projectors, frame-diff saliency, dual-airbrush carve, vantage UX. - [ ] **Calibration sidecars** (note 05 §1) — gates measurement; then ROS, annotation→GIS, plume. - [ ] **S3c** map az-wedges + co-located-pair fan (firewatch wall); **S4-cache** service-worker frame cache (note 06, supersede simtable `no-cache`); S4–S8 (scrub polish, grid⇄geo morph, 3D, bound-select→STAC+authz, COP augmentation). - [ ] Optional: sensor-day ADS-B pulls (N328SF 2025-01-09 etc.) — caveat likely no ADS-B (note 08).

## DONE (this session) — see [note 09](2026-06-13/notes/09-handoff.md) + logs Camera wall (S1–S3b) live; adsb.lol pipeline + skill (found camera ship **N828AP/Helinet**, fire 1255 + military); **AIR7** orbit in the incident-viewer (commit `f803621`); **AWF 10 cams → posed billboards** in the viewer (STAC enrichment, zero code). Both deployed + verified.