log - #incident-viewer-taos-engine-app (Incident Viewer Taos Engine App)

**Bead document** from Bead: Incident Viewer Taos Engine App · [canonical source](https://redfish.acequia.io/guerin/.agents/cbf8b027-e80c-4b9f-8eb3-91d40af072d5/log.md) · discussion: Talk: Incident Viewer Taos Engine App

- 2026-06-16 [dock-step, CE] **Processed inbound dock upload** from #set-time-space (09fd1bf6): `uploads/2026-06-16-santafe-root-indexhtml-recovered-from-set-time-space.md`. Notice that our Epic-2 santafe.live/ root deploy overwrote a pre-existing "set space time" app's index.html; sibling already recovered it to `santafe.live/set-space-time/` + refreshed pose data (no defect on our side, viewer intact). Distilled → **note 15** (`2026-06-16/notes/15-santafe-root-deploy-collision.md`); opened **D6** (root vs subpath deploy) + **WORK-QUEUE M-1**; STATE refreshed; standing guard recorded (**no root-cleanup on santafe.live**). Dock note left immutable per dock protocol; back-link to #set-time-space added to `names.json` + about.md Related beads. - 2026-06-13 [session-agent] **AWF cameras → all 10 posed billboards (live, ZERO viewer code).** 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, mirroring 15801) → the existing `camFramesFeature` now renders all 10 cams' timelapse billboards scrubbing on the master clock (was just 15801). Verified live: `__misb.camFrames()`=10 cards, 499–672 frames each. Catalog-driven (the "camera item gains timelapse assets → it lights up" design realized). - 2026-06-13 [session-agent, cross-bead from #firewatch-camera-grid 65783732] Shipped `f803621` (deployed live, chunk uYZKXpM6, old RMc-sEhC deleted): **AIR7 feature** — the N828AP/Helinet AS350 news heli (found + de-blurred via the adsb.lol open archive; FR24 hid its reg) renders its 1,687-pt ADS-B orbit (2026-05-19 12:12–15:32Z) as a magenta path + a master-clock-synced marker, Sandy-only, ECEF-delta, hidden under sensor-lock. The platform-position prior for the telemetry-less ABC7 aerial footage. `air7-track.json` deployed alongside the app; debug `__misb.air7()`. Live-verified (hasPath + markerAtPlayhead @13:17:57Z). NOTE: the 3 MISB sensor flights (N57B/N328SF/N42Z) are NOT in ADS-B (ISR not transmitting) — full context in firewatch bead notes 05/07/08/09.

- 2026-06-11T~22:30Z [session-agent] Adopted devops+epic-step method; wrote plan (artifacts/plan-stac-palisades-sandy.md), WORK-QUEUE, STATE, decisions. Launched WP-A/B/C as background agents (Palisades inventory, Sandy inventory, alertwildfire cameras). - 2026-06-12T03:17:07Z [WP-A agent] palisades-inventory.json written: 6 fmv, 6 perimeters, 16 imagery, 4 anomalies - 2026-06-12T03:19:46Z [WP-C agent] cameras-inventory.json written: palisades 101 cams (62 near fire), sandy 30 cams (local ops-alertcalifornia getCameraDataByLoc cache in 2026-CA-SandyFire/, archived during incident - no web hunt needed) - 2026-06-12T03:20:12Z [WP-B agent] sandy-inventory.json written: 5 fmv, all 5 incidents.json clips present locally with KLV start/duration exact match (deltas <=1ms); +6 perimeters (183->2114.51 ac), 18 IR/HS image pairs, mission.json x2; 8 noted anomalies (mission.json snapshots predate later products) - 2026-06-12T03:26:25Z [WP-D agent] STAC tree built: 3 catalogs, 8 collections, 149 items (Palisades fmv 6 / perimeters 6 / imagery 16 / cameras 62; Sandy fmv 5 / perimeters 6 / imagery 18 / cameras 30); validation PASSED (160 files parsed, 1093 checks, 0 errors — link resolution, required Item fields, extent containment) - 2026-06-12T03:32:17Z [WP-E agent] viewer-3d projection: 8/8 clips matched by video filename; Sandy 5/5 identical all fields; Palisades 3 clips with KLV-vs-filename deltas (startUTC +0.9s/-88.4s/-68.1s, duration <=0.2s, id/name/video-path flags); N328SF correctly excluded (no telemetry); projections/viewer-3d.{incidents.json,comparison.md} written - 2026-06-12T03:39:22Z [WP-F agent] geometry enrichment: 12 perimeters polygonized (27,604 points total; Palisades aggregate KMZ = own origin polygon + 5 resolved NetworkLinks), 4 Sandy 1128xx KMZ LatLonBox bboxes recovered, rebuild validation PASSED (160 files, 1093 checks, 0 errors); proj:note placeholder remains only on the 3 N328SF FMV clips (no KLV) - 2026-06-12T~04:55Z [session-agent] Clip switcher shipped: all 3 Palisades N57B MISB clips, catalog-driven from the STAC viewer-3d projection (settings panel Clip select). Repo 0af338c on master; deployed live; CDP-verified telemetry re-anchor per clip (22:29:06Z/22:31:44Z/02:50:13Z). Sandy clips deferred to Epic 2 (terrain re-anchor pass). Faststart remux now high-value (3 moov-at-back clips). - 2026-06-12T~05:45Z [session-agent] Heat-strip master timeline shipped (repo 2d80748, deployed): clip dropdown REMOVED per Stephen; selection by time (click coverage = jump-to-clip); frame-density heat strip; thick midnight bars w/ "Wed Jan 8" + year-once labels. Globe heat-map texture directive captured (note 09: density=covering pixels, blue-past/red-future, desaturate at present). Clips→items-list when Epic 2 panel lands. - 2026-06-12T~06:50Z [session-agent] Shipped 90b9869: drag=pan/click=seek (no camera move on jump), Focus->Range + gear menu, incident selector w/ lerped window+camera (SANDY ENABLED, packets[] dialect verified), LIVE stub (-> remote-camera.html later). Views-as-STAC deferred until after tracks+cameras (order rationale in note 10). Next: aircraft tracks, then camera markers (alertwildfire prep). - 2026-06-12T~08:00Z [session-agent] Shipped 6c83a93: fly-to FIXED (ECEF lerp endpoints — world coords broke across mid-flight re-anchor; single-flight track cache), pan-handle strip (15px) vs scrub zones, Stellarium dt picker on tutc, fly-to menu w/ view slots 1-10 (digit/shift+digit). CDP-verified incl. slot round-trip ending 2.8km from Sandy sensor. Animatable camera-path view-STACs noted for later. - 2026-06-12T~08:45Z [session-agent] Shipped e0776e0: ROOT-CAUSED the dead scrubber/wrong-click (seek chain latched when video.currentTime set pre-metadata — slow link + moov-at-back; now routes via pendingSeekUTCms + un-latch on loadedmetadata + reset on clip switch). applyView no longer fights the window lerp. LIVE ?v= QUERYSTRING: URL continuously mirrors the current view (1/s, requestIdleCallback, change-detected; worker deferred until camera-path recording); boot applies deep-linked ?v=. Faststart remux now URGENT (every UX bug this session traces to slow moov-at-back loads). - 2026-06-12T07:31:32Z [remux agent] faststart: 9 remuxed, 5 already-ok, 9 uploaded+verified (9 guerin, 0 simtable), no failures (all 5 Sandy N42Z clips were already faststart, no upload needed) - 2026-06-12T~09:30Z [session-agent] Shipped: tick-hash removal (labels carry time), date stack above UTC readout, focus hygiene (controls blur after use — opacity slider was trapping k/j/l + WASD). Remux agent: 9 Palisades clips faststarted+uploaded+verified, 5 Sandy already-ok. Video caching probed: guerin no Cache-Control, simtable private/no-cache → effectively uncached; .htaccess/nephele header fix + SW media cache (Acequia-CDN step) proposed to Stephen. - 2026-06-12T~10:20Z [session-agent] Shipped aircraft tracks (ECEF-anchored cross-ribbons + live marker, lazy-built from cached KLV, settings toggle) — first non-FMV layer. CDP-verified render, 0 exceptions. Brainstorms in flight: agent-set UX vs layer panel; camera-processing bead routing. - 2026-06-12T~10:45Z [session-agent] Mount table v2 persisted (namespace.session.json): /ctx unchanged (-c this bead); NEW /cameras point with -c #wildfire-imagery-acquisition (b3461c66) + #catalog/#incident-cataloging read — home for the alertlive-like + geocamera feed-processing discussion. Queued Epic-2 next batch V-1..V-4 (h-mode track culling, window-as-filter, 10px min density width, camera markers). - 2026-06-12T08:54:41Z [V-batch agent] V-1..V-4 shipped (ac368f5): h-mode track culling, window-as-filter, 10px min marks, 62+30 camera markers; deployed + CDP-verified — 0 exceptions, projector opacity gates 1→0 when window excludes clip, sensor-lock engages clean, [cameras] 62/30 loaded (Palisades/Sandy), new chunk index-BQ-jIcXg.js live, old BiJpb0qe deleted - 2026-06-12T~12:30Z [session-agent] MASTER CLOCK shipped: playhead = free UTC cursor; video = slaved item (chase-sync, coverage play/pause, auto-clip-switch, no snap/loop); pendingSeek machinery retired. CDP-verified gap-click/advance/auto-switch. ToA raster hunt launching as background agent. - 2026-06-12T~13:15Z [session-agent] Sandy ToA acquired + cataloged: simtable.com/apps/fireProgression PNG (RGB=flamesim seconds-since-start) + JSON (dual worldfiles, 8 UTC timesteps 05-18T23:49Z->05-23T05:29Z, acres 0->2179, CORS *). New STAC collection 2026SandyFire-progression pushed to the bound catalog (add-progression.mjs). PALISADES TOA ABSENT from fireProgression output2025 (200+ fires, no CALFD/palisades) — needs progressionMaker run from our perimeter KMLs or Stephen's pointer. Archived copies in stac-inputs/toa/. - 2026-06-12T~14:30Z [session-agent] Shipped e97d062: FIRE-PROGRESSION ToA LAYER (Sandy; catalog-driven, flamesim RGB decode w/ black+white unburned sentinels, terrain drape, master-clock recolor blue-past/red-future per note 09; master span -> full 5-day burn) + H hides ALL track/plane geometry. ROTATION BUG recorded (note 12): projector roll unconstrained — lookRotation only fixes the boresight; fix = compose MISB platform+gimbal attitude (or offset-corner fallback). Palisades ToA decision still open. - 2026-06-12T~15:30Z [session-agent] Shipped 827d259: ToA look MATCHED to fireProgression shader (BASE-255 decode fix — bit-shift was ~80min off across the burn; yellow leading edge aging to dark red, hue-banded isochrones at end; note-09 ramp parked as alt mode) + ARCHIVED CAMERA FRAMES on Sandy (15801: 666 frames indexed via STAC timelapse assets, posed billboard shows frame nearest playhead, re-orients with archived PTZ az). Smoke-at-leading-edge directive captured (note 13: smoke sim clock decoupled — freeze on scrub, reanimate on settle). STAC camera item 15801 updated w/ timelapse assets (PUT 204). - 2026-06-12T~16:30Z [session-agent] Palisades ToA DEFERRED (Stephen). Shipped attitude chain (fallback-protected: convention error logged at 88.9/57.7deg deviation — production unchanged, diagnostics live; convention fix next). D5 DONE: viewer-3d incidents.json replaced with the STAC projection (original kept as incidents.orig.json, both pushed). Epic-2 S1+S2 launching as background agent. - 2026-06-12T11:08:41Z [epic2 agent] S1+S2 shipped (84dde2d): registry Palisades fmv=6+perim=6+irhs=16+cams=62 (90), Sandy 5+6+18+1+30 (60); roster 4-5 groups/90+60 rows; CDP all-pass (row-click clip switch w/ telemetry line, cameras eye-toggle, 26 dimmed out-of-window rows, 0 exceptions, live-URL re-verified), chunk index-dUSmgDiC.js (old CXVQxcW- deleted) - 2026-06-12T~17:30Z [session-agent] Demo capture web-processed per .ai/skills/web-video-post-process (libx264 slow crf23, aac, faststart, metadata stripped; 186MB->~70MB) -> artifacts/taos-engine-simtable-incident-viewer-web.mp4, PUT to canonical bead URL. - 2026-06-12T~18:15Z [session-agent] Captured bead-ducktype design: note 14 (module/STAC faces + face-path dispatch) + artifacts/technote-beads-as-ducktypes.md (standalone technote). Full /bead-sync launched. - 2026-06-13T00:30Z [session-agent] Shipped 3ff08c3: ToA DRAPE FIX (Stephen's review catch, diagnosed via the new raw-RGB debug mode). ROOT CAUSE: buildToaMesh latched `heightsOk` at >50% sampled → up to half the verts froze at the 300 m fallback AND sampled verts froze at build-time coarse terrain LOD while the displayed terrain kept refining → hills poked straight through the drape; 40×40 grid (~125 m cells vs 424 m relief) compounded it. FIX (perimeters/cameras provisional idiom): grid 40→120 (~42 m cells), rebuild ~1 s until ≥99% sampled or 3 no-gain rebuilds, then a 4 s sentinel re-drapes when heightAt drifts >3 m from the heights the mesh used (newly streamed tiles over fallback areas read as big drift → early no-gain latch self-heals; observed 0.77→1.0 on approach). Verified raw + timed modes hug terrain on the failing SE-oblique; deployed (chunk RMc-sEhC, old KVD6Tb34 deleted); LIVE toaState sampledFrac=1.0/drift=0. Debug __misb.toaState(). - 2026-06-12T23:55Z [session-agent] Shipped 333ff08 (note-12 ROTATION fix): ATTITUDE-CHAIN convention corrected. The chain composed platform pitch + gimbal elevation with NEGATED angles about body-right (−s.pit, −s.rEl) → raised the look above the horizon instead of depressing it → boresight 54–87° off the true sensor→frame-center → past the 8° gate → always fell back to lookRotation (arbitrary roll = the rotated projection). Solved offline against ground truth for BOTH dialects (tools/att-solve.mjs): pitch (nose-up +) and elevation (above-horizon +) are BOTH +ve about body-right → boresight matches to 0.01–0.03° on the stored samples. Live: chain now logs "chain ok (Δ 0.15° Palisades / 0.17° Sandy)" and applies the real sensor roll (−23°/+132°) instead of falling back; 0 exceptions. Deployed (chunk KVD6Tb34, old CUuIkOxT deleted). Image-up convention (body −Z, platform+gimbal roll applied) unchanged. OPEN: final VISUAL roll confirmation vs burned-in features / Stephen's before-screenshots still recommended (note 12) — boresight is geometrically exact, image-up is the standard mounting assumption. Debug __misb.attSample() + tools/att-{solve,check}.mjs. - 2026-06-12T23:30Z [session-agent] Shipped 2a371d0 (Epic-2 S3): terrain-following PERIMETER layer. Each STAC MultiPolygon ring densified to ≤40 m → cross-ribbon (buildTrackMesh) at z=heightAt + "Perim +m" drape-lift (gear slider, default 8 m), ECEF-anchored + provisional rebuild. Fire-progression semantics: only perimeters with datetime ≤ playhead render, latest bright (orange) / earlier embered (dim); untimed aggregate skipped; collection eye wired into the roster. Perimeter datetimes now EXTEND the master span like the ToA layer (Palisades timeline now spans Jan 7–9 so the playhead can reach the later snapshots). CDP-verified scrub Palisades 22:09→21:06 grows 1→4 visible perimeters (770→15,832 ac), latest bright, all terrain-draped, 0 exceptions; live re-verified (chunk CUuIkOxT, old vdlwYnot deleted). Debug __misb.perims() + tools/perim-check.mjs. NOTE: behavior change — Palisades default timeline span widened to the full burn (whole-burn timeline, consistent with the Sandy ToA decision). - 2026-06-12T23:10Z [session-agent] Shipped 3765562: ToA DEBUG raw-RGB drape (gear toggle "ToA debug: raw RGB" under Fire progression). When on, the progression feature drapes the source PNG straight onto terrain — opaque, no master-clock recolor, no window gate (always visible) — to validate the decode/orientation. DOUBLE-CHECKED the decode: base-255 (val=r·255²+g·255+b) matches the fireProgression shader; arrivals (23:50→05-23 04:43Z) land inside the 23:49→05:29Z timestep span; CDP raw drape over the Sandy bbox [-118.768,34.220,-118.714,34.252] matches simtable.com/.../2026_CAVNC_042326_sandy.png EXACTLY — black ignition on the WEST, green late-arrival on the EAST, north-up (mesh UV u:west→east=image L→R, v:north→south=image top→bottom). The PNG's white background is genuine (decode excludes r===255). Keeps ToaData.src + lazy raw GPU texture; added debug __misb.flyOver(lon,lat,alt) nadir helper + tools/toa-check.mjs. Deployed live (chunk vdlwYnot, old BjuMn0ty deleted); live CDP all-pass, 0 exceptions. - 2026-06-12T22:50Z [session-agent] Shipped 7f16af7: camera markers FLOATED on a stem (buildCamGlyphMesh — octa r30 lifted 70 m up the local ECEF radial + crossed-quad stem from the true DEM+Cam-ft point; wedge alpha 0.35→0.5). ROOT CAUSE of "no markers visible": the 25 m green octa at +6 m was terrain-buried in microrelief AND green-on-green from the near-overhead default incident view → invisible, despite the feature pushing 124 items/frame (confirmed) and the forward-transparent pass doing NO frustum culling (geometry rendered but never read; an opaque-debug test was a red herring — forward_pass filters by material.transparent). Verified up-close on Palisades 62 + Sandy 30 (green octa + az wedge now silhouette at oblique/level angles) + Sandy 15801 timelapse billboard near playhead. Deployed live (chunk BjuMn0ty, old B9T9eOEe deleted); live CDP all-pass, 0 exceptions. Added debug-only __misb hooks (flyToCam/cameras/camFrames/switchIncident/masterSeek) + tools/cam-*.mjs harnesses. OPEN: green-on-green from straight overhead is inherent to the green choice (mast mitigates via vertical relief); offer screen-space sizing / contrast as a follow-up. - 2026-06-13T00:00Z [session-agent · cross-bead from #firewatch-camera-grid] Shipped 6afbad4 (incident-viewer, chunk Dd_uZGp6): **roster select → focus**. Generalized `selectItem` so ANY catalog row (camera/perimeter/imagery/progression), not just FMV, becomes the current focus — computes the item centroid (`itemCentroid`: bbox center / averaged geometry) into `selectedTarget`, recenters the timeline to its time (cameras exempt — standing items), and flies the map camera to its overview (`camFlyToGeo`, mirrors `camFlyToFootprint`). `H` rewired to `focusSelected` = re-fly to the selected item, or ride the FMV sensor pose (sensor-lock) when an FMV clip is current. `__misb.selectedTarget`/`sensorLock` exposed. CDP pixel-verified: camera select → `selectedTarget={-118.5788,34.1238}` + fly; perimeter select → timeline recentered to Sandy 2026-05-19 + polygon framed; FMV select → `selectedTarget=null` + clip switch. Deployed live (old uYZKXpM6 deleted). Fixes Stephen's flagged gap ("selecting a camera/perimeter/imagery row only highlights it"). - 2026-06-13T00:30Z [session-agent · cross-bead from #firewatch-camera-grid] Shipped c24b3f5 (incident-viewer, chunk BYwoFvin): **default Sandy framing / fit-all**. AWF billboards + AIR7 rendered but sat off-screen from the FMV-footprint default view. Added `gatherIncidentEcef` (footprint + 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 DEFERS one auto-fit until cameras (+ AIR7, ≤3 s grace) load — cancelled if the user takes the camera first (`userCamInput`). Plus a Fit-all control: ⛶ topbar button + `G` key. `__misb.fitAll`/`fitPoints`. CDP-verified by projecting every camera to NDC: after the Sandy auto-fit, 30/30 cameras land inside the viewport (was off-screen), `fitPoints=76` w/ AIR7 (1687 pts). Deployed live (old Dd_uZGp6 deleted; server air7-track.json 200). FOLLOW-UP: move incident-viewer/air7-track.json into public/ (repo-root + manual-PUT only today). - 2026-06-13T01:00Z [session-agent · cross-bead from #firewatch-camera-grid] Shipped 85b6151 (incident-viewer, chunk DtKUzCak): **gear-panel bead-version stamp**. `vite.config.ts` reads this repo's git short-commit + `%cs` date at build time (cwd=here, not the engine repo it cds into) and injects `__BUILD__` via `define`; the gear settings footer renders `incident-viewer · <commit> · <date> · bead cbf8b027 ↗` linking the source bead. Dirty check uses `--untracked-files=no` so scratch (tool screenshots, dist/) doesn't false-flag; a `*` on the commit ⇒ modified TRACKED source. `__misb.build` exposes it. CDP-verified gear footer text = `incident-viewer · 85b6151 · 2026-06-13 · bead cbf8b027 ↗` + the bead link; deployed live (old BYwoFvin 404). A running viewer now points back to its bead-version (commit logged here). - 2026-06-13T01:30Z [session-agent · cross-bead from #firewatch-camera-grid] Shipped cd83812 (incident-viewer, chunk B8mznYAN): **H on a camera looks THROUGH it** (camera analog of FMV sensor-lock). Bug: selecting a camera + H flew an overview-from-ABOVE looking down, not through. Fix: `camFlyThrough` stands the eye AT the camera ground point (DEM height +12 m) and aims down its azimuth at the real terrain 6 km out (great-circle bearing + `geo.heightAt` sample → peak cams look into the valley / up at a facing ridge). Azimuth = nearest timelapse frame's az (`cameraAzNow`, matches the rendered billboard), fallback `view:azimuth`. `selectedTarget` now carries `camId`+`az`; select still flies the overview to locate, H looks through. CDP-verified on Las Virgenes: select→overview (pitch 80°, eye −4982 m), H→through (pitch ~1° horizontal, eye −435 m at the camera) + billboard/wedge in view. Deployed live (old DtKUzCak 404). - 2026-07-07T~21:45Z [session-agent · cross-bead from #progression-viewer 7738b2e5] Shipped 02f6c38 (v0.4.0, chunk PaGF8Vhl): **ToA DRAPE RE-PLATFORM — proxy mesh → top-down rect PROJECTOR** (depth-buffer decal, the FMV projector machinery). The 120² terrain-following grid undersampled ridges on large bboxes: Old Fire 2003 (55 km, new STAC in Graydon's san-bernardino space) put ~455 m between verts and crests rose through the drape; no rebuild cadence can fix between-vertex error. Deleted buildToaMesh/toaHeightDrift/rebuild loop; added makeRasterProjector + bakeRasterCanvas (GENERIC for any north-up bbox raster — IR orthos next). ENGINE CONSTRAINT worked around app-side: Projector.viewMatrix() ignores GO roll (up rebuilt from world UP) → footprint lands rotated (77.6° under the Santa Fe base origin); rig uses a bbox-diagonal SQUARE footprint + counter-rotates the raster content by the measured angle when baking the projector canvas; re-bakes on θ drift (base-origin switches). Also: per-item TOA opacity read live per frame (alphaOf) — removes the latent applyOpacityFromTree crash (toa.mat on ToaData[] since the multi-progression merge). CDP-verified local + LIVE both hosts (old 2KrNXlI9 deleted): Old Fire continuous front over dissected canyons at oblique angles (was fragmented ribbons), Sandy regression 3 progressions decode+drape, 63-item roster intact, 0 exceptions. Feature request for first-class engine raster-drape (respect GO roll / GeoRasterOverlay / WGSL colorizer field sources): 7738b2e5 2026-07-07/artifacts/feature-request-raster-drape.md.