**Note** from Bead: Firewatch Camera Grid · [canonical source](https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/2026-06-13/notes/09-handoff.md) · session 2026-06-13 · discussion: Talk: Firewatch Camera Grid
Written 2026-06-13 before a context compression. Picks up the #firewatch-camera-grid thread.
## Identity + read order - **Bead:** `firewatch-camera-grid` GUID **65783732-7907-4a36-983a-3b015e75e80b** — the session write target. Local origin `sites/redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/`, canonical `https://redfish.acequia.io/guerin/.agents/65783732-…/`. - **Read order:** `about.md` → this handoff → notes `00`–`08` → `WORK-QUEUE.md` → `2026-06-13/artifacts/plan-*.md` → `chats/2026-06-13-firewatch-camera-grid-start.md` (verbatim log). - **Mounted-for-read:** #incident-viewer-taos-engine-app (`cbf8b027`, birth-parent — the 3D viewer + STAC), #wildfire-imagery-acquisition (`b3461c66`), #catalog (`90f902e0`).
## What is LIVE (shipped + deployed) - **Camera wall** at **https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/app/** — fork of santafe.live's "Image Cache Manager" → 10 Sandy AlertWildfire cameras as tiles; **scrubbing the timeline swaps every tile to its frame nearest the playhead** (verified night→day), live from qualified `simtable.acequia.io` URLs (RTE remote-first, no co-location); 2D Leaflet map with 10 markers. Repo = git **in the bead at `repo/`** (commits 2e1422d S1, ad6a2d1 S3b). Deploy = `repo/deploy.sh` (bearer PUT to `…/app/`). `window.__wall` debug handle (seek/extent/live). - Steps done: S1 (fork+deploy), S2 (`skills/derive-alertwildfire-sidecars` — telemetry→pose/time sidecars, convention-verified), S3a (`repo/cameras-sandy.json` 10-cam manifest), S3b (the wall).
## IN-FLIGHT — RESOLVED - The 05-19 full-day re-filter completed → `artifacts/adsb-sandy-0519-fullday/summary.json` (1302 aircraft in bbox all day). **N42Z / VNC is NOT present** → the Sandy MISB sensor was **not broadcasting ADS-B** on 05-19 (expected for ISR platforms). The full-day pull DID surface lots of military (B767 tanker ROMA31, C-130s incl. low ones possibly MAFFS, E-2s, C-27J, C-5M RCH2140, V-22 NTRDR21, US-Army GLEX AXEL21) + news heli N925TV (3449 pts). **Conclusion: ADS-B gives news/fire/military traffic, NOT the FMV sensor platforms.** For N328SF (no pose) ADS-B likely won't help either → use SfM/landmark pose recovery (note 07).
## Data assets (large media externalized — NOT in the bead) - `C:\Users\steph\Downloads\news-copter-sandy-1627099769423766.mp4` — ABC7 "Sandy Fire" copter footage, 720p/59:08, stream start **2026-05-19T13:05:45Z** (+ `.info.json`). This is **N828AP / Helinet Aviation AS350**'s footage (the camera ship; see note 08). - `C:\Users\steph\Downloads\adsblol-2026-05-19\part.a{a,b}` — 3.37 GB raw adsb.lol day (scratch, re-downloadable; safe to delete). - `artifacts/adsb-sandy/` — filtered ADS-B subset (261 aircraft in bbox 12–16Z): `summary.json` + per-aircraft `adsb-<icao>.json` tracks (KEEPERS, small).
## Design notes map (02–08, in the bead) - **02** camera-wall × time model; frame-sets/image-sets; STAC bind-to-URI = access/authz; **RTE remote-first ⇒ qualified URLs**. - **03** active-cataloger (AI composes extractors, edge-executed, reified as skills) vs passive catalog mgmt. - **04** viz affordances (post-"detection-is-not-the-problem"): measure / retrieve / verify. - **05** calibration→measurement→plume pipeline; **FOV(zoom) 0–40→62.5°…2.5°**; calibration via city-light/ridgeline render-and-compare + citizen star-finding (no plate-solver); annotation→GIS; **ADS-B source strategy (adsb.lol primary free/open/host, FR24 paid fallback)**; news-copter source. - **06** service-worker frame cache (supersede simtable `no-cache`; Acequia-CDN). Queued as S4-cache. - **07** aerial pose-estimation methods (feature-match-to-tiles+PnP, render-and-compare/MI, known-sun shadow/hillshade, ridge/Fourier-Mellin, scene-coord-regression, SfM+Sim(3)-to-ADS-B). - **08** adsb.lol Sandy result: **camera ship = N828AP/Helinet** (3,400 ft @ 13:17:57Z exact match, de-blurred FR24's N/A); fire 1255 = N429DF OV-10 air-attack, T73 S-2 tanker, N261CG S-61; military LOST42 C-12, UH-60.
## The 3 MISB "sensor flights" (Stephen's open question) We have FMV video for 3 sensor aircraft; ADS-B not yet pulled at their times: - **N57B** (Palisades, KLV pose) — 2025-01-07/08. - **N328SF** (Palisades, **pose=none** ← ADS-B is the ONLY pose source = highest value) — 2025-01-09. - **N42Z** (Sandy, KLV pose) — clips 05-18 18:13 & 22:20Z, 05-19 02:19 & 11:33Z, 05-20 23:09Z. None fell in the 05-19 12–16Z pull. To get them: `pull-adsblol-history.py` on `globe_history_2025` v2025.01.07/.08/.09 + `globe_history_2026` v2026.05.18, full-day + incident bbox. **Caveat:** ISR platforms often don't transmit ADS-B — may come back empty (we have KLV for N57B+N42Z regardless). Stephen leaning toward pulling **N328SF/2025-01-09 first**.
## SHIPPED into the incident-viewer (cross-bead, 2026-06-13) - **AIR7** live in the viewer (`Documents/src/incident-viewer/`, commit `f803621`, deployed to `redfish…/apps/incident-viewer/`, chunk uYZKXpM6): N828AP/Helinet orbit (`air7-track.json` from `adsb-ab4ea1.json`, alt ft→m) → magenta path + master-clock marker, Sandy-only, ECEF-delta, sensor-lock-hidden. `__misb.air7()`. Live-verified. The feature lives just after `tracksFeature` in index.ts. - **AWF camera billboards — DONE (live).** Enriched the 9 Sandy camera STAC items at `simtable.acequia.io/incidents/stac/2026SandyFire/cameras/items/` (additive: `timelapse:frames_base` + 2 `timelapse-telemetry-*` assets each, from `repo/cameras-sandy.json`, mirroring 15801) → the deployed viewer's `camFramesFeature` now renders **all 10** posed timelapse billboards (verified live: `__misb.camFrames()` = 10 cards, 499–672 frames each), scrubbing with the master clock — alongside the markers+az-wedges already present. **Zero viewer code change** (pure catalog enrichment). Plus AIR7 (above). Shot: `artifacts/viewer-awf-cams-and-air7.png`.
## Queued (WORK-QUEUE + plans) - **plan-cameras-into-incident-viewer.md** = the big one: bring the 10 cams (+ news copter, posed via ADS-B+SfM) into the incident-viewer's TaosEngine 3D → posed billboards/projectors → frame-diff saliency → **dual-airbrush space carving** (maker in silhouette / eraser in inverse) = "cloud sculpting". Cross-bead: ships land in the incident-viewer repo (`Documents/src/incident-viewer/`) + bead `cbf8b027`. - S3c (map az-wedges + co-located-pair fan), S4-cache (SW), S4–S8 (scrub polish, grid⇄geo morph, 3D, bound-select→STAC+authz, COP augmentation), calibration sidecars, measurement (ROS, annotation→GIS, plume fluid-fit/3DGS).
## Credentials / sources - **adsb.lol = free, no key, working** (the `pull-adsblol-history` skill). Primary. - **FR24** = paid fallback; if used, Stephen provides token → `.credentials/flightradar24-api-token.txt` (+ manifest); spec at `artifacts/Flightradar24-API.yaml` (auth `Bearer`+`Accept-Version: v1`; `/api/historic/flight-positions` + `/api/flight-tracks`; filters Bounds/Squawks/Categories[M=mil]). Sandy=25 days ago → FR24 Explorer $9/30-day reaches it only ~5 more days; else Essential $90/2-yr. - Deploy bearer = `.credentials/redfish-acequia-jwt.txt`.
## Conventions / gotchas - **Sync the bead** at end of any turn that advanced it (background `webdav-sync.js` per `.ai/skills/bead-sync`); MKCOL'd already (not first sync). - **Chat log incrementally, verbatim** user prompts (`chats/…`); it's the irreplaceable record. - **Qualified URLs everywhere** (RTE); never relative for data. - CDP harness for the viewer = `Documents/src/incident-viewer/tools/cdp-chrome.sh` + `cdp-shot.mjs`/`ev.mjs`. - **Windows python gotchas:** `python3` is Windows Python (not MSYS) → `/tmp` paths from bash don't resolve; write to a real path. Console is cp1252 → avoid non-ASCII in `print` (the `→` crashed once). `grep -v "platform independent"` to drop the python warning line. - Bead size policy: consenting-adults, but **externalize large media** (videos, the 3.37 GB ADS-B day) — keep only small filtered subsets/sidecars in the bead.