Evidence
The record behind every forecast
Each published forecast is saved with the data it used, the model version, cryptographic hashes of its inputs and output, and the result of the automatic quality checks. Download any forecast’s replay file to check it or reproduce it.
The forecasts on the site now
| Hazard | Forecast and model | Issued | Hashes (SHA-256) | Quality checks |
|---|---|---|---|---|
| Earthquake | eq_fcst_20261019_0600eq_operational_S2_gear1_v2-ecb87f020f99 | in c68cd9861afb…out a30d8d3670f9… | Passed | |
| Hurricane | hu_fcst_20261019_0336hurricane_ri_v8_3 | in eacefd0f0add…out 708902cf144d… | Published with warnings | |
| Tornado | to_fcst_20261019_0519tornado_v3-05a06c843c87 | in 76e83a1bed41…out 4b2a2b07227d… | Passed |
Quality checks
| Hazard | Passed | Published with warnings | Blocked |
|---|---|---|---|
| Earthquake | 29 | 0 | 0 |
| Hurricane | 0 | 28 | 0 |
| Tornado | 92 | 0 | 0 |
Most frequent findings: Hashes missing for: model file, input data, receipt (28); Calibration on live forecasts not yet measured (too few closed forecasts with events) (28).
Every forecast goes through these checks when it is published. Each ends in one of three outcomes: passed; published with warnings — a non-blocking check flagged something, and the warning is shown with the forecast; or blocked — the forecast is withheld from every page.
- Well-formed. The probability, and any range, are finite numbers.
- Fresh inputs. The input data is recent enough for the hazard’s schedule.
- Complete record. The model version, the hashes of the model file, inputs and receipt, and the replay file are all recorded.
- Calibration. The model’s measured calibration on live forecasts is within bounds (a warning until enough forecasts with events have closed).
- Sane values. Coordinates are valid, the probability is between 0 and 1, and the grid is no finer than the published resolution.
- No confident alarm on weak evidence. A high chance is never shown on inputs unlike the training data or with a very wide range.
- Reproducible. A replay file exists, so the forecast can be re-run.
- No official terms. Labels never use terms reserved for official warnings.
Forecast ledger
Every forecast is appended to a ledger in which each entry includes the hash of the one before it. Changing any past forecast would change its hash and break every link after it, so the history cannot be edited without it showing.
| Hazard | Forecast | Issued | Headline chance | Entry hash |
|---|---|---|---|---|
| Earthquake | eq_fcst_20261019_0600 | 15.2% | a4f154d12c57… | |
| Tornado | to_fcst_20261019_0519 | <0.1% | 160b48426b70… | |
| Hurricane | hu_fcst_20261019_0336 | 12.8% | 574274f65330… | |
| Tornado | to_fcst_20261019_0317 | <0.1% | 12a22995440a… | |
| Tornado | to_fcst_20261019_0116 | <0.1% | dee8d71cf02e… | |
| Earthquake | eq_fcst_20261019_0000 | 14.8% | 97d9bd902460… | |
| Tornado | to_fcst_20261018_2315 | <0.1% | 8cf6fdab9108… | |
| Hurricane | hu_fcst_20261018_2132 | 6.0% | 246da91d43f1… | |
| Tornado | to_fcst_20261018_2113 | <0.1% | 2b0e9261daae… | |
| Tornado | to_fcst_20261018_1912 | <0.1% | 61db9759d782… | |
| Earthquake | eq_fcst_20261018_1800 | 15.3% | 66f759f67ffd… | |
| Tornado | to_fcst_20261018_1710 | <0.1% | 6f89d9d35140… | |
| Hurricane | hu_fcst_20261018_1537 | 3.8% | 1508386c2973… | |
| Tornado | to_fcst_20261018_1509 | <0.1% | 7fc6dfd9f3ac… | |
| Tornado | to_fcst_20261018_1308 | <0.1% | 7b5f3a43ca9c… | |
| Earthquake | eq_fcst_20261018_1200 | 15.6% | 0814831db097… | |
| Tornado | to_fcst_20261018_1107 | 0.1% | 6ff7fd272a58… | |
| Hurricane | hu_fcst_20261018_0933 | 5.5% | 7c59280e8486… | |
| Tornado | to_fcst_20261018_0905 | <0.1% | 47b5748182bf… | |
| Tornado | to_fcst_20261018_0655 | 0.1% | c869327b10ef… |
The full ledger (JSON) · Input records (JSON) · Every quality-check record (JSON)
Replay files
Every forecast’s replay file holds the inputs, the model version and the output exactly as published; the ledger above links each one. All of them are listed in the replay index (2,871 files, JSON) and served from /data/replay/<forecast id>.json.
Check a forecast yourself
- Download a forecast’s replay file from the table above or from
/data/replay/. - Recompute its SHA-256 hash and compare it with the output hash in the input record (
/api/v1/evidence/prov_<forecast id>). - Check that the ledger entry for the forecast carries the same hash and that each entry’s
prev_hashmatches the entry before it. - Where a forecast carries a signed receipt (earthquake and tornado forecasts do), verify its signature with our Ed25519 public key:
c536bdfe6cbb4cf4….
The scripts that do this are in the source repository (scripts/verify_forecast.py).