# Energy episodes v1 — 20 October 2026

Read: https://offdiagonal.space/api/public/v1/handoff/energy?limit=100&scoring_at=2026-10-20T00%3A00%3A00Z

## Verified coverage

- 2,489 stored NDF point forecasts, 49 source publication documents.
- 1,449 forecast revisions matched to 95 distinct resolved half-hour national-demand targets at the scoring cutoff above. Revisions are not independent episodes.
- One independent family: NESO demand forecasts. No multi-family failure claim.
- INDO outturns are provisional operator observations, not final settlement figures.
- Existing NDF forecast collection continues six-hourly; a separate authenticated INDO outcome collector runs six-hourly.

## Reader contract

Follow `next_cursor` until `terminal: true` on an explicitly empty page. Keep the same `scoring_at` on every request. This is a live feed, not yet a frozen training release; do not treat a changing feed as an immutable snapshot.

Each record preserves issue, publication, capture, decision and target clocks; point forecasts remain points in MW. Only national boundary `neso_ndf:N` matches national-demand INDO. Other boundaries remain visible but ineligible for this join. Missing outcomes stay null with a reason.

`decision_at` defaults to the provider publication time; supply an explicit `decision_at` to test a later decision. Forecasts published after that decision and decisions at or after target start are excluded by `admission`. Supervision selects the latest stored outcome vintage published by `scoring_at`; revisions remain an append-only chain. Outcome IDs normalize UTC timestamps so different timestamp spellings cannot split one target into two identities.

`supervision` and `outcome_revision_chain` are labels/audit information only, never model inputs. Admit a forecast row only when `admission.eligible` is true; deduplicate on `outcome_uid` for independent outcome counts and split isolation. Do not invent confidence intervals, independent families, weather links or final settlement status.

All held energy data is cleared for sharing with Zeno and training. Admission exclusions here concern chronology and target/outcome matching only.

## Pending release work

Weather context: `/api/public/v1/handoff/weather-impact?forecast_id=<energy forecast_id>&scoring_at=<fixed UTC cutoff>`. This attaches the latest visible single-run forecast for each model/channel at configured GB land sites (currently London) only when its valid time falls inside the half-open demand target interval. No interpolation, national weather average, causal claim, merged outcome identity or extra demand forecaster is created. Missing time coverage remains explicit. `availability_verified` distinguishes witnessed publication from a labelled historical availability bound; preserve that distinction in training. Capture time never replaces publication time. Weather outcomes are not demand labels. All context rows inherit the demand `split_group` to prevent crossing splits.

Energy still needs the frozen episodes-v3 pack and manifest/snapshot checks before inclusion in an immutable training run. The first execution of the newly scheduled outcome job is not yet observed; manual authenticated captures and complete public readback were verified.