Smoke document
The smoke document is the contract’s first non-profile document kind: a
per-site, per-run time series of wildfire smoke from an air-quality
model — ECCC’s RAQDPS (GEM-MACH) today. It exists because the
wind-profile models this dataset publishes for Canada are smoke-blind,
and folding another model’s smoke into their profiles would break the
one-model-per-document rule. Consumers join a smoke document to a
profile by site and validAt instead, and label the join with both
models’ runs.
On the wire
| Fact | Value |
|---|---|
| Published at | raqdps/sites/<site-slug>.json |
| Parse | parseSmokeDocument(Json) from @azohra/meteo.briefing/contract |
| Zod authority | smokeDocumentSchema |
| JSON Schema | smoke.schema.json |
| Discovery | the catalogue’s smokeModels array — deliberately separate from models, so consumers that predate smoke keep parsing the catalogue untouched |
Shape and units
{ "schemaVersion": 1, "model": "raqdps", "run": { "referenceTime": "2026-08-10T00:00:00Z", "generatedAt": "2026-08-10T02:12:41Z" }, "site": { "id": "dundee", "name": "Dundee", "latitude": 49.291977, "longitude": -117.183569, "timeZone": "America/Vancouver" }, "hours": [ { "validAt": "2026-08-10T01:00:00Z", "pm25Ugm3": 37.5, "smokePlumeSurfaceUgm3": 37.5, "smokePlumeColumnMgm2": 4.8 } ]}A document captured from the reference deployment’s founding catalogue
(dundee), kept for its real values; that dataset went private with the
engine/instance split.
| Field | Unit | Meaning |
|---|---|---|
pm25Ugm3 | µg/m³ | Total near-surface PM2.5, all sources — the air-quality number. |
smokePlumeSurfaceUgm3 | µg/m³ | The wildfire-smoke share of that PM2.5 at the surface. |
smokePlumeColumnMgm2 | mg/m² | Vertically integrated wildfire-smoke PM2.5, as published — currently quarantined from derived optics. |
The site block carries identity and the timezone echo only — no elevations, because terrain is a profile concern, not an air-quality one. Hours are all forecast hours, chronological, like a profile’s.
RAQDPS publishes no optical-depth field (verified 2026-08-09: the
live Datamart tree carries concentration and column-mass files only), so
optical thickness would be derived downstream from the column through a
cited mass-extinction efficiency — see
smokeAotFromColumn in @azohra/meteo.briefing/derive
and the narrative in Smoke and thermals.
Read the next section before using that derivation on this document’s
column.
The column field carries a provider defect
Verified 2026-08-10 against the raw provider GRIBs, HRRR, and GOES-18: the provider declares a column integrated over the entire atmosphere, but the measured content behaves as the surface concentration times a ~50–250 m near-surface slab — it correlates with RAQDPS’s own surface field, not with a real column, and in heavy smoke it runs ~15–26× below satellite-consistent columns. The builder’s read and unit conversion are faithful to the published GRIB; the defect is upstream, and it was reported to ECCC on 2026-08-10.
The field is therefore quarantined from any derived optics: the
analyze smokeImpact kind republishes it
raw as the document’s own fact and carries no AOT for joined days. The
quarantine is a note on the field itself — the contract’s
smokePlumeColumnMgm2 JSDoc
is the fact’s one home, carrying the full measurements, the
upstream-report status, and the re-arbitration trigger (GOES AOD when
ECCC responds, or ~September). The surface field does not share the
problem.
Provider facts — verified 2026-08-09
- The Datamart folds the wildfire products into the plain
model_raqdpstree: there is nomodel_raqdps-fw/directory, whatever older MSC documentation implies. Files live underhttps://dd.weather.gc.ca/YYYYMMDD/WXO-DD/model_raqdps/10km/grib2/HH/hhh/with the usual MSC one-message-per-file naming (…_MSC_RAQDPS_PM2.5-WildfireSmokePlume_Sfc_RLatLon0.09_PThhhH.grib2). - Grid
RLatLon0.09(~10 km), runs 00Z and 12Z, hourly steps to 72 h; thehpfx.collab.science.gc.camirror serves identical paths. A PM10 wildfire-plume pair exists alongside the PM2.5 one (not currently published here), plus NO2, NO, O3, SO2, and plain PM10/PM2.5. - The GRIB messages carry no units metadata. The SI base units were established from live field statistics: surface concentrations arrive in kg/m³ and the column in kg/m² (that day’s national maxima — 1.4×10⁻⁶ and 1.2×10⁻⁴ — are physically plausible only in kg-based units). The builder converts to µg/m³ and mg/m² at fetch.
- Fetch cost: three whole-domain files per forecast hour, ~0.6 MB together — roughly 43 MB per run, 86 MB per day.
Joining a smoke document to a profile
The two models run on different schedules — RAQDPS twice daily, HRDPS
four times — so a joined pair usually mixes runs. RAQDPS’s 72 h horizon
covers HRDPS’s 48 h at the worst offset (12 + 48 = 60 < 72), so the join
never runs dry, but any view built on it must surface the smoke run’s
referenceTime beside the profile’s rather than implying same-run
provenance. smokeHoursByValidAt in
@azohra/meteo.briefing/derive does the alignment; the
scene graph’s smokeSource carries the label. Models that publish their
own smoke (HRRR) never need the join — their profiles carry a
same-run smoke block instead, and
when both exist the profile’s own block wins.