**Note** from Bead: Progression Viewer · [canonical source](https://redfish.acequia.io/guerin/.agents/7738b2e5-ec2f-4eb9-b774-a8bbc1756907/2026-07-07/notes/00-old-fire-stac-and-playback.md) · session 2026-07-07 · discussion: Talk: Progression Viewer
## The data (already in Graydon's space) [simtable.acequia.io/people/Graydon/projects/san-bernardino/](https://simtable.acequia.io/people/Graydon/projects/san-bernardino/) holds a simtable fireProgression output triplet for the 2003 Old Fire (San Bernardino): - [OldFire2003v1.png](https://simtable.acequia.io/people/Graydon/projects/san-bernardino/OldFire2003v1.png) — 2048×2048 RGB time-of-arrival raster. - [OldFire2003v1.pgw](https://simtable.acequia.io/people/Graydon/projects/san-bernardino/OldFire2003v1.pgw) — world file, **EPSG:3857** (pixel 32.2566 m; origin −13,084,662.15 E / 4,079,539.65 N). - [OldFire2003v1.json](https://simtable.acequia.io/people/Graydon/projects/san-bernardino/OldFire2003v1.json) — metadata: `worldfile4326`, 9 source perimeter KML names, `UTC[]` timesteps, `acres[]`, bounds, timezone. Profile: 9 timesteps, 2003-10-25T16:17:00Z → 2003-11-07T07:59:00Z (0917 PDT ignition day → 2359 PST final, DST flips Oct 26); acres 0 → 91,601; bbox `[-117.54152, 34.07029, -116.94808, 34.37702]` (4326, from `bounds`).
## Encoding verification (pixel-sampled 2026-07-07) Sampled the PNG on a 64×64 grid (System.Drawing): background is **white (r=255)**, burned samples decode via `v = r·65025 + g·255 + b` to 24,656 … 1,084,970 **seconds**; the timestep span is 1,093,320 s, so every sampled value falls inside it. This is exactly `simtable-flamesim-rgb` as the incident-viewer expects: seconds since `toa:times_utc_ms[0]`, base-255 packing (red = high), r=255 and v=0 excluded.
## The viewer contract (from mounts 84395793 / cbf8b027 / 182bd1a7) `decodeToaItem` (incident-viewer `index.ts` ~2453) uses ONLY: 1. the item **bbox** (4326) — mesh footprint, terrain-draped; 2. `properties["toa:times_utc_ms"]` (≥2) — `times[0]` anchors the decode, last+6 h is the junk gate, `[first,last]` is the item's timeline range; 3. `assets.toa.href` — the PNG, fetched `crossOrigin=anonymous` (server must send CORS headers; nephele does). Catalog walk (`walkStacInto` ~899): a root catalog whose children are **collections** IS the incident — no catalog-of-catalogs wrapper needed. Progression items default **ON** (`[vis]` bootstrap, index.ts ~821–832), and the playhead recolor is yellow → red → 30%-black scar, so the deep-link plays with no roster toggling.
## The minted STAC (lives with the data, not in this bead) ``` san-bernardino/stac/ ├── catalog.json id 2003OldFire (root IS the incident) └── progression/ ├── collection.json id 2003OldFire-progression └── items/toa-OldFire2003v1.json ``` Item `toa-OldFire2003v1`: bbox/geometry from `bounds`; `toa:times_utc_ms` + `toa:acres` copied from `OldFire2003v1.json`; `toa:encoding: simtable-flamesim-rgb`; `toa:worldfile4326` copied through; `proj:shape [2048, 2048]`; assets `toa` (png) / `worldfile` (pgw, flagged 3857) / `metadata` (json), all absolute hrefs into Graydon's project folder. Modeled on [toa-2026_CAVNC_042326_sandy](https://redfish.acequia.io/guerin/.agents/cbf8b027-e80c-4b9f-8eb3-91d40af072d5/2026-06-11/artifacts/stac/2026SandyFire/progression/items/toa-2026_CAVNC_042326_sandy.json) (the v0 simtable-encoded Sandy item — the Old Fire raster is the same pipeline's output).
## Playback URL [https://redfish.acequia.io/guerin/apps/incident-viewer/?stac=https://simtable.acequia.io/people/Graydon/projects/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) (santafe.live carries the same build; swapping the origin works too.)
## CDP verification (2026-07-07, live redfish deploy, dedicated :9222 Chrome, real GPU) - Server side: anonymous GET of catalog/item/PNG all 200 with `Access-Control-Allow-Origin: *` (nephele). - `[stac] 2003OldFire: progression=1 (total 1)` · `[vis] 1/1 items visible on load (default: 1 progressions on)`. - `[toa] toa-OldFire2003v1: 2048x2048, 835611 burned px, arrivals 2003-10-25T17:30:13Z → 2003-11-07T05:39:50Z` — inside the timestep window. - `__misb.toaState()` → `sampledFrac: 1, hasTex: true, hidden: false`; playhead seeks park correctly across the 13-day span. - **Pixels:** after `switchIncident('2003OldFire', {fly:true})` the camera lands on the fire (center pick −117.2418, 34.2203); screenshots at Oct 26 / Oct 28 / Nov 7 playheads show the yellow → orange → red leading edge advancing and late-arriving red cells at the final timestep. **UX caveat (pre-existing viewer gap, same family as `182bd1a7` note 02):** a cold deep-link load leaves the camera at the boot view — the fly-to fires on incident **select**, not on startup adoption. After the page loads, re-pick "2003 Old Fire (San Bernardino)" in the incident dropdown to fly to the fire.
## Open edges - No `perimeters` collection: the 9 source KMLs named in `files[]` are not in the project folder. - No `origin` item: the Old Fire ignition point (Waterman Canyon arson, per the record) is not asserted in the data; adding one would follow the Sandy pattern in [`182bd1a7` note 02](https://redfish.acequia.io/guerin/.agents/182bd1a7-a376-4dd0-b445-578adc6635b9/2026-06-16/notes/02-stac-origin-and-incident-viewer.md). - The 3857 `.pgw` beside a 4326 `worldfile4326` is a standing simtable-pipeline quirk; the STAC item carries both so consumers can pick.
## References (bead cross-links) - Bead: Incident Viewer Taos Engine App · [canonical](https://redfish.acequia.io/guerin/.agents/cbf8b027-e80c-4b9f-8eb3-91d40af072d5/) - Bead: Fire Progression · [canonical](https://redfish.acequia.io/guerin/.agents/182bd1a7-a376-4dd0-b445-578adc6635b9/)