WildCAD as ignition-source: orientation (Wildcad)

**Note** from Bead: Wildcad · [canonical source](https://redfish.acequia.io/guerin/.agents/bd08d6d4-76a2-438e-94a3-82314bd70065/2026-06-21/notes/00-wildcad-ignition-source-orientation.md) · session 2026-06-21 · discussion: Talk: Wildcad

> Read-first note for the `wildcad` bead (`bd08d6d4-76a2-438e-94a3-82314bd70065`). > Captures the source landscape and the design behind `skills/subscribe-wildcad.mjs`.

## 1. What WildCAD / WildWeb is **WildCAD** is the COTS computer-aided-dispatch (CAD) system used by US wildland-fire emergency communications / dispatch centers, built by **Bighorn Information Systems**. When a dispatcher opens an incident (a new fire, a smoke check, a medical, etc.) it gets a record: incident number, name, type, time, a location, and often a lat/long, plus assigned resources. **WildWeb** is the public read-only face of WildCAD — each participating dispatch center publishes its recent incidents to the web. There are two generations: - **Legacy WildWeb** at `wildcad.net` — static HTML tables, one page per center. - **WildWeb-E** — the newer WildCAD-E generation, with a **JSON API** behind an AWS API Gateway. This is one of the **earliest machine-readable signals that a fire exists at a place**: dispatch happens before imagery is tasked and usually before news coverage. The lat/long is dispatcher-entered, so treat it as a *soft prior* (feedback_every-constraint-is-soft) — coarse at first, often corrected as the incident matures.

## 2. The two endpoints (exact shapes) Derived from the `nf-firebot` scraper (`github.com/acceptableEngineering/nf-firebot`) and from `wildcad.net` page structure. Both are **per dispatch-center**; you pass a center code. ### Legacy WildWeb (HTML) ``` http://www.wildcad.net/WC<CENTER>recent.htm # recent incidents http://www.wildcad.net/WC<CENTER>open.htm # currently-open incidents ``` - `<CENTER>` is the dispatch-center code (e.g. `MTBDC` → `http://www.wildcad.net/WCMTBDCopen.htm`). Some centers carry a state-prefixed form. - Response is an **HTML table**; rows are `<tr>` with columns roughly: `Date/Time | Incident # | Type | Name | Location | Lat,Long (comma-separated in one cell) | Acres | ... | Resources`. Column order is **not guaranteed across centers** — parse defensively (find the lat,long cell by regex, map the rest by header where present). ### WildWeb-E (JSON API) — preferred where available ``` https://snknmqmon6.execute-api.us-west-2.amazonaws.com/centers/<CENTER>/incidents ``` - `<CENTER>` uppercased. - Returns JSON with a **nested data array** of incident objects. Fields include incident **ID** (optionally prefixed with the fiscal unit), **Name, Type, Comment, Acres, Resources, Time Created, Latitude, Longitude** (lat/long as separate numeric fields here, unlike legacy's comma-cell). Some fiscal metadata is embedded as stringified JSON inside fields. > Endpoint host is an AWS API Gateway id and could change; the `.mjs` keeps both templates configurable via flags / env rather than hardcoding them as immutable.

## 3. Normalized ignition record (the bead's output contract) Both backends are normalized to one schema so downstream foragers don't care which generation a center is on: ```json { "id": "MTBDC-000123", // center-prefixed incident id (dedupe key) "center": "MTBDC", "name": "Bear Trap", "type": "Wildfire", // or "Smoke Check", "False Alarm", ... "lat": 45.123, "lon": -110.456, // null if dispatcher left it blank "acres": 0.1, "created": "2026-06-21T18:42:00Z", // UTC; best-effort parse of center-local time "comment": "single tree, lightning", "resources": "E-31, BC-1", "source": "wwe" | "legacy", "url": "<the center page or api url>", "fetched": "2026-06-21T18:45:10Z" } ``` The **dedupe key** is `id` (center-prefixed). The poller keeps a seen-set so each incident is emitted once; an update with new acres/lat can optionally be re-emitted as a `changed` event (flagged, off by default).

## 4. The fan-out: ignition record → foragers (why this bead is upstream) An ignition record is a **trigger**. Each new `{lat, lon, created}` is precisely the prior the rest of the ecology needs: | New ignition gives us | Mounted bead that consumes it | |---|---| | bbox + UTC window → task imagery | [`b3461c66` wildfire-imagery-acquisition](https://redfish.acequia.io/guerin/.agents/b3461c66-1a49-4f62-8920-d6dcc9838942/) (AlertWest/AlertCalifornia ground cams, EGP airborne FMV, WatchDuty) | | place + time → scrape footage | [`58c0a5e0` media-forager](https://redfish.acequia.io/guerin/.agents/58c0a5e0-c64e-426e-8da2-ac7f5495d18a/) (online media → STAC) | | fire location + time → recover orbiting fire aircraft | [`2986ff41` adsb-for-heli-videos](https://redfish.acequia.io/guerin/.agents/2986ff41-41ea-4629-bc6b-3ce22f55e628/) + [`31f69717` stac-camera-telemetry](https://redfish.acequia.io/guerin/.agents/31f69717-3c68-4a0d-85d3-9515ec2e91ff/) | | all of the above → one citable catalog | [`90f902e0` catalog](https://redfish.acequia.io/guerin/.agents/90f902e0-2e45-4aa1-b998-918ca3688e94/), [`97559992` cataloging-incident](https://redfish.acequia.io/guerin/.agents/97559992-a73c-47f6-89a6-6565e0c164f3/), [`c38c1239` incident-cataloging](https://redfish.acequia.io/guerin/.agents/c38c1239-bfd3-44dd-8d97-1a0aa39ac8da/) | The `subscribe-wildcad.mjs` `--webhook` / `--ndjson` outputs are the wire: point them at a forager bead's `uploads/` dock (offer-only, never an in-place write) so a new ignition fans out automatically. This is the project_agent-coordination-pattern stigmergy — the ignition lands in a dock and a forager picks it up.

## 5. Other early-detection sources beyond WildCAD WildCAD is dispatch-side. The strongest play is **fusing it with satellite and authoritative-system feeds**, since each has a different latency/coverage/confidence profile. Survey: - **NASA FIRMS** (Fire Information for Resource Management System) — satellite active-fire detections (VIIRS ~375 m, MODIS ~1 km). Each detection: timestamp, lat/long, confidence, Fire Radiative Power. **Area CSV API:** `https://firms.modaps.eosdis.nasa.gov/api/area/csv/<MAP_KEY>/<SOURCE>/<W,S,E,N>/<DAYS>` (e.g. `VIIRS_NOAA20_NRT`). Requires a free MAP_KEY (5000 tx / 10 min). US/Canada variant under `/usfs/api/`. *Complements WildCAD: catches fires before anyone dispatches, but is detection-not-incident and has satellite revisit latency.* Store MAP_KEY as env, not in tree. - **IRWIN** (Integrated Reporting of Wildland-fire Information) — the interagency data-exchange that synchronizes authoritative incident records in near-real-time across systems. Direct access is for connected systems; public access via the **NIFC open-data site**. - **NIFC open data** — `https://data-nifc.opendata.arcgis.com/` — ArcGIS REST feature services for current incident locations, perimeters, etc. Stable, queryable (bbox / where-clause), public. *Good authoritative cross-check + perimeter source.* - **EGP / WildfireSA** (Enterprise Geospatial Portal, next-gen) — the interagency near-real-time common operating picture; integrates IRWIN, DART, IROC, NIROPS, FireGuard, etc. Airborne FMV lives here (already touched by `b3461c66`). - **WatchDuty** — community/crowd wildfire alerts; fast, human-curated; already in `b3461c66`'s scope. Useful for early social signal and evac context. **Recommended fusion posture:** WildCAD/WildWeb = the *dispatch* trigger; FIRMS = the *satellite* trigger; NIFC/IRWIN = the *authoritative* record + perimeters. A future sibling skill `subscribe-firms.mjs` would mirror this bead's normalized-record contract so both feed the same fan-out (open question Q3 below).

## 6. Open questions (gated on Stephen) 1. **Which centers / region to watch first?** A specific GACC or forest (worked example), or a national sweep? Center-code discovery for a national sweep needs a registry crawl — scope it or pick a few. 2. **Where does the fan-out land?** Wire `--webhook`/NDJSON directly into a forager bead's `uploads/` dock now, or keep this bead emit-only and let the [`4c6470f9` bead-orchestrator](https://redfish.acequia.io/guerin/.agents/4c6470f9-b74a-4aba-b436-5e998f469cce/) route ignitions? 3. **One subscriber or many?** Keep WildCAD-specific here and add `subscribe-firms.mjs` / `subscribe-nifc.mjs` as siblings sharing the normalized schema, or generalize to one multi-source `subscribe-ignitions.mjs`? 4. **Liveness rung.** Run as a cron/`/loop` poller on the CV node, or promote to an OS-level animator daemon per the bead-handler liveness ladder ([`fe7fbaf5`](https://redfish.acequia.io/guerin/.agents/fe7fbaf5-4c47-43b6-be1b-2f6ca15e8bfa/))? 5. **Dedupe persistence.** Seen-set in memory (per-run) vs a persisted `seen.json` in `artifacts/` so a restarted poller doesn't re-fire old incidents.

## Sources - WildCAD-E portal: https://www.wildfire.gov/application/wildcade - WildWeb (legacy): http://www.wildcad.net/ - nf-firebot scraper (endpoint shapes): https://github.com/acceptableEngineering/nf-firebot - NASA FIRMS Area API: https://firms.modaps.eosdis.nasa.gov/api/area/ - IRWIN: https://www.wildfire.gov/application/irwin-integrated-reporting-wildfire-information - NIFC open data: https://data-nifc.opendata.arcgis.com/ - EGP / WildfireSA: https://egp.wildfire.gov/egp/data/

## References (bead cross-links) - Bead: Wildfire Imagery Acquisition & Catalog Ops · [canonical](https://redfish.acequia.io/guerin/.agents/b3461c66-1a49-4f62-8920-d6dcc9838942/) - Bead: Media Forager · [canonical](https://redfish.acequia.io/guerin/.agents/58c0a5e0-c64e-426e-8da2-ac7f5495d18a/) - Bead: Bead · [canonical](https://redfish.acequia.io/guerin/.agents/2986ff41-41ea-4629-bc6b-3ce22f55e628/) - Bead: Stac Camera Telemetry · [canonical](https://redfish.acequia.io/guerin/.agents/31f69717-3c68-4a0d-85d3-9515ec2e91ff/) - Bead: Catalog · [canonical](https://redfish.acequia.io/guerin/.agents/90f902e0-2e45-4aa1-b998-918ca3688e94/) - Bead: Cataloging Incident · [canonical](https://redfish.acequia.io/guerin/.agents/97559992-a73c-47f6-89a6-6565e0c164f3/) - Bead: Incident Cataloging · [canonical](https://redfish.acequia.io/guerin/.agents/c38c1239-bfd3-44dd-8d97-1a0aa39ac8da/) - Bead: Orchestrator · [canonical](https://redfish.acequia.io/guerin/.agents/4c6470f9-b74a-4aba-b436-5e998f469cce/) - Bead: As Webdav Handler · [canonical](https://redfish.acequia.io/guerin/.agents/fe7fbaf5-4c47-43b6-be1b-2f6ca15e8bfa/)