Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
f9f1587
fix(delivery): C-77 — name the historical document from the declarati…
Polichinel Aug 4, 2026
2c57bd6
Merge pull request #218 from views-platform/fix/c77-historical-consum…
Polichinel Aug 4, 2026
f470d6f
docs(adr): ADR-015 — why this repo imports another project's Appwrite…
Polichinel Aug 4, 2026
6c5d4fd
Merge pull request #219 from views-platform/docs/adr-015-pipeline-cor…
Polichinel Aug 4, 2026
8039f72
feat(build): #90 — build the GAUL lookup arrow-native, and refuse an …
Polichinel Aug 4, 2026
1013787
Merge pull request #220 from views-platform/feat/90-pyarrow-native-lo…
Polichinel Aug 4, 2026
8e526db
refactor: C-75 — retire GaulLookupEnricher; epic #85's pandas claim b…
Polichinel Aug 4, 2026
8459c80
Merge pull request #221 from views-platform/refactor/c75-retire-gaul-…
Polichinel Aug 4, 2026
a69d1a0
fix(delivery): C-79 and C-83 — two refusals on the live FAO path
Polichinel Aug 5, 2026
11ea673
Merge pull request #222 from views-platform/fix/c79-c83-delivery-refu…
Polichinel Aug 5, 2026
0d54b6e
test(docs): C-80 — scan ADRs and CICs; three stale paths found and fixed
Polichinel Aug 5, 2026
758490c
Merge pull request #223 from views-platform/test/c80-scan-adrs-and-cics
Polichinel Aug 5, 2026
dc8c339
docs(register): C-82 — guard the prose claims that can be guarded, dr…
Polichinel Aug 5, 2026
3f88897
Merge pull request #225 from views-platform/test/c82-register-prose-h…
Polichinel Aug 5, 2026
f0128f3
docs(adr-013): #133 — Amendment A2 for run maturity, drafted and not …
Polichinel Aug 5, 2026
8db5602
Merge pull request #226 from views-platform/docs/adr013-provenance-ma…
Polichinel Aug 5, 2026
237378d
refactor(managers): C-40 — store construction off the manager class
Polichinel Aug 5, 2026
9ad1037
Merge pull request #227 from views-platform/refactor/c40-store-constr…
Polichinel Aug 5, 2026
9420f5a
feat(ci): declare sibling visibility, and un-dark seven cross-repo ch…
Polichinel Aug 9, 2026
124cf47
fix(tests): G8 compared two different "today"s — one day of clock slack
Polichinel Aug 9, 2026
e902c1f
docs(register): C-81 — the measured CI figure, 16 skips to 9
Polichinel Aug 9, 2026
7ecbfe1
Merge pull request #229 from views-platform/feat/sibling-visibility-d…
Polichinel Aug 9, 2026
2ae1c73
refactor(tests): drop the circular half of the sibling declaration
Polichinel Aug 10, 2026
fb10cfe
docs(adr): ADR-017, and a falsification pass over both ADRs
Polichinel Aug 10, 2026
169b976
docs(adr): second falsification pass — three more defects
Polichinel Aug 10, 2026
a837c63
docs(adr): accept 016 and 017, and fix two findings from the diff review
Polichinel Aug 10, 2026
fab6456
Merge pull request #230 from views-platform/refactor/simplify-sibling…
Polichinel Aug 10, 2026
0a71c05
docs(adr): address four external reviews of ADR-016 and ADR-017
Polichinel Aug 10, 2026
a3a7604
Merge pull request #235 from views-platform/docs/adr-016-017-review-f…
Polichinel Aug 10, 2026
60908d1
docs(register): C-86 and C-87 — the two residuals ADR-016 and ADR-017…
Polichinel Aug 10, 2026
ee9453b
Merge pull request #236 from views-platform/docs/register-adr016-017-…
Polichinel Aug 10, 2026
1a874bd
docs(adr-013): Erratum E3 — lift the pipeline_core_version caveat, in…
Polichinel Aug 10, 2026
2eb29f1
Merge pull request #237 from views-platform/docs/adr013-lift-pipeline…
Polichinel Aug 10, 2026
2d3b2c5
docs(adr): the picture, the tables, and where declarations belong
Polichinel Aug 11, 2026
bcdf522
test(readability): four things a maintainer new to this decision coul…
Polichinel Aug 11, 2026
2d41474
test(registry): match on the rows we read, not on the edition label
Polichinel Aug 11, 2026
3f3f570
test(product): #238 D3+D4 — the delivery label reads the registry, no…
Polichinel Aug 11, 2026
8e1b874
chore(seam): re-pin both partners to registry v1.5.2 / b703cab
Polichinel Aug 11, 2026
898a0aa
fix(tests): fifteen findings from /code-review max, one of them shipp…
Polichinel Aug 11, 2026
3d5a244
fix(tests): four findings from /review-diff — the sixteenth, and thre…
Polichinel Aug 11, 2026
89fc555
fix(tests): iteration 2 — a scan blind in its own house style, and on…
Polichinel Aug 11, 2026
f7ec271
fix(tests): iteration 3 — the scan was blind in a second house style,…
Polichinel Aug 11, 2026
f7451e6
Merge pull request #239 from views-platform/test/registry-check-reads…
Polichinel Aug 11, 2026
9f73543
docs(register): C-89..C-96 — the post-merge review of #239, and the d…
Polichinel Aug 12, 2026
6b175a7
fix(tests): #242 — the no-copy guard must not publish what it forbids
Polichinel Aug 12, 2026
4917610
fix(tests): #242 iteration 2 — routing is not safety, so read the mes…
Polichinel Aug 12, 2026
29bb769
fix(tests): #242 iteration 3 — the channels a message test cannot see
Polichinel Aug 12, 2026
f337269
fix(tests): #242 iteration 4 — delete most of what the first three added
Polichinel Aug 12, 2026
3e88305
Merge pull request #252 from views-platform/fix/242-no-copy-scan-must…
Polichinel Aug 12, 2026
27f2adc
fix(tests): #245 — delete the arrival check; it subscribed us to anot…
Polichinel Aug 12, 2026
ff1de31
fix(tests): #245 review — a counterfactual written as history, and a …
Polichinel Aug 12, 2026
79abda7
fix(tests): #245 review-diff — the silence guard was not pointed at t…
Polichinel Aug 12, 2026
046ca06
fix(tests): #245 iteration 2 — nothing proved the check FIRES
Polichinel Aug 12, 2026
33a38f7
fix(tests): #245 review-diff 2 — a tautology, in the commit that fixe…
Polichinel Aug 12, 2026
360d095
Merge pull request #253 from views-platform/fix/245-delete-the-arriva…
Polichinel Aug 12, 2026
8ca39db
fix(tests): #248 — delete both consumer source-reads; the category is…
Polichinel Aug 12, 2026
b82fca0
fix(docs): #248 review — I repealed a rule on a false claim about ano…
Polichinel Aug 12, 2026
e806dfe
docs(adr-017): check the "same commit" claim instead of asserting it
Polichinel Aug 12, 2026
ef47ba6
Merge pull request #254 from views-platform/fix/248-delete-the-consum…
Polichinel Aug 12, 2026
5925551
fix(tests): #243 — match the pair, and let the corpus decide when the…
Polichinel Aug 12, 2026
33bbc4c
Merge pull request #255 from views-platform/fix/243-pair-matching-and…
Polichinel Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 31 additions & 23 deletions .github/workflows/run_pytest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,36 +27,44 @@ jobs:
# is normal. The consequence was that CI verified strictly LESS than a developer's
# laptop, and precisely on the guards that matter most across a repo boundary.
#
# Measured 2026-08-03 (402 collected in all three runs, so the delta is entirely
# skips):
# local, all siblings present 362 passed / 40 xfailed / 0 skipped
# CI, bare checkout 347 passed / 38 xfailed / 17 skipped
# CI, with the checkout below 348 passed / 38 xfailed / 16 skipped
# WHICH siblings are checked out is NOT decided here. It is declared in
# `tests/conftest.py::SIBLINGS`, and `tests/test_ci_sibling_coverage.py` fails if
# this file and that declaration disagree — in either direction. ADR-016.
#
# So this recovers exactly ONE test — the cross-seam consumer-name check for CRAF'd.
# That is worth having (it is the §4.1a pin, whose failure mode is a delivery nobody
# can find) but it is one, not seventeen. The other sixteen are below.
# The prose that used to live here said views-appwrite was PRIVATE. It went public
# on 2026-08-08 and the comment did not, so seven checks stayed dark for no reason.
# That is why the fact now lives in a declaration carrying the date it was checked,
# rather than in a paragraph.
#
# Only views-crafdapi is checked out, and the choice is deliberate:
# `ref: main` is deliberate on every sibling and is not a default. Without it
# `actions/checkout` takes the sibling's OWN default branch — which for
# views-appwrite is `development` — while ADR-014 §3 says the authority for a claim
# about another repository is that repository's `main`. Two checks in
# test_env_declaration read the working tree and a third demands reachability from
# `main`; pointed at `development` they would eventually demand contradictory things.
#
# views-crafdapi PUBLIC, and its check reads source text -> enabled here.
# views-datafactory PUBLIC, but its 8 tests need the producer's raw GAUL
# parquets (`data/raw/gaul_admin/*.parquet`), which are NOT in
# its git repository. Checking it out converts an honest skip
# into a FileNotFoundError. Measured, not assumed — it was tried.
# views-appwrite PRIVATE. The registry-drift detectors live here and are the
# views-faoapi most valuable of the lot; enabling them needs a token, which
# is an operator decision. Register C-46 and C-57 both carry
# that as their standing residual, and it is still open.
# `actions/checkout` refuses a path outside $GITHUB_WORKSPACE, so the siblings go
# inside it and are pointed at by the declared env vars instead of the conventional
# `../<name>` location. `sibling_repo` checks $VIEWS_<NAME> first, precisely so the
# location can be declared rather than assumed.
- name: Checkout views-crafdapi (sibling)
# location can be declared rather than assumed. `_siblings/` specifically: it is
# excluded from ruff in pyproject.toml, and the Lint step reported 745 findings in
# someone else's test suite the first time a sibling landed outside it.
#
# No `token:` on any step below, and that is load-bearing rather than an omission:
# the default GITHUB_TOKEN is scoped to THIS repository, so a tokenless checkout of a
# private repository simply fails, loudly, at this step.
#
# An earlier version of this comment said that "verifies the `public` field". There is
# no such field: `public` was deleted from `SIBLINGS` on 2026-08-10 because nothing
# could verify it, and ADR-016 §4 now says so explicitly. A comment in THIS file
# asserting a fact about another repository that nothing checks is the founding
# incident of ADR-016 §3, and it had reappeared here.
- name: Checkout views-appwrite (sibling)
uses: actions/checkout@v3
with:
repository: views-platform/views-crafdapi
path: _siblings/views-crafdapi
repository: views-platform/views-appwrite
ref: main
path: _siblings/views-appwrite
fetch-depth: 0

- name: Set up Python
Expand All @@ -80,7 +88,7 @@ jobs:

- name: Run tests
env:
VIEWS_CRAFDAPI: ${{ github.workspace }}/_siblings/views-crafdapi
VIEWS_APPWRITE: ${{ github.workspace }}/_siblings/views-appwrite
run: |
set -e
poetry run pytest tests/
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Requires **Python 3.11–3.14**.
| Package | Version | Why |
|---------|---------|-----|
| `views-pipeline-core` | `>=3.0.0,<4.0.0` (with the `appwrite` extra) | The framework: lifecycle base classes, data loader, dataset container, Appwrite/datastore tools |
| `views-frames` | `>=1.10.2,<2` | The frame data contract — **the live delivery representation** since #126. pandas survives only in `contract/enrichment.py` (the build/verification path) |
| `views-frames` | `>=1.10.2,<2` | The frame data contract — **the live delivery representation** since #126. There is no pandas in this package at all since #90 |
| `pyarrow` | `>=16.1.0,<17.0.0` | The wire's serialisation. **Pinned deliberately** — the CVE fix past 17 changes delivered bytes (register C-72) |
| *dev group* | `pytest`, `ruff` | Not installed by `pip install views-postprocessing`; `poetry install` includes them |

Expand Down Expand Up @@ -142,7 +142,6 @@ views-postprocessing/
│ ├── historical.py # the historical artifact, built pandas-free
│ ├── gaul_lookup.py # the GAUL asset: path, version, one read
│ ├── gaul_schema.py # the 9-column contract, declared as data
│ ├── enrichment.py # GaulLookupEnricher (build/verification path)
│ ├── source_metadata.py # producer (datafactory) facts
│ ├── store_metadata.py # prediction-store facts
│ └── launch_config.py # the delivery mode the launcher must declare
Expand Down Expand Up @@ -220,7 +219,7 @@ only `.py`; it now scans markdown too.)*
|-----|----------------|
| [`docs/architecture/role_and_seams.md`](docs/architecture/role_and_seams.md) | **Start here** — role vs the sibling repos + internal seams |
| [`docs/ADRs/`](docs/ADRs/) | Architecture decisions (esp. ADR-011 mapper→lookup; ADR-012 ontology) |
| [`docs/CICs/`](docs/CICs/) | Class intent contracts (`UNFAOPostProcessorManager`, `GaulLookupEnricher`) |
| [`docs/CICs/`](docs/CICs/) | Class intent contracts (`UNFAOPostProcessorManager`) |
| `reports/technical_risk_register.md` | Tracked risks — C-40 (the remaining pipeline-core inheritance), C-30/C-15 (delivery guards), C-43 (enrichment value verification) |

---
Expand Down
8 changes: 8 additions & 0 deletions docs/ADR-011_implementation_assessment.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
# ADR-011 Implementation Assessment

**Last updated:** 2026-06-12
> **This is a dated snapshot (2026-06-12), not a description of the code today.** It is
> kept as a record of what was known when ADR-011 was assessed. Several things it
> describes as current have since been removed — notably the `.env` credential borrow
> (killed by þing-01 #134; the environment is now declared and validated fail-loud in
> each partner's `appwrite_env.py`) and `self.ensemble_path_manager`, which stopped
> existing on 2026-08-05 when store construction moved off the manager class (register
> C-40). Read §8 in particular as history.

**Status:** Data prerequisites MET — see §10. Implementation unblocked on the data side; verification infrastructure (Appwrite, pipeline-core E2E) still required before switching the pipeline.

---
Expand Down
2 changes: 1 addition & 1 deletion docs/ADRs/000_use_of_adrs.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase
**Informed:** All contributors

---
Expand Down
2 changes: 1 addition & 1 deletion docs/ADRs/001_ontology_of_views_postprocessing.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

**Status:** Superseded by [ADR-012](012_revised_ontology.md) (2026-06-27)
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
2 changes: 1 addition & 1 deletion docs/ADRs/002_topology_and_dependency_rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Status:** Accepted — amended 2026-06-27 (see [Amendment](#amendment-2026-06-27))
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
2 changes: 1 addition & 1 deletion docs/ADRs/003_authority_of_declarations_over_inference.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
2 changes: 1 addition & 1 deletion docs/ADRs/006_intent_contracts_for_non_trivial_classes.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
2 changes: 1 addition & 1 deletion docs/ADRs/008_observability_and_explicit_failure.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
2 changes: 1 addition & 1 deletion docs/ADRs/010_technical_risk_register.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase

---

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# ADR-011: Replace Runtime Spatial Mapper with Precomputed Lookup Table

<!-- legacy-ok-file: this ADR IS the decision to retire the runtime mapper. `PriogridCountryMapper`, `mapping.py`, `geopandas` and the cache machinery are its subject, named throughout and correctly. Marking the document once says that where a reader sees it; marking fourteen lines would be noise pretending to be rigour. -->

**Status:** Accepted
**Date:** 2026-06-02
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase
**Consulted:** FAO-FSFC (via Pre-release Note 02 and Release Note 02 confirmation)
**Informed:** All contributors, UN FAO operational team

Expand Down
14 changes: 7 additions & 7 deletions docs/ADRs/012_revised_ontology.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Status:** Accepted
**Date:** 2026-06-27
**Deciders:** Project maintainers (PRIO MD&D Team)
**Decider:** Simon Polichinel von der Maase
**Supersedes:** [ADR-001](001_ontology_of_views_postprocessing.md)

---
Expand All @@ -14,7 +14,7 @@ a **runtime spatial-mapping engine** and **bundled shapefiles** as the authorita
stable core. That architecture no longer exists:

- [ADR-011](011_replace_runtime_mapper_with_precomputed_lookup.md) replaced the runtime
geopandas mapper with a **precomputed GAUL lookup table** (`GaulLookupEnricher`).
geopandas mapper with a **precomputed GAUL lookup table**. <!-- legacy-ok: records what ADR-011 replaced; the mapper is the predecessor, not the present -->
- The mapper, shapefiles, and caching machinery were deleted (C-39 / PR #42).
- Input-integrity invariants and structured delivery were added (epic #51).

Expand Down Expand Up @@ -58,9 +58,9 @@ described the cut-a-repo case; it now says which is which.
| Category | Purpose | Authority | Stability |
|----------|---------|-----------|-----------|
| **Delivery Invariants** | Representation-free rules over primitives that a delivery must satisfy: coverage, no-collapse, gid parity, observed-range, provenance. Live in `delivery/` — **nothing there imports pandas or views_frames**. *Forecast identity was one of these until 2026-07-31 — see the amendment below.* | Authoritative — they define what a valid delivery is | Stable — changes are governance decisions |
| **Representation Seam** | `contract/frame_extraction.py` — turns a `views_frames` frame into the primitives the invariants consume. **One seam.** Its pandas sibling `unfao/extraction.py` was deleted in #151 once the pandas delivery was retired; the two ran as deliberate WET siblings through the migration. | Derived — isolates the representation so invariants stay representation-free | Evolving |
| **Representation Seam** | `contract/frame_extraction.py` — turns a `views_frames` frame into the primitives the invariants consume. **One seam.** Its pandas sibling `unfao/extraction.py` was deleted in #151 once the pandas delivery was retired; the two ran as deliberate WET siblings through the migration. | Derived — isolates the representation so invariants stay representation-free | Evolving | <!-- legacy-ok: states that the pandas sibling WAS deleted in #151 — the retirement is the claim -->
| **Wire Mechanism** | `contract/wire/` — the ADR-013 contract: header, shard, sidecar, run manifest, sink, source selection. Partner-neutral: it takes its consumer name and collapse floor as **arguments** (#153). | Authoritative — the contract with the consumer | Stable — changes are contract amendments |
| **Enrichment Asset** | The precomputed GAUL lookup (`data/gaul_lookup.parquet`), its identity in `contract/gaul_lookup.py`, its schema in `contract/gaul_schema.py`, and the keyed gather that joins it (`contract/enrichment.py`, the build/verification path — numpy/pyarrow since #89; see register **C-75** on whether that class should survive at all). | Authoritative for geographic metadata | Stable — rebuilt only when the producer releases new GAUL data |
| **Enrichment Asset** | The precomputed GAUL lookup (`data/gaul_lookup.parquet`), its identity in `contract/gaul_lookup.py`, its schema in `contract/gaul_schema.py`, and the keyed gathers that join it — `contract/historical.py` for the actuals artifact and `contract/wire/sidecar.py` for the §5 sidecar. *(A second gather lived in `contract/enrichment.py` with no production caller; retired in #90, register **C-75**.)* | Authoritative for geographic metadata | Stable — rebuilt only when the producer releases new GAUL data | <!-- legacy-ok: records the second gather that was retired in #90 -->
| **Artifact Builders** | `contract/historical.py` — turns a frame plus the lookup into the partner-facing artifact. | Derived | Evolving |
| **External Facts** | Facts read from systems this repo does not own: the producer's (`contract/source_metadata.py` — `last_valid_month_id`, D-07) and the store's (`contract/store_metadata.py`). | Authoritative (the owning system is the source of truth) | Evolving |
| **Launch Declarations** | `contract/launch_config.py` — the delivery mode the launcher must declare. Omitting a key is **refused by name**, never inferred (ADR-003, register C-63). | Authoritative | Stable |
Expand All @@ -70,10 +70,10 @@ described the cut-a-repo case; it now says which is which.

**Two claims this ADR made until 2026-08-01, both now corrected rather than quietly dropped**
(register C-67). It called the manager *"the **thin** `UNFAOPostProcessorManager`"* when it was
636 lines holding two of everything, and it called `unfao/extraction.py` *"the **single**
636 lines holding two of everything, and it called `unfao/extraction.py` *"the **single** <!-- legacy-ok: quotes the false claim this ADR was written to correct -->
pandas-aware module"* when pandas lived in three. Both drifted the same way: the ADR described
the intended end state of a migration that then stopped one step short. Both are now true —
pandas has **zero runtime importers** (#89 made `contract/enrichment.py`'s a type-only import under `if TYPE_CHECKING` — pandas is in that class's interface, not its implementation) — and the load-bearing ones are
pandas is **absent from the package entirely** (#89 reduced the last one to a type-only import; #90 retired the module that held it — register C-75) — and the load-bearing ones are
**mechanically checked** by `tests/test_doc_accuracy.py`, so the next drift fails CI instead of
waiting for an audit.

Expand Down Expand Up @@ -129,7 +129,7 @@ Seam" wording will need a light touch (the seam stays; its internals change).

## Amendment 2026-07-31 — forecast identity re-homed to the wire layer (#150, epic #148)

**`views_postprocessing/delivery/identity.py` is retired.** The "Delivery Invariants" row
**`views_postprocessing/delivery/identity.py` is retired.** The "Delivery Invariants" row <!-- legacy-ok: the amendment recording that identity.py is retired -->
above listed *forecast identity* among the authoritative rules; that module no longer
exists, and this amendment records where the rule went so a reader of the row is not
looking for deleted code.
Expand Down
Loading
Loading