From 65c247f8e2dee502df9b1f662dc332dd2b0e6b8d Mon Sep 17 00:00:00 2001 From: Polichinl Date: Mon, 20 Jul 2026 02:40:34 +0200 Subject: [PATCH] =?UTF-8?q?docs(closeout):=20S8/#113=20=E2=80=94=20epic=20?= =?UTF-8?q?#105=20shipped;=20ADR=20post-adoption=20entry;=20C-45=20resolve?= =?UTF-8?q?d=20(frames.py=20on=20the=20live=20path)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- docs/ADRs/013_sampled_forecast_wire_contract.md | 14 ++++++++++++++ reports/technical_risk_register.md | 6 ++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/ADRs/013_sampled_forecast_wire_contract.md b/docs/ADRs/013_sampled_forecast_wire_contract.md index 0566c6e..6cd015f 100644 --- a/docs/ADRs/013_sampled_forecast_wire_contract.md +++ b/docs/ADRs/013_sampled_forecast_wire_contract.md @@ -1044,6 +1044,20 @@ record execution progress against it. (maintainer: "fix this through the pipeline"): lifting the `<17` ceiling at its source is filed as pipeline-core#280; when it lifts, the fixture gets one planned re-baseline, coordinated, never a drive-by.** +- **2026-07-20 — HOP-B SINK LEG SHIPPED (epic #105 complete; upload-disabled).** + The contract's missing middle exists in fixture-proven code: + `unfao/wire/` (naming, header, shard, sidecar, run_manifest, source_selection, + sink) + `unfao/product.py` + `delivery/parity.py`, wired into the manager + behind an explicit declared `wire_contract` launch key. Settled by shipping: + **§4.2a's configuration home is `unfao/product.py`**; **§5.2's parity + invariant is `delivery/parity.py`**; the §11.4 upload interlock is live in + code (`product.UPLOAD_ENABLED=False`; the default configuration provably makes + zero store calls — golden-tested). The e2e capstone proves the anti-corruption + role end to end: fixture Track-A artifacts in → **byte-identical** fixture + Hop-B artifacts out, §6 gate first, manifest uploaded last, every document + under the pinned `un_fao` name (the F1 fix, in code). First live enablement + remains gated on C-161 closure (faoapi #184 release). Stories: vpp #106–#113; + PRs #115–#121. - **2026-07-19 — retention direction given (maintainer): a configurable retention period with automatic deletion** (e.g. 12 or 36 months — the value to be decided with the owner). This settles the *shape* of the §3.5 policy; the owner diff --git a/reports/technical_risk_register.md b/reports/technical_risk_register.md index 6a322b1..5235ef1 100644 --- a/reports/technical_risk_register.md +++ b/reports/technical_risk_register.md @@ -6,8 +6,8 @@ | Owner | Dylan Pinheiro / PRIO MD&D Team | | Last Updated | 2026-07-19 | | Total Concerns | 55 | -| Open Concerns | 26 | -| Resolved Concerns | 29 | +| Open Concerns | 25 | +| Resolved Concerns | 30 | --- @@ -531,6 +531,8 @@ No silent corruption and no current breakage (development is green on 2.3.0) → **Partly addressed by S1 (epic #85 / #86, 2026-06-28).** `frames.py` was reworked to the declare-don't-guess design (D-11): it now exposes `build_prediction_frame` / `build_target_frame` over **declared primitives** (a 2-D `(N, S)` array + `(time, unit)`), supports **S>1** (the `S=1` hardcode is gone), is **pandas-free** (no longer the lone pandas importer — it sits alongside `delivery/`), and fails loud rather than inferring/reshaping. So the *S=1-hardcode*, *inference-risk*, and *pandas-coupling* dimensions are resolved. **Residual (entry stays open):** the module is still **not called by the live delivery path** — that wiring is S3 (#88, forecast convert-at-the-door). C-45 resolves when S3 lands (or, if S3 is abandoned, when the module is removed). +**RESOLVED 2026-07-20 (epic #105, S6/S7 — the wiring landed):** `frames.build_prediction_frame` is now on the live contract path — `track_a_source` constructs every interior frame through it, called by `wire/source_selection.fetch_run`, which the manager's declared contract mode invokes (`_read_forecast_data_contract`). The conformance scaffolding became the load-bearing constructor exactly as intended. (#88 was superseded by #105/#111; the wiring shipped there.) + See also C-40 (the pandas gate this adapter anticipates), #45 (the draws carrier that will need the `S>1` version), epic **#85** / **#86** (the S1 rework) / **#88** (the S3 wiring that closes this), **D-11** (the declare-don't-guess decision). ---