Bead: Progression Viewer

**Bead** `7738b2e5-ec2f-4eb9-b774-a8bbc1756907` · [canonical URI](https://redfish.acequia.io/guerin/.agents/7738b2e5-ec2f-4eb9-b774-a8bbc1756907/) · discussion: Talk: Progression Viewer This page is the wiki facet of a [bead](https://redfish.acequia.io/guerin/.agents/); the bead is the source of truth.

## Identity - **URI:** [https://redfish.acequia.io/guerin/.agents/7738b2e5-ec2f-4eb9-b774-a8bbc1756907/](https://redfish.acequia.io/guerin/.agents/7738b2e5-ec2f-4eb9-b774-a8bbc1756907/) - **GUID:** `7738b2e5-ec2f-4eb9-b774-a8bbc1756907` - **Slug:** `progression-viewer` - **Opened:** 2026-07-07 - **Body:** CV (Claude Code extension — shell + filesystem; local origin is source of truth, PUT/bead-sync propagates) - **Mounts (read):** - [`182bd1a7` fire-progression](https://redfish.acequia.io/guerin/.agents/182bd1a7-a376-4dd0-b445-578adc6635b9/about.md) — the TOA-raster-from-perimeters spec and the Sandy worked example; producer of the `toa-2026Sandy_v2-bead` STAC item this bead's item is modeled on. - [`84395793` incident-viewer-epic-5](https://redfish.acequia.io/guerin/.agents/84395793-e621-4739-81e4-fe247b9e6003/about.md) — THE resume contract for the incident-viewer 3D STAC viewer (repo `Documents/src/incident-viewer`); how progression items are decoded and played back. - [`cbf8b027` incident-viewer-taos-engine-app](https://redfish.acequia.io/guerin/.agents/cbf8b027-e80c-4b9f-8eb3-91d40af072d5/about.md) — holds the Sandy Fire STAC (`2026SandyFire/progression/`), the catalog/collection/item template this bead copies.

## Motivation (why a GUID) Stephen asked for a STAC over an existing simtable fireProgression output — the **2003 Old Fire (San Bernardino)** TOA raster sitting in Graydon's project space at [simtable.acequia.io/people/Graydon/projects/san-bernardino/](https://simtable.acequia.io/people/Graydon/projects/san-bernardino/) — plus a deep-link URL that plays the progression back in the deployed incident-viewer. The STAC itself lives in Graydon's space (data stays with the data); this bead holds the provenance, the encoding verification, and the wiring notes so the pattern is repeatable for the next progression raster.

## Mechanism (what this bead does) - Reads the mounted beads to learn how the viewer visualizes progression: `decodeToaItem` (incident-viewer `index.ts` ~2453) needs only the item **bbox**, `properties["toa:times_utc_ms"]` (≥2 entries), and an `assets.toa` PNG. Decode is base-255 (`v = r·65025 + g·255 + b`), value = **seconds since `times[0]`**, `r === 255` (white background) and `v === 0` excluded; playback recolors per playhead (yellow → red → 30% black scar). Progression items default **ON** in the roster. - Verifies the Old Fire PNG matches that encoding (2048×2048, white background, sampled values ≤ the 12.65-day timestep span). - Mints the STAC: an incident catalog `2003OldFire` whose `progression/` collection holds one item `toa-OldFire2003v1` with absolute asset hrefs to the existing `OldFire2003v1.{png,pgw,json}`. - Delivers the playback deep-link (see Session Log).

## Folder Layout - `about.md` (this), `README.md`, `bead-bind-startup.md`, `keywords.json`, `names.json` — root self. - `2026-07-07/notes/` — `00-old-fire-stac-and-playback.md` (data profile, encoding verification, viewer contract, the minted STAC, the URL). - `2026-07-07/chats/` — verbatim chat log. - `uploads/` — inbound dock.

## Session Log - **2026-07-07** — bead opened. Mounted `182bd1a7` + `84395793` + `cbf8b027`; studied the progression pipeline (`decodeToaItem` contract, Sandy STAC template). Profiled `OldFire2003v1`: 2048×2048 RGB TOA PNG, 9 timesteps 2003-10-25T16:17Z → 2003-11-07T07:59Z, 0 → 91,601 acres, bbox `[-117.54152, 34.07029, -116.94808, 34.37702]`; pixel-sampled the encoding (simtable-flamesim-rgb, seconds, white bg) — matches the viewer decoder. Minted the STAC at [san-bernardino/stac/](https://simtable.acequia.io/people/Graydon/projects/san-bernardino/stac/catalog.json) (catalog `2003OldFire` → `progression` collection → item `toa-OldFire2003v1`), synced to simtable.acequia.io, and verified the catalog + PNG from an external vantage. Playback URL: [incident-viewer?stac=…san-bernardino/stac/catalog.json](https://redfish.acequia.io/guerin/apps/incident-viewer/?stac=https://simtable.acequia.io/people/Graydon/projects/san-bernardino/stac/catalog.json). Dock note offered to `182bd1a7/uploads/`. - **2026-07-07 (later)** — Stephen recorded a screen capture of the playback; web-processed it per `.ai/skills/web-video-post-process/SKILL.md` (Game DVR source 1920×1200 42.9 MB, moov-after-mdat → H.264 CRF 23 slow + faststart + metadata stripped, 10.2 MB) and published it beside the data: [2003-old-fire-v1-incident-viewer-screen-capture.mp4](https://simtable.acequia.io/people/Graydon/projects/san-bernardino/2003-old-fire-v1-incident-viewer-screen-capture.mp4) (+ [poster jpg](https://simtable.acequia.io/people/Graydon/projects/san-bernardino/2003-old-fire-v1-incident-viewer-screen-capture-poster.jpg)). Anonymous Range GET returns 206 — progressive playback verified. - **2026-07-07 (later still)** — Stephen flagged DEM poke-through in the playback (screenshot; diagnosed in [notes/01](2026-07-07/notes/01-toa-drape-poke-through-diagnosis.md), options in [notes/02](2026-07-07/notes/02-raster-drape-via-projector-and-wgsl.md)). On his "do move 1": **shipped incident-viewer v0.4.0 (`02f6c38`, chunk `PaGF8Vhl`)** replacing the TOA proxy mesh with a top-down rect projector per item (`makeRasterProjector` + `bakeRasterCanvas`, generic for any north-up bbox raster). Found + worked around an engine constraint: `Projector.viewMatrix()` ignores GameObject roll, so the rig uses a bbox-diagonal square footprint and counter-rotates the raster content by the measured roll (77.6° here) when baking the projector canvas. CDP-verified locally and LIVE on both hosts (Old Fire continuous front at oblique angles; Sandy 3-progression regression clean). Deliverable: [artifacts/raster-drape-design-question.md](2026-07-07/artifacts/raster-drape-design-question.md) (reframed 2026-07-08 per Stephen from "feature request" to a design/architecture question in exploratory voice: use case, both app-side improvisations, directions A–D with open questions, transparency/opacity properties, and a survey of how CesiumJS / Mapbox / MapLibre / deck.gl / ArcGIS / three.js+NASA-AMMOS handle PNG+world-file layering — none parse world files; Cesium punts to outside-the-renderer conversion. Before/after images beside it; a stub remains at the old feature-request filename). Ship log entry appended to `cbf8b027/log.md`.

## Modus Operandi (how to interact) Read `bead-bind-startup.md` first. The single note `2026-07-07/notes/00-old-fire-stac-and-playback.md` carries everything: the data profile, the viewer contract, and the minted STAC. The STAC itself is NOT in this bead — it lives with the data in Graydon's project space; this bead only points at it.

## Capabilities Documents the "existing simtable progressionMaker output → STAC progression item → incident-viewer playback URL" wiring. Inputs: a `{png, pgw, json}` fireProgression triplet. Output: an incident catalog the viewer's `?stac=` loads directly (root-with-collections = the incident).

## Lifecycle Open. bead-sync after a dirtying turn. Apoptose once the pattern is stable and folded back (a `stac-for-progression` skill is the natural successor artifact).

## Limitations - The `.pgw` on disk is **EPSG:3857** (Web Mercator); the 4326 georeference is the `worldfile4326` field inside `OldFire2003v1.json` and is copied into the item as `toa:worldfile4326`. The viewer uses only the item bbox, so this is provenance, not a playback dependency. - The source perimeter KMLs named in `OldFire2003v1.json` (`files[]`) are not present in the project folder; the STAC has no `perimeters` collection. - Viewer CORS: the PNG is fetched `crossOrigin=anonymous` from redfish.acequia.io / santafe.live origins; simtable.acequia.io (nephele) must keep serving `Access-Control-Allow-Origin` for playback to work.

## References (bead cross-links) - Bead: Fire Progression · [canonical](https://redfish.acequia.io/guerin/.agents/182bd1a7-a376-4dd0-b445-578adc6635b9/) - Bead: Incident Viewer Epic 5 · [canonical](https://redfish.acequia.io/guerin/.agents/84395793-e621-4739-81e4-fe247b9e6003/) - Bead: Incident Viewer Taos Engine App · [canonical](https://redfish.acequia.io/guerin/.agents/cbf8b027-e80c-4b9f-8eb3-91d40af072d5/)

See all: Beads