How confidence is computed
Each score carries both a scalar confidence (0–1) and a rich confidenceDetail block. The scalar is a deterministic fold of the detail; read the detail when you want to show users how certain the model is about the inputs behind a verdict.
The scalar
confidence is a number between 0 and 1 — the deterministic product of five [0,1] factors: forecast_skill × provider_agreement × profile_maturity × hierarchical_calibration × coverage. Closer to 1 means the engine has high agreement with itself: a short lead time, tight ensemble spread, a mature profile, a calibrated sub-spot, low drift. Because it's a product, no single factor can lift the score on its own, and a far-out forecast against a brand-new profile compounds toward a low number — the cold-start near-term baseline sits around 0.55–0.62. Below 0.5 means the score is workable but the underlying signal is sparse or uncertain; treat it as a directional hint, not a verdict you'd bet a session on. It measures the model's certainty about its own inputs and data coverage, not a guarantee that the verdict is correct.
The detail block
confidenceDetail is a discriminated union by mode: forecast, historical or climate. The fields you get depend on which scoring surface produced the response. The values below are illustrative.
{
"mode": "forecast",
"forecast_skill": 0.78, // horizon-decaying skill prior: ~0.90 nowcast → ~0.51 at 16 days
"provider_agreement": 0.88, // ensemble / provider-chain spread
"profile_maturity": 0.95, // provisional 0.75 · reviewed 0.85 · calibrated 0.95
"hierarchical_calibration": 0.95,
"data_coverage": 0.95 // fraction of scoring weight with live data
}Forecast mode
Returned by /v1/score only. /v1/score/series and /v1/score/multi carry just the scalar confidence, not the detail block. Factors:
- Forecast skill (
forecast_skill): a horizon-decaying skill prior. Confidence is highest for a near-term verdict and falls as the lead time grows —≈ 0.90for a nowcast,≈ 0.78at 24h,≈ 0.69at 72h,≈ 0.60at 7 days, down to≈ 0.51at the 16-day horizon limit. On the ensemble path it additionally folds in member spread. This is an honest prior, not yet a measured per-stratum skill; as paired outcomes accumulate it will be replaced by measurement. - Provider agreement (
provider_agreement): how much the consensus provider chain agrees for this request. A single source is1.0— one provider is not penalised for being alone. On the ensemble path, confidence additionally folds in member spread — narrow distribution = high confidence, wide = chaotic state. - Profile maturity (
profile_maturity): rises as a profile is calibrated against outcomes —provisional(0.75),reviewed(0.85),calibrated(0.95). A fresh profile with no operator outcomes scores lower confidence than one calibrated against many paired outcomes. - Hierarchical calibration (
hierarchical_calibration): how locally the spot resolved. A sub-spot with n≥100 outcomes scores 1.0. Falling back to cluster or regional level scores 0.85–0.95.
Historical mode
Returned by /v1/score/historical. Confidence reflects sample size and reanalysis coverage: older years (pre-1979 for marine, pre-1940 for atmospheric) carry lower confidence even when the score distribution looks tight.
Climate mode
Returned by /v1/projections. Per-decade entries carry their own confidence detail folded from CMIP6 ensemble spread + the sub-spot bias correction's posterior. Long-horizon projections are intrinsically less confident than near-term forecasts; that's encoded explicitly here rather than hidden in the scalar.
drift_flag
When the drift monitor has flagged decision-calibration drift for the cell your request lands in, confidenceDetail.drift_flag is set to "watch", "warning" or "critical". Show a UI hint and consider rolling back to a previous calibrated curve; the flag signals that the cell's decision Brier Skill Score against operator-reported outcomes is declining. (A separate forecast-skill monitor is planned but not yet live.)