Skip to content

E2E test of the manager orchestrating the delivery (C-03's residual) — BLOCKED on a non-production Appwrite project #18

Description

@Polichinel

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.

  1. 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.
  2. 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"_validate no 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:

  1. Create a test that mocks ViewsDataLoader and Appwrite DatastoreModule
  2. Exercise the full pipeline: _read() → _transform() → _validate() → _save()
  3. Verify the output parquet has all 9 metadata columns, non-null
  4. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    blockedBlocked on a dependency or decisiontestingTest/parity/validation work

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions