Repository navigation
E2E test of the manager orchestrating the delivery (C-03's residual) — BLOCKED on a non-production Appwrite project #18
Description
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/anddelivery/are dependency-light and import without it (test_clone_readiness.pyproves 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
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":
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.pyagainst 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_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. - "Verify the output parquet has all 9 metadata columns, non-null" —
_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:
- 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
Activity
Polichinel commentedon Jun 26, 2026
Status vs current
development(2026-06-27): partial coverage now exists; full real-manager test still blocked.What now exists (replica pattern, since the manager can't be instantiated without pipeline-core — C-03):
tests/test_input_integrity_e2e.py(S6/S6 — End-to-end input-integrity test suite (through the manager seam) #57) replicates the manager's extract→invariant chain end-to-end across all five guards.tests/test_validation.py(_validate) andtests/test_append_metadata.py(_append_metadata) replica-cover those stages.Still missing (the actual ask): a single test exercising the real
_read()→_transform()→_validate()→_save()on the liveUNFAOPostProcessorManagerwith mockedViewsDataLoader+DatastoreModule. Blocker unchanged: pipeline-core not importable in the vpp test env (C-03).Note: the un_fao smoke test (views-models, 2026-06-26 postmortem) exercised the real manager end-to-end against live infra as a manual proxy — verifying
_read_historical_data+_append_metadataon 5.7M real actuals — but that is manual, not a CI test. Issue stays open, scope narrowed to the real-manager CI test.Polichinel commentedon Aug 2, 2026
Stale requirements — this describes the pre-#149 manager.
Two of the four requirements name things that no longer exist:
enrichment_descriptiontimestamp" —_delivery_descriptionand_append_metadatawere deleted in S1 — Delete the retired delivery path; refuse an incomplete config #149. Zero hits in the package._validateno longer null-gates. That moved tocontract/historical.assert_metadata_complete, which fires at artifact build time.The stated blocker also softened: the delivery machinery in
contract/anddelivery/is now dependency-light and imports without views-pipeline-core (proven bytests/test_clone_readiness.py). Only the manager itself still needs it.This issue is C-03's second residual — the missing enrich→validate end-to-end path — and epic #181's S4 (#185) is scoped to either close it or state in writing why it stays open. S4 will check whether
test_historical_parity.pyandtest_historical_builder.pyalready cover it before anything new is written; adding a redundant test to close an entry is not the goal.test(validation): S4 #185 — retire the _validate replica; test the ga…
Polichinel commentedon Aug 2, 2026
This issue is now C-03's sole home in this repo. C-03 was closed in #200 (S4 / epic #181) with its manager-orchestration residual relocated here by number.
Body requirements are stale — see my earlier comment;
enrichment_descriptionand the 9-column_validatenull-gate both describe the pre-#149 manager.What is actually still missing, as of 2026-08-02. Every leg has coverage:
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, new)What is uncovered is the manager orchestrating them —
_read → _transform → _validate → _savethrough the realUNFAOPostProcessorManager. That needs views-pipeline-core installed and a production-like Appwrite environment, and þing-02 D2 forbids integration tests against the production project (no non-production project exists). So this is blocked on an environment decision, not on test-writing effort.tests/test_falsification_campaign_3_5.pyremains the standing marker.[-]Write E2E pipeline test (Campaign Claim 3.5)[/-][+]E2E test of the manager orchestrating the delivery (C-03's residual) — BLOCKED on a non-production Appwrite project[/+]Polichinel commentedon Aug 2, 2026
Rewritten today. Three things changed and one did not.
Changed: this is now C-03's sole home (C-03 closed in #200, residual relocated here by number); the body's stale requirements are corrected —
enrichment_descriptionand the 9-column_validatenull-gate both describe the pre-#149 manager; and the issue is labelledblockedwith a named trigger per ADR-014 §4, rather than sitting unlabelled as if it were merely unstarted.Did not change: the gap is real. Every leg of the delivery is covered; the manager orchestrating them is not.
The blocker is an environment, not effort: þing-02 D2 forbids integration tests against the production Appwrite project, and no non-production project exists. Creating one is an operator decision — money and console access. Trigger: a non-production project exists, or D2 is amended.
Also recorded: whoever eventually closes this must retire
tests/test_falsification_campaign_3_5.pyby hand. It is a pureassert Falseprobe and cannot flip to XPASS when the gap closes — C-36's known residual. S4 (#200) set the precedent for discharging one.Polichinel commentedon Aug 5, 2026
The question this issue is blocked on has been answered, and the answer is no.
Simon read the Appwrite console on 2026-08-05 (recorded in views-appwrite coordinate registry v1.4.4, þing-02 A3(h)). The
VIEWS Platformorganisation holds exactly one project,Datastore— the console showsTotal: 1.So the non-production project is not pending. It is absent. That changes what this issue is waiting for:
þing-02 D2 forbids integration tests against the production project, so this cannot start under any workaround. The same answer blocks the þing-01 provisioning drill.
Nothing here changes the engineering: the test shape is unchanged and every leg it would cover is already tested individually — what is uncovered is the manager orchestrating them. See register C-03's resolution note.
No action requested on this issue. Filed so it stops reading as "waiting" when it is in fact "unasked".
Polichinel commentedon Aug 13, 2026
Two facts in this body are wrong, and one of them hides a permission this issue thinks is a prohibition. The gap itself is real and still blocked — nothing here changes that.
1. The blocker is cited to the wrong verdict. The body says "þing-02 D2 forbids integration tests against the production project." The ruling is þing-01 D2 (
þingit/01_identity_secrets_config/orð_dómr.md:53-61), and it differs in two ways that matter here:So a read-only check against production is permitted today. That does not unblock this issue — an end-to-end test of the manager writes — but it is the same permission register C-94 wants for a different purpose, and both were believed closed for weeks because of this citation (register C-95, C-96).
2. "The probe cannot flip to XPASS … whoever closes this must retire it by hand" is false.
tests/test_falsification_campaign_3_5.pycarriespytestmark = pytest.mark.xfail(..., strict=True), so it self-surfaces if it ever starts passing. The standing-marker instruction is unnecessary.(For contrast:
tests/test_falsification_campaign_4_1.pygenuinely could not flip — an unconditionalassert False— and was deleted on 2026-08-12 when its finding was resolved. That is the case this warning describes, and it is not this one.)Still blocked, and correctly. No non-production Appwrite project exists; the operator assignment stands. Verified unchanged: no test instantiates the manager, and
views-pipeline-coreis not importable in a bare checkout.Polichinel commentedon Aug 25, 2026
The blocker now has its own home: views-appwrite#171 — "Decide: do we create a non-production Appwrite project?"
Previously this was duty 2 of three inside views-appwrite#9, where it was easy to miss. #171 states the question on its own, costs both answers, and names this issue among the three blocked on it.
Including the "no" branch, which is spelled out there: if the ruling is that a second project is not worth the cost, this issue closes as won't-do with the reason recorded — and whoever closes it must retire the standing
assert Falseprobe intests/test_falsification_campaign_3_5.pyby hand, since it cannot flip to XPASS (C-36). No action needed here until that decision lands either way.