Overarching plan: the wildfire world model, end to end (Wildfire World Model)

**Note** from Bead: Wildfire World Model · [canonical source](https://redfish.acequia.io/guerin/.agents/a617e16d-2257-40b7-8d30-9cfc5ff452e8/2026-06-21/notes/03-overarching-plan.md) · session 2026-06-21 · discussion: Talk: Wildfire World Model

**Bead:** `a617e16d` (wildfire-world-model) · 2026-06-21. Mounts **senior-architect** [`b2d9f6e1`](https://redfish.acequia.io/guerin/.agents/b2d9f6e1-4c3a-4e58-8a1f-7d0c5b9e2a64/about.md) (5-plane convergence lens), **wildfire-forager** [`5b518c35`](https://redfish.acequia.io/guerin/.agents/5b518c35-2ce7-474a-a5a8-ec83e2fd0e82/about.md) (forager pattern), **wildcad** [`bd08d6d4`](https://redfish.acequia.io/guerin/.agents/bd08d6d4-76a2-438e-94a3-82314bd70065/about.md) (ignition source). Builds on `notes/01` (technical approach) and `notes/02` (the three plans).

## Why an overarching plan now `notes/02` planned the world model's three internal capabilities (fuse / measure / forecast). The `wildfire-forager` + `wildcad` beads reveal that those sit inside a **longer pipeline** whose *front-end already exists*: a fire is first known not from imagery but from a **dispatch record**, and the ecology already has a *pattern* (forager) for turning that trigger into foraged, fused data. The overarching plan is the **single spine** that runs detect → … → serve, and shows that each segment is an existing bead, loosely coupled over the namespace bus.

## The spine (one line) **DETECT** an ignition (wildcad/forager) → **FORAGE** multi-sensor imagery for its bbox+window → **FUSE** onto one terrain+clock (block V) → **MEASURE** fire behavior (state) → **FORECAST** spread (block M + assimilation) → **SERVE** products to viewers + community (block C) → *(new observations re-enter at FUSE; the loop closes)*. ``` ┌──────────────────────────── the commons / namespace bus (plane 4) ────────────────────────────┐ │ │ │ S0 DETECT S1 FORAGE S2 FUSE S3 MEASURE S4 FORECAST S5 SERVE │ │ wildcad / media-forager pose+calib fire-progress fire-in-taos incident │ │ forager imagery-acq +catalog (TOA/ROS) +Rothermel/LS -viewer │ │ FIRMS/IRWIN adsb-for-heli encode→grid intensity +EnKF +learned +social │ │ │ ignition │ observations │ fused │ state │ forecast │ │ │ ▼ record ▼ (STAC items) ▼ tensor (V) ▼ variables ▼ (STAC) ▼ │ │ /incidents/<id>/ …/observations/ …/fused/ …/behavior/ …/forecast/ apps │ │ ▲ ▲ │ │ │ │ trigger (bbox+window) └──────── new obs assimilate ◄─────┘ │ │ └──── FIRMS/IRWIN/NIFC/WatchDuty as further conforming sources │ └─────────────────────────────────────────────────────────────────────────────────────────────────┘ every segment = a bead; segments compose by READ/WRITE of shared URIs, not by linking code ```

## The key architectural insight: the forager pattern *is* plane 4 The senior-architect's **plane 4 (namespace-as-bus)** asked: do apps integrate by *shared state* or *live messaging*? The `wildfire-forager` bead already answers it concretely for the afferent path: - An ignition record is **written** to the commons (`/incidents/<id>/ignition.json`). - Foragers **read** it (or receive it via a dock envelope / `--webhook`) and **write** observations back (`/incidents/<id>/observations/…`). - The world model **reads** observations, **writes** forecasts (`/incidents/<id>/forecast/…`). - Viewers **read** everything. No segment calls another's API; they share URIs (plane 4, option D1 = shared files / cache-as-state, the loose, partition-tolerant, citizen-friendly seam). **The forager pattern is the first built instance of the bus**, and the world model extends the same bus downstream. This is also the Acequia north-star / M&A moat (the open, local-first, citizen-trusted pipe) and the DARPA-DICE decentralized-AI story (`eb8d150d`).

## The spine against the 5 planes (loosely couple, tightly align) | Segment | Beads | Plane(s) tightened | Contract (the "tight alignment") | |---|---|---|---| | S0 DETECT | wildcad `bd08d6d4`, forager `5b518c35` | 0, 4 | **normalized ignition record** schema | | S1 FORAGE | media-forager `58c0a5e0`, imagery-acq `b3461c66`, adsb `2986ff41` | 4 | ignition record in → observation items out, keyed bbox+window | | S2 FUSE | catalog `90f902e0`, pose stack (`edb06426`/`74c30681`/`58091f55`/`09fd1bf6`), stac-cam-telem `31f69717` | 0, 1 | **fused-observation STAC item** schema (geometry, UTC, pose, sensor, footprint) + 3-clock model | | S3 MEASURE | fire-progression `182bd1a7`, fire-in-taos `b6fcda63` (DEM) | 2, 3 | **behavior rasters** (TOA, ROS field, intensity) on the DEM grid, bound to the master cursor | | S4 FORECAST | fire-in-taos→Rothermel/LS `b6fcda63`, agentscript-webgpu `f4ef67b7`, fire-progression (ground truth) | 3, 0 | **forecast STAC products** (TOA, burn-prob) + the assimilation loop | | S5 SERVE | incident-viewer `be9c3efd`/`cbf8b027`, geospatial-ux `f80f1929`, senior-uxui social plane `c4a8e2f1` | 1, 2 | shared **app-shell** + **time-cursor**; observed-vs-forecast overlay; social/response | The "loose coupling" is that each cell can be swapped (a new detection source, a different forecast engine) without breaking neighbors, because they only agree on the **four contracts in bold**: ignition record · fused-observation item · behavior raster · forecast product. Nail those four schemas and the spine self-assembles.

## Build order (program level) Folds `notes/02`'s per-plan order into one sequence; **value-first, each step demoable**, worked on **Sandy Fire (CA-VNC-SANDY)** with **a live AOI** as the stretch: 1. **Contracts first (the 4 schemas).** Ignition record (exists, in forager) · fused-observation item (A1) · behavior raster (exists, fire-progression) · forecast product. *Without these, nothing composes.* (planes 0/4) 2. **S0+S1 on a live AOI.** Point `subscribe-wildcad.mjs` at real dispatch centers; fan one ignition out to the imagery/ADS-B/media foragers. *Demo: a real new fire → an auto-foraged observation set.* (plane 4) 3. **S2 fuse + S3 measure on Sandy (replay).** Pose/encode the Sandy observation set to the grid; run fire-progression for observed TOA/ROS. *Demo: scrub observed fire behavior in the viewer.* (planes 0/2) 4. **S4 forecast tier C0+C1.** Validation harness + Rothermel/level-set baseline on the DEM (GPU). *Demo: forecast-from-perimeter-N vs observed-N+1, scored.* (plane 3) 5. **S4 tier C2 — close the loop.** Ensemble + EnKF assimilation of each new observation. *Demo: a forecast that self-corrects as observations land = the world model, live.* (planes 0/4) 6. **S2 A3 citizen lane + S5 social.** Citizen imagery via the dock; observed-vs-forecast overlay + the social/response plane. *The first-three-hours moat.* (planes 4/1) 7. **S4 tier C3 — learned residual.** Once the STAC fire archive is large enough, train the physics-residual correction (Sutton's experience). (plane 3) Steps 1–4 give an end-to-end *detect → forage → fuse → measure → forecast → score* thread. Steps 5–6 turn it into the **live, assimilating, citizen-fed** world model that is the realtime.earth / Acequia differentiator.

## What this changes vs. `notes/02` - Plan A gained a real **front-end** (S0 detect, S1 forage) instead of assuming someone hands us imagery; A2 is now "forager fan-out," an instance of the `wildfire-forager` pattern, not bespoke wiring. - The whole thing is reframed as **one bus with six segments and four contracts**, which is the cleanest expression of senior-architect's "loosely couple, tightly align."

## Gated decisions (for Stephen) 1. **Where does the spine run live?** A server bead polling WildCAD, the bead-orchestrator `4c6470f9` routing ignition envelopes, or on-demand per AOI? 2. **First live AOI + dispatch centers** to subscribe (CA SoCal? a current-season region)? 3. **Drive forward (S4 forecast) or widen the front (more S0 sources / S2 citizen) first?** My rec: contracts (step 1) then S0+S1 live (step 2) — the front-end is closest to done and proves the bus. 4. Forecast data sources still open from `notes/02`: wind (HRRR / WRF-Fire coupling) and fuel (LANDFIRE).

## References (bead cross-links) - Bead: Senior Architect · [canonical](https://redfish.acequia.io/guerin/.agents/b2d9f6e1-4c3a-4e58-8a1f-7d0c5b9e2a64/) - Bead: Wildfire Forager · [canonical](https://redfish.acequia.io/guerin/.agents/5b518c35-2ce7-474a-a5a8-ec83e2fd0e82/) - Bead: Wildcad · [canonical](https://redfish.acequia.io/guerin/.agents/bd08d6d4-76a2-438e-94a3-82314bd70065/)