Skip to content

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

FactValue
Published atraqdps/sites/<site-slug>.json
ParseparseSmokeDocument(Json) from @azohra/meteo.briefing/contract
Zod authoritysmokeDocumentSchema
JSON Schemasmoke.schema.json
Discoverythe 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.

FieldUnitMeaning
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.
smokePlumeColumnMgm2mg/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_raqdps tree: there is no model_raqdps-fw/ directory, whatever older MSC documentation implies. Files live under https://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; the hpfx.collab.science.gc.ca mirror 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.