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
Rewritten 2026-08-02. The original body described the pre-#149 manager and is preserved at the bottom. This issue is now register C-03's sole home — C-03 closed in #200 with its manager-orchestration residual relocated here by number.
What is actually missing
Every leg of the delivery is covered:
leg
tests
enrichment
test_enrichment.py (16)
artifact build
test_historical_builder.py (7)
reader parity
test_historical_parity.py (3)
invariants on primitives
test_input_integrity_e2e.py (8)
the ADR-013 wire, end to end
test_hop_b_sink_e2e.py (6)
the metadata null-gate
test_validation.py (14)
What is not covered is the manager orchestrating them — _read → _transform → _validate → _save through a real UNFAOPostProcessorManager, with pipeline-core's Template Method actually driving the lifecycle.
That gap is real. Every test above verifies a piece in isolation or a seam in a subprocess; none proves the pieces are wired together in the order the base class calls them.
Why it is blocked, precisely
Not on effort. On an environment that does not exist.
views-pipeline-core must be installed — true, and no longer the hard part. contract/ and delivery/ are dependency-light and import without it (test_clone_readiness.py proves this in a subprocess). Only the manager needs it.
A production-like Appwrite project must exist — and it does not. þing-02 D2 forbids integration tests against the production project, and no non-production project has been created. Mocking DatastoreModule deeply enough to exercise _save_contract's manifest-last commit ordering would mean reimplementing the store, at which point the test proves the mock rather than the delivery.
Creating a non-production Appwrite project is an operator decision — it costs money and console access (CLAUDE.md). It is not something this repo can decide its way around.
Named trigger
Per ADR-014 §4, a deferral needs a trigger and an owner rather than "later":
Trigger: a non-production Appwrite project exists, or þing-02 D2 is amended. Owner: the operator, since both are operator decisions.
Until one of those happens this issue should not be picked up, and picking it up would produce a test of a mock.
What NOT to do
Do not mock your way to a green e2e test. A test that stands in for the store proves the stand-in. The wire's guarantees — content hashes, header asserts, §6 no-collapse, gid parity, manifest-last — are already covered by test_hop_b_sink_e2e.py against real bytes.
Do not add a redundant test to close a register entry. C-03 is already closed; this issue is not blocking anything, and inventing coverage to tick it would be worse than the gap.
Standing marker
tests/test_falsification_campaign_3_5.py remains the in-suite marker. Note its limitation, recorded in C-36: it is a pure assert False probe, so it cannot flip to XPASS when the gap closes. Whoever closes this must retire that probe by hand — S4 (#200) set the precedent, removing three discharged probes with a dated DISCHARGED note in the module docstring.
Stale requirements from the original body, corrected
"Verify upload metadata includes the enrichment_description timestamp" — _delivery_description and _append_metadata were deleted in S1 — Delete the retired delivery path; refuse an incomplete config #149. Provenance is now built by delivery/provenance.py and reaches the store through _historical_frame_description.
"Verify the output parquet has all 9 metadata columns, non-null" — _validateno longer null-gates. That moved to contract/historical.assert_metadata_complete, firing at artifact-build time, and is covered by test_validation.py.
Original body (2026-06-04), preserved
Context
The falsification campaign (Claim 3.5, FALSIFIED) confirmed that no end-to-end pipeline test exists. The full pipeline (read → transform → validate → save) is never tested as an integrated unit.
Blocker
views-pipeline-core is not installed in the test environment. UNFAOPostProcessorManager inherits from PostprocessorManager and ForecastingModelManager — both require views-pipeline-core.
Requirements
When views-pipeline-core is available:
Create a test that mocks ViewsDataLoader and Appwrite DatastoreModule
Exercise the full pipeline: _read() → _transform() → _validate() → _save()
Verify the output parquet has all 9 metadata columns, non-null
Verify upload metadata includes the enrichment_description timestamp
Risk Register
C-03 (Tier 3, test coverage gaps). Campaign Claim 3.5.
Test stub: tests/test_falsification_campaign_3_5.py
Rewritten 2026-08-02. The original body described the pre-#149 manager and is preserved at the bottom. This issue is now register C-03's sole home — C-03 closed in #200 with its manager-orchestration residual relocated here by number.
What is actually missing
Every leg of the delivery is covered:
test_enrichment.py(16)test_historical_builder.py(7)test_historical_parity.py(3)test_input_integrity_e2e.py(8)test_hop_b_sink_e2e.py(6)test_validation.py(14)What is not covered is the manager orchestrating them —
_read → _transform → _validate → _savethrough a realUNFAOPostProcessorManager, with pipeline-core's Template Method actually driving the lifecycle.That gap is real. Every test above verifies a piece in isolation or a seam in a subprocess; none proves the pieces are wired together in the order the base class calls them.
Why it is blocked, precisely
Not on effort. On an environment that does not exist.
contract/anddelivery/are dependency-light and import without it (test_clone_readiness.pyproves this in a subprocess). Only the manager needs it.DatastoreModuledeeply enough to exercise_save_contract's manifest-last commit ordering would mean reimplementing the store, at which point the test proves the mock rather than the delivery.Creating a non-production Appwrite project is an operator decision — it costs money and console access (
CLAUDE.md). It is not something this repo can decide its way around.Named trigger
Per ADR-014 §4, a deferral needs a trigger and an owner rather than "later":
Until one of those happens this issue should not be picked up, and picking it up would produce a test of a mock.
What NOT to do
test_hop_b_sink_e2e.pyagainst real bytes.Standing marker
tests/test_falsification_campaign_3_5.pyremains the in-suite marker. Note its limitation, recorded in C-36: it is a pureassert Falseprobe, so it cannot flip to XPASS when the gap closes. Whoever closes this must retire that probe by hand — S4 (#200) set the precedent, removing three discharged probes with a datedDISCHARGEDnote in the module docstring.Stale requirements from the original body, corrected
enrichment_descriptiontimestamp" —_delivery_descriptionand_append_metadatawere deleted in S1 — Delete the retired delivery path; refuse an incomplete config #149. Provenance is now built bydelivery/provenance.pyand reaches the store through_historical_frame_description._validateno longer null-gates. That moved tocontract/historical.assert_metadata_complete, firing at artifact-build time, and is covered bytest_validation.py.Original body (2026-06-04), preserved
Context
The falsification campaign (Claim 3.5, FALSIFIED) confirmed that no end-to-end pipeline test exists. The full pipeline (read → transform → validate → save) is never tested as an integrated unit.
Blocker
views-pipeline-core is not installed in the test environment. UNFAOPostProcessorManager inherits from PostprocessorManager and ForecastingModelManager — both require views-pipeline-core.
Requirements
When views-pipeline-core is available:
Risk Register
C-03 (Tier 3, test coverage gaps). Campaign Claim 3.5.
Test stub: tests/test_falsification_campaign_3_5.py