**Bead document** from Bead: Firewatch Camera Grid · [canonical source](https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/log.md) · discussion: Talk: Firewatch Camera Grid
- 2026-06-13 [session-agent] Bead hatched; surveyed santafe.live (fork target) + AlertWildfire telemetry + the santafe↔ArcGIS-Oriented-Imagery↔telemetry schema; captured sidecar recommendation + interface vision + reference scan (notes 00/01) + epic-step plan + WORK-QUEUE. Decisions locked (Stephen): bead-served `…/app/`, TaosEngine 3D, sidecars source-of-truth, Sandy first, copy-and-adapt fork. - 2026-06-13 [session-agent] **S1 DONE** (`repo/` commit `2e1422d`, deployed): forked santafe.live static app into the bead `repo/` (index.html/index.js/timeline.js/styles.css/jsconfig + generateThumbnail.js + .serve.mjs; minus santafe's photo data dirs), rebranded "Firewatch Camera Grid", git-init'd. Wrote `repo/deploy.sh` (bearer PUT to the app face) + `.acequia-access.json` (anon read). Deployed to `https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/app/` (MKCOL + 8×201). CDP-verified: renders timeline + grid ("No images loaded") + Leaflet map + notes, 0 console errors, anon 200. Proves the bead-served git→deploy→CDP devops loop. Defaults still santafe (timeline 1850–2000, map=Santa Fe) → retarget to Sandy in S3. - 2026-06-13 [session-agent] **S2 DONE**: wrote `skills/derive-alertwildfire-sidecars.{mjs,md}` (dep-free Node) — reads a cam's `telemetry-*.json` + the cam's STAC Point (telemetry has no lat/lon), dedupes by `camScreenshot`, emits per-frame pose+time records into a consolidated `frames-<camId>.json` (STAC-ItemCollection-shaped = sidecars-in-one-fetch; `--split` for santafe per-image files). Pose: heading=camAzimuth (CW from N), pitch=camElevation (+up), fov=camViewWidth; id=sha256(url)[:16] (santafe-compatible). Ran on 15801 → `artifacts/sidecars/frames-15801.json`: 719 raw→666 unique, 2026-05-18T07:35→05-19T20:50Z, az 78.4–121.4°. CONVENTION VERIFIED: 666/666 URLs resolve to real jpgs, 666/666 ids match santafe sha256, and heading CW-from-N confirmed geometrically (cam→fire bearing 110.7° lies inside the 78.4–121.4° pan range). Bundle kept bead-local (offered); S3 wires the manager's data layer to it + retargets timeline/map to Sandy. - 2026-06-13 [session-agent] **MODEL CORRECTED** (Stephen): the grid is a WALL OF CAMERAS scrubbed by time (tile=camera, scrub→nearest frame), not one camera's frames; cameras + frame-set/image-set collections are first-class (phones → front/back multi-sensor image-sets); STAC bind-to-URI establishes access/authz pathways; RTE remote-first ⇒ qualified URLs, never relative (no local co-location). Captured in notes 02 + chat log. Also corrected my local-mirror blindspot: the ONLINE dir has **10 cameras** with telemetry+frames (not 1); positions from STAC (SoCal), not getCameraDataByLoc.locs (Oregon id collision); co-located pairs Castro Peak 1886/1887 + Topanga Peak 2763/2764. - 2026-06-13 [session-agent] **S3a DONE**: built the wall's thin online index `repo/cameras-sandy.json` — 10 Sandy cams {id,name,lon,lat,az, qualified framesBase + telemetryUrls, co-located sites}. Next S3b: wall UI (tiles fetch telemetry live + lazy frames + scrub; timeline to extent), S3c map markers+wedges. - 2026-06-13 [session-agent] Captured **note 03 — active cataloger vs (boring) catalog management** (Stephen): AI evaluates partially-structured sources + composes extraction scripts, executed edge-side (browser/OS, not cloud) against qualified remote URLs, then reifies repeatable workflows as skills; vs STAC Browser = passive cursor. The S2 derive skill is already an instance. - 2026-06-13 [session-agent] **S3b DONE** (`repo/` `ad6a2d1`, deployed `…/app/`): CAMERA WALL scrubbed by time, off the ONLINE source. index.js rewritten to the camera-wall model — loads `cameras-sandy.json`, fetches each of the 10 cams' telemetry LIVE (qualified simtable URLs), builds per-camera frame indices (665/666/664/499… frames), renders 10 tiles; scrubbing the UTC timeline swaps every tile to its frame nearest the playhead (lazy pixel fetch + browser cache; RTE remote-first, no co-location). Custom UTC scrubber on the canvas (santafe timeline.js is year-locked) = per-cam frame-density lanes + hour/6h ticks + draggable playhead, zoomed to the union extent (2026-05-18T07:23→05-19T20:51Z); 10 Leaflet markers. CDP-verified: 10 cams loaded, scrub night→day swaps all tiles (`__wall.live()`=10), 0 exceptions; shots s3b-wall-{start,daytime,noon}.png. Next S3c: az wedges on the map (+ co-located-pair handling). - 2026-06-13 [session-agent] **Roster select → focus DONE** (incident-viewer `Documents/src/incident-viewer` commit `6afbad4`, deployed chunk `Dd_uZGp6`, ship logs to `cbf8b027`): generalized `selectItem` so ANY catalog row (camera/perimeter/imagery/progression), not just FMV, becomes the current focus — computes the item centroid (bbox center / averaged geometry → `selectedTarget`), recenters the timeline to its time (cameras exempt — standing items), and flies the map camera to its overview (`camFlyToGeo`, mirrors `camFlyToFootprint`). `H` (`focusSelected`) now re-flies to the selected item, or rides the FMV sensor pose when an FMV clip is current. Exposes `__misb.selectedTarget`/`sensorLock`. CDP pixel-verified (local dist = deployed bytes): camera select → `selectedTarget={-118.5788,34.1238}` + fly (Topanga marker framed); perimeter select → timeline recentered to Sandy `2026-05-19` + perimeter polygon framed; FMV select → `selectedTarget=null` + clip switch. Live: index.html→new chunk (200, has `selectedTarget`), old chunk 404. Fixes Stephen's flagged gap ("selecting a camera/perimeter/imagery row only highlights it"). - 2026-06-13 [session-agent] **Default Sandy framing (fit-all) DONE** (incident-viewer commit `c24b3f5`, deployed chunk `BYwoFvin`, logs to `cbf8b027`): the AWF billboards + AIR7 orbit rendered but sat OFF-SCREEN from the FMV-footprint default view. Added `gatherIncidentEcef` (footprint center + every visible AWF camera anchor + the AIR7 orbit, Sandy) + `frameEcefPoints` (bounding-sphere overview fit to the 60° vfov × 1.3 margin, slight north tilt) + `fitAll`. Switching to Sandy now **defers one auto-fit** until the async cameras (+ AIR7, ≤3 s grace) land — cancelled if the user takes the camera first (`userCamInput`, set by canvas pointerdown / WASD-arrow keys, re-armed per `switchIncident`). Plus a **Fit-all control**: ⛶ topbar button + `G` key (help text updated). `__misb.fitAll`/`fitPoints` exposed. CDP pixel + projection verified (local dist = deployed bytes, air7-track.json served locally for the check): after the Sandy auto-fit, **30/30 cameras project inside the viewport** (was off-screen), `fitPoints=76` with AIR7 loaded (1687 pts, marker @13:17Z), screenshot `tools/_e3-sandy-autofit-air7.png` = wide overview framing the whole camera spread + fire. Live: index→`BYwoFvin` (200, has `fitAll`/`sandyFitPending`), old `Dd_uZGp6` 404, server `air7-track.json` 200 (deployed auto-fit includes AIR7). NOTE: `air7-track.json` lives at the incident-viewer repo ROOT + the server (manual PUT from the AIR7 ship), NOT in `public/` — a clean `dist` redeploy wouldn't carry it; consider moving it into `public/` for reproducibility (follow-up). - 2026-06-13 [session-agent] **Bead-version stamp DONE** (incident-viewer `85b6151`, chunk `DtKUzCak`, logs to `cbf8b027`): gear settings footer shows `incident-viewer · <commit> · <date> · bead cbf8b027 ↗` (link to the viewer's source bead). Build-time `__BUILD__` injected by `vite.config.ts` define (git short-commit + date from THIS repo; `-uno` dirty check so scratch doesn't false-flag; `*`=dirty tracked source). `__misb.build`. CDP gear-footer pixel-verified + deployed live (old `BYwoFvin` 404). Answers Stephen's "keep a reference to the bead-version in the gear settings." (Also confirmed: AIR7 already live — server `air7-track.json` 200 + air7Feature in-chunk; not re-deployed this session.) - 2026-06-13 [session-agent] **Camera look-through DONE** (incident-viewer `cd83812`, chunk `B8mznYAN`, logs to `cbf8b027`): Stephen reported H on a selected camera zoomed ABOVE looking down, not through the image. Fixed: H on a camera now stands AT the camera (DEM +12 m) and aims down its azimuth at terrain 6 km out (bearing + `geo.heightAt`) — the camera analog of FMV sensor-lock. az = nearest-frame az (`cameraAzNow`) → matches the billboard, fallback `view:azimuth`; `selectedTarget` carries `camId`+`az`; select still overviews (locate), H looks through. CDP-verified Las Virgenes: overview pitch 80°/eye −4982 m → through pitch ~1°/eye −435 m, billboard+wedge framed. Deployed live (old `DtKUzCak` 404). - 2026-06-13 [session-agent] **Default Sandy view = fit-all + AIR7 prefetch DONE** (incident-viewer commit `b4ddd1c`, deployed chunk `C50Gh_Jo`, ship→`cbf8b027`). NOTE: a PARALLEL session converged on the same two TODOs — by the time I committed, HEAD already held its equivalents (`6afbad4` roster-focus, `c24b3f5` fit-all, `85b6151` gear-stamp, `cd83812` H="look THROUGH the camera"), and the live app (chunk `B8mznYAN`) was already its deploy. My work merged cleanly (`git diff cd83812..b4ddd1c` = **one line**): `switchIncident` now `void loadAir7()` on Sandy so the orbit prefetches in parallel with the cross-origin camera telemetry and the deferred auto-fit reliably includes it (else air7 can land after the ~3 s grace and be missed). Verified on the deployed bytes (local dist :8123, air7-track.json staged): switch→Sandy auto-fits **30/30 cameras + the AIR7 orbit on screen** (NDC-projected, all in-viewport; `fitPoints`=76 = footprint+10 cams+~65 air7 samples); look-through H stands at the Topanga cam looking SW down az 212° with the cam's own frame inset (`_e3-lookthrough.png`). Live: index→`C50Gh_Jo` (200, has camFlyThrough+fitAll), old `B8mznYAN` 404, air7-track.json 200. The earlier solo TODO-1 deploy (`Dd_uZGp6`, my "fly-to-overview" H) is superseded by the parallel session's richer look-through design — no conflict, HEAD is unified. - 2026-06-13 [session-agent] **Open-any-STAC + generic events + all-off/persist DONE** (incident-viewer commit `33ffb45`, deployed chunk `BbHZ1vGR`, ship→`cbf8b027`). The "incident → event" generalization Stephen asked for: (1) **`?stac=` / `?catalog=`** overrides the baked catalog root with any qualified `catalog.json` URL → the open-URI seam. (2) **walkStac is shape-flexible** — classifies each root child by doc type, so a MULTI catalog (children = sub-catalogs = incidents/events) AND a SINGLE catalog (children = collections → the root itself is the event) both load (clouds = the single shape: root→collection→items, posed iPhone stills with `msb:` pose). (3) **Non-FMV events tolerated** — kept in the incident list, currentClip never indexes `clips[0]` when empty (stays valid+inert via window/coverage guards), timeline span from item datetimes (`itemsSpanBounds`), clock parked there + item centroids framed (`gatherEventItemEcef`), FMV-footprint auto-aim skipped. (4) **Startup all items OFF**; visible-item whitelist saved to `localStorage` keyed by catalog URL + restored next visit (per-catalog; new items default off). CDP-verified on deployed bytes: default catalog (Palisades+Sandy) unchanged + `[vis] 0/150 all-off` + toggle persists; a local 2-level generic event loads (registry={event:{coll:2}}), auto-selects, parks clock at `2026-06-13T18:05Z`, frames its NM location, persists+restores toggles — no FMV, no crash. **URI for Stephen:** `https://redfish.acequia.io/guerin/apps/incident-viewer/?stac=https://redfish.acequia.io/people/owen-duncan/events/clouds-2026-06-13/catalog.json` (real items have Point geom @ Santa Fe foothills + datetime → frames + clock OK; gated catalog resolves via ambient browser auth, same redfish origin). **NOT YET:** rendering the posed stills as 3D billboards (the next arc, mirrors the AWF-camera-billboard work) — they list+persist now but draw no geometry. **NOTE:** all-off-on-startup is GLOBAL (applies to the default catalog too); flagged to Stephen in case he wants it scoped to custom `?stac=` only. - 2026-06-13 [session-agent] **incident-viewer deployed to santafe.live + santafe STAC** (Stephen directive). (1) Built skill `skills/derive-stac-from-image-cache.mjs` (dep-free Node) — reads santafe's `imageMeta/<id>.json` + `imagePose/<id>.json` → SINGLE-event STAC (root catalog→one collection→item-per-image, the `?stac=` shape): geometry from Lat/Lon (11/59 geolocated), datetime from `calendarDate` year / `timeUTC` (7/59 dated), image asset = the in-place guerin URL + thumbnail = santafe.live/thumbnails. Emitted `santafe.live/stac/` (catalog + collection + 59 items; bbox Santa Fe, temporal 1895–2025). (2) **Renamed** remote+local `index.html`→`STAC-manager.html` (WebDAV MOVE 201; old Image Cache Manager still live there). (3) **Deployed the viewer as `santafe.live/index.html`** (+ `assets/index-BbHZ1vGR.js`). **CORS:** redfish `/taos` serves `Access-Control-Allow-Origin: *` so the engine loads cross-origin. **GOTCHA FOUND + FIXED:** `/sw.js` is a RESERVED acequia-platform path (serves the platform's own SW, overrode my PUT) → the viewer's token-adding SW never deployed → engine tile-workers couldn't authorize `/taos/assets/*` → no terrain. Fix: deploy the SW as **`iv-sw.js`** + hand-patch the deployed `index.html` to `register('./iv-sw.js')`. CDP-verified live (anon, as a public visitor): `https://santafe.live/?stac=https://santafe.live/stac/catalog.json` → title "Santa Fe Live", 59 items all-off, SW controller = iv-sw.js, **terrain renders** (Santa Fe foothills); `STAC-manager.html` still serves the manager. **DRIFT:** the canonical viewer (redfish, `Documents/src/incident-viewer`) still registers `./sw.js` — fine on redfish (not reserved) but breaks on acequia-platform origins; durable fix = rename the SW in the viewer repo (recommended to Stephen, not yet done). **NOT YET:** posed stills still don't draw as 3D billboards (roster lists + frames them). Also noted: index.ts line ~1835 calls `loadAir7()` unconditionally → benign caught 404 warning on non-Sandy events. Updated `santafe.live/CLAUDE.md` with the new layout. - 2026-06-13 [session-agent] **Camera look-through = real sensor-lock analog + 0-tilt image-plane model** (incident-viewer commit `bcdc3ca`, chunk `5Aynszvl`, deployed to BOTH redfish + santafe.live; ship→`cbf8b027`). Stephen reported: H into Las_Virgenes put the image in the TOP HALF + it ignored H/i/opacity + "didn't feel like the selected camera." Root cause: the parallel session's `camFlyThrough` was a ONE-SHOT fly aimed at terrain 6 km out, while the billboard floated 90 m up / 160 m forward → image landed high + the controls only touched the FMV projector. Fix: a held **`camLock`** state mirroring `sensorLock` in `tickCamera` (ease→hold the camera pose, re-anchor-safe) so the image plane FILLS the screen; while locked, **Image(i)** toggles the camera image, the **Opacity** slider fades it (wired into `camFramesFeature` for the locked card only), and **H toggles** the lock off. Per Stephen's directive, the rendering model (until the STAC-manager sets real heading/height-AGL-or-ellipsoid): each image = a **0-tilt vertical plane** facing its heading (the camera's known azimuth, else **north**), sized so width subtends a **default 50° hfov** (recommended + confirmed) with the image aspect; plane at 100 m / +30 m so terrain rarely occludes (200 m/+90 m got occluded by a rising ridge; 100/30 fills clean). CDP-verified on Sandy/Las_Virgenes: fills; i hides/shows; opacity→0 hides; H releases. NOTE: world-anchored plane can still occlude on extreme terrain — a view-locked cap (like the FMV cap) would be fully robust (future). The 50° hfov + heading are constants/fields ready for the STAC-manager to drive per-image. - 2026-06-14 [bg-agent] Wrote note 00-bead-duck-typing-stac (2026-06-14/notes/): synthesis of a bead duck-typing a STAC catalog + a git repo from one URI, binding to a supporting handler bead (agent-face). Design only. - 2026-06-14 [session-agent] **Dropped the service worker** (Stephen made `/taos` public). incident-viewer commit `34d9ec5`, chunk `JNJ9YOFp`, deployed to BOTH redfish + santafe; `index.html` now BYTE-IDENTICAL (no per-host `iv-sw.js` patch, no SW scope-collision). GOTCHA + recovery: removing the SW is correct (`/taos/assets/*` workers are public now, verified 200 anon), BUT I also dropped the `?token=` from the import map → terrain went BLANK (no console errors). Root cause: the engine reads `?token=` from `import.meta.url` as its **runtime tile-source key**, separate from the asset-auth the SW used to provide. Fix = keep the token on the bundle URL, drop only the SW. (Briefly deployed the broken no-token `B4YnQtdD` to both, then recovered.) CDP-verified token+no-SW: Sandy terrain renders crisply, `serviceWorker.controller === null`. NOTE: santafe.live's terrain still looks blurry — that PRE-DATES this change (santafe-specific framing/tile-timing for the generic-event fit), not the SW work; flagged to look at. Updated `santafe.live/CLAUDE.md`. - 2026-06-14 [session-agent] **Posed stills → cameras + look-through-shows-hidden fix** (incident-viewer commit `dbeb1b8`, chunk `DifXAiqH`, deployed both; ship→`cbf8b027`). Stephen: "not seeing the camera image on virgenes" → root cause = all-items-OFF default left the billboard hidden when you select+H; FIX = the item you're looking THROUGH (camLock or FMV sensor-lock) always renders, bypassing the roster-eye + (stills) the playhead time-gate. ALSO generalized ingestion: any STAC **point item with an image asset** (santafe photos, clouds iPhone stills, non-timelapse cameras) now becomes a single-frame "standing" CamCard → same 0-tilt/heading(view:azimuth else north)/50° billboard, selectable + H(look-through) + I(toggle); `itemIsCamera()` drives both ingest + `selectItem` camId. CDP-verified: H into a HIDDEN Sandy/Las_Virgenes cam now fills the screen (was the bug); santafe builds 11 still billboards. **ANSWERED Stephen's Q:** AWF images are shown as flat BILLBOARDS, they do NOT project onto terrain — only the FMV sensor video projects. **KNOWN LIMIT:** a world-anchored still plane can be occluded by terrain in the look-through when its heading faces rising ground (santafe stills default north into the Sangre de Cristo foothills → buried). **NEXT PHASE (Stephen's directive):** projection as a property of any posed image — and the view-locked image (occlusion-proof look-through) is the same machinery. Santafe terrain DOES load (heightAt≈3090 m at the foothills) — earlier "blur" was just slow DEM streaming for a fresh location. - 2026-06-14 [session-agent] **Projection as a property of any posed image** (incident-viewer commit `98d49cc`, chunk `_6yZ0IfP`, deployed both; ship→`cbf8b027`). Added a SECOND Projector (`camProjector`) that DRAPES the focused camera/still's image onto the terrain from its pose (position + heading + 50° fov, aimed down-heading at the DEM ~3 km out via great-circle+heightAt). **'P'** toggles it when a camera/still is selected (else the FMV world↔cap toggle); the flat billboard is replaced by the drape while projecting; texture loads even when the roster eye is off. Occlusion-PROOF (image is ON the terrain) → fixes the look-through burial the world-anchored plane hit on steep ground (santafe stills facing north into the foothills). CDP-verified: Las_Virgenes drapes onto the LA hills (look-through POV shows the smoke-plume image registered to the 3D terrain + an overview footprint); a santafe B&W photo drapes onto the Santa Fe terrain. `__misb.projectCam()` / `camProjState()`. NOTE: the 'Project onto' settings button still shows the FMV mode label (not camera-drape state) — cosmetic. Next: generalize beyond the single focused camera (multi-image drape / bake) + wire the gear UI. - 2026-06-14 [session-agent] **Same-origin default STAC** (incident-viewer commit `5a76e6a`, chunk `DPx44bcR`, deployed both). Stephen: santafe.live was loading the Redfish incidents instead of its own photos. Fix: default catalog (no `?stac=`) is now the SAME-ORIGIN `./stac/catalog.json`, with the simtable incident catalog as fallback when there's no same-origin one. So santafe.live → its photo STAC; the redfish incident-viewer → the incidents (fallback); `?stac=` still overrides; view-config key follows the resolved root. CDP-verified live: `https://santafe.live/` → `santafe-live (59)`. ALSO answered Stephen: the **10-AWF-cameras time-scrub app = the firewatch camera wall** at `https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/app/` (live, "Firewatch Camera Grid"; repo in bead `repo/`). - 2026-06-14 [session-agent] **Look-through fixes** (incident-viewer commit `9a4c982`, chunk `CDiqQsUS`, deployed both). Stephen deep-linked to Oat_Mtn_South_2 @22:49Z (≈2h after the Sandy frames end ~20:51Z) → saw only the green camera glyph, no image in H or P. (1) A timelapse camera with no frame within ±10min of the playhead was skipped entirely → fix = the camera you LOOK THROUGH or PROJECT shows its NEAREST frame regardless of the gate. (2) Hide the green camera glyph for the camera you're looking through. CDP-verified: H loads the nearest frame + glyph gone; P drapes it onto terrain. (Look-through BILLBOARD still occludes on steep ridges — world-anchored limit; P is the occlusion-proof view; view-locked look-through is the eventual fix.) **NEXT (Stephen's directive):** an ITEM PROPERTIES PANEL on selection — see/set intrinsic (hfov) + extrinsic (heading, pitch/tilt, height) estimates + opacity, live; later phases = CV models (change/plume/edge/ridge detection + matching across a camera's image set) + image-annotation UX. - 2026-06-14 [session-agent] **Catalog-driven track renderer SHIPPED** (incident-viewer commit `930e0bd`, chunk `DiH3QIaP`, deployed both) — the GO from stac-camera-telemetry `31f69717`. `catTrackFeature`: any registry item with an `adsb_track` asset / `forage:adsb.track_href` loads its posed track → path + master-clock marker, catalog-driven like the MISB tracks (supersedes the hardcoded `air7-track.json` for catalog items; Sandy's stays until it gets a news-aerial STAC item). Accepts both sidecar shapes (`points:t_ms,…,alt_m,…` + raw adsb `track:[{t_sec,…,alt_ft,…}]`; normalizes sec→ms, ft→m). Provenance: `recovered-prior` (from `forage:adsb.recovered`) draws dim/thin vs bright native. CDP-verified: **Palisades N828AP 1,127-pt orbit + moving marker render from the catalog**. Replied to 31f69717's dock with live URL + consume/ignore list; **needs back:** a Sandy news-aerial STAC item (to delete the hardcoded path) + the unified provenance/heading schema. NEXT: camera-follow (slave the eye to the track over the master clock — keep the prior a soft reweightable node per their least-action note), then the queued close-range look-through (view-locked) + item-properties panel. - 2026-06-14 [session-agent] **Version stamp + alertwest CORS fix** (incident-viewer commit `44d6487`, chunk `Dw0d792j`, deployed both). (1) Gear footer now shows the package **version (v0.1.0)** + commit + date. (2) **Answered Stephen's "why alertwest calls":** the non-timelapse camera STAC items carry a `latest` snapshot asset on `alertwest.live`, which the stills-as-cameras path was fetching (~20 cams) — and alertwest is **CORS-blocked (403 cross-origin)**, so they all failed + can't texture. Skipped `alertwest.live` image assets in `loadCamFrames` (stops the broken calls; those cams show as markers only). The 10 TIMELAPSE cameras use the CORS-OK simtable `frames_base` (`…/ops-alertcalifornia/<id>`) — unaffected, still render. QUEUED: an alertwest CORS proxy to re-enable the live snapshots. - 2026-06-14 [session-agent] **HANDOFF written for chat change** — context filling. New full-state handoff at [2026-06-14/notes/10-handoff-2026-06-14.md](2026-06-14/notes/10-handoff-2026-06-14.md); `bead-bind-startup.md` + `STATE.md` repointed to it (with an updated de-novo resume prompt + the mounts: cbf8b027 / 31f69717 / c66cbd1d). Captures: the incident-viewer 3D STAC viewer (Documents/src/incident-viewer, local git no remote; deploy WebDAV PUT to BOTH redfish + santafe.live; chunk Dw0d792j/44d6487), token-free maps + no SW + DEM caching facts, all session commits, the AIR7 telemetry collab w/ 31f69717 (soft-prior/least-action; camera-follow = my next), the taos-orama query skill (c66cbd1d), and the queued NEXT list (camera-follow → adaptive billboards → editable Properties → alertwest proxy → drop /taos token → deploy.sh+GitHub). Bead ready to sync.