Skip to content

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

Open

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

Activity

  1. Polichinel commented on Jun 26, 2026

    @Polichinel
    CollaboratorAuthor

    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):

    Still missing (the actual ask): a single test exercising the real _read()→_transform()→_validate()→_save() on the live UNFAOPostProcessorManager with mocked ViewsDataLoader + 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_metadata on 5.7M real actuals — but that is manual, not a CI test. Issue stays open, scope narrowed to the real-manager CI test.

  2. Polichinel commented on Aug 2, 2026

    @Polichinel
    CollaboratorAuthor

    Stale requirements — this describes the pre-#149 manager.

    Two of the four requirements name things that no longer exist:

    • "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. Zero hits in the package.
    • "Verify the output parquet has all 9 metadata columns, non-null" — _validate no longer null-gates. That moved to contract/historical.assert_metadata_complete, which fires at artifact build time.

    The stated blocker also softened: the delivery machinery in contract/ and delivery/ is now dependency-light and imports without views-pipeline-core (proven by tests/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.py and test_historical_builder.py already cover it before anything new is written; adding a redundant test to close an entry is not the goal.

  3. added a commit that references this issue on Aug 2, 2026
  4. Polichinel commented on Aug 2, 2026

    @Polichinel
    CollaboratorAuthor

    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_description and the 9-column _validate null-gate both describe the pre-#149 manager.

    What is actually still missing, as of 2026-08-02. Every leg has coverage:

    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 wire, end to end test_hop_b_sink_e2e.py (6)
    the metadata null-gate test_validation.py (14, new)

    What is uncovered is the manager orchestrating them — _read → _transform → _validate → _save through the real UNFAOPostProcessorManager. 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.py remains the standing marker.

  5. changed the title [-]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[/+] on Aug 2, 2026
  6. Polichinel commented on Aug 2, 2026

    @Polichinel
    CollaboratorAuthor

    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_description and the 9-column _validate null-gate both describe the pre-#149 manager; and the issue is labelled blocked with 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.py by hand. It is a pure assert False probe and cannot flip to XPASS when the gap closes — C-36's known residual. S4 (#200) set the precedent for discharging one.

  7. Polichinel commented on Aug 5, 2026

    @Polichinel
    CollaboratorAuthor

    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 Platform organisation holds exactly one project, Datastore — the console shows Total: 1.

    So the non-production project is not pending. It is absent. That changes what this issue is waiting for:

    • Before: "blocked until the non-prod project appears", which read as a scheduling matter.
    • Now: blocked until someone decides to create one, which is an operator decision nobody has been asked to make.

    þ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".

  8. Polichinel commented on Aug 13, 2026

    @Polichinel
    CollaboratorAuthor

    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:

    • it is conditional — "until the operator creates one", and creating a test project is an open operator assignment, not a closed door;
    • it explicitly grants "read-only preflight validation … the only permitted live check".

    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.py carries pytestmark = 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.py genuinely could not flip — an unconditional assert 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-core is not importable in a bare checkout.

  9. Polichinel commented on Aug 25, 2026

    @Polichinel
    CollaboratorAuthor

    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 False probe in tests/test_falsification_campaign_3_5.py by hand, since it cannot flip to XPASS (C-36). No action needed here until that decision lands either way.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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