You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Epic:#51 · S3 · depends on #61 (S0) · storyimplementation
Problem (C-25)
The forecast is selected by category="forecast" alone (unfao.py:98, newest-wins) — no loa/name/run filter. A stray upload silently ships the wrong predictions to FAO.
Build shape (per the epic design contract)
delivery/identity.py (representation-free): assert_forecast_identity(selected: dict, expected: dict) -> None over plain dicts (name/loa/etc.). No pandas.
Manager: constrain the selection to the configured ensemble (name + loa="pgm"), or validate the selected file's metadata post-download via the invariant; fail loud on mismatch; log the chosen file identity.
Acceptance criteria
delivery/identity.py pure + pandas-free; unit-tested on dicts.
A decoy category="forecast" file with a different name is rejected; the correct one selected.
Delivered and merged to development via #64 (input-integrity sprint S0–S6). ruff clean, 126 passed / 44 xfailed. Closing — the auto-close keyword did not fire because #64 merged into development, not the default branch. Live-run validation of the residual contracts (C-25 identity name/loa, C-43 enrichment equivalence) is tracked in the risk register and exercised by the go-global run (views-models#127).
Activity
[-]S3 — Verify forecast-file identity before enrichment (C-25)[/-][+]S3 — Forecast-file identity invariant (C-25)[/+]feat(delivery): input-integrity invariant S3 — forecast-file identity…
Polichinel commentedon Jun 26, 2026
Delivered and merged to
developmentvia #64 (input-integrity sprint S0–S6). ruff clean, 126 passed / 44 xfailed. Closing — the auto-close keyword did not fire because #64 merged intodevelopment, not the default branch. Live-run validation of the residual contracts (C-25 identity name/loa, C-43 enrichment equivalence) is tracked in the risk register and exercised by the go-global run (views-models#127).