Local E2E quality gate

Every pull request, push to main, and manual Implementation CI run executes the same local E2E suite. It is the contributor gate for supported local behavior: the qualified local Golden Paths, local stores and labels, registries, extension-wheel loading, the declared local optional extras, and the documented editable source-checkout installation. Here local means that the test supplies no credential and makes no network call to an external model provider.

tests/manual/test_dataproc_serverless.py is deliberately outside this local gate and the coverage manifest. Its dataproc_e2e and live markers require explicit approval plus GCS targets and a worker service account. It creates a unique prefix, submits four samples, polls for at most ten minutes, verifies a tar/checksum/manifest triplet, and removes only that prefix. It is run manually against a permitted GCP project, never by ordinary pull-request CI.

Manual invocation requires RFGEN_ANNOTATION_E2E=YES, region, staging URI, output URI, and RFGEN_ANNOTATION_E2E_SERVICE_ACCOUNT (with optional GOOGLE_CLOUD_PROJECT):

RFGEN_ANNOTATION_E2E=YES \
pytest -m dataproc_e2e tests/manual/test_dataproc_serverless.py

Run the gate from a clean checkout with Python 3.11 and uv:

uv venv --python 3.11 .venv-e2e
uv pip install --python .venv-e2e/bin/python '.[dev,torch,torchsig,hdf5,sigmf,adsb]'
env -u PYTHONPATH .venv-e2e/bin/python ci/integration/validate_coverage_manifest.py
env -u PYTHONPATH .venv-e2e/bin/python -m pytest -q -o addopts='' tests/integration/local

The workflow first creates an environment containing the test runner and local extras. The installed-wheel session fixture independently builds one RFGen wheel and installs it into a second, fresh environment for the wheel journeys. The source-install test separately creates a fresh environment and installs this checkout editably, exactly as the Install page prescribes. Each journey uses an isolated temporary workspace. Clearing PYTHONPATH prevents the checkout or test-runner environment from masking a missing wheel file or undeclared dependency; the two install routes deliberately assert different import locations.

Executable test map

This is the authoritative, executable map of the suite. It names every pytest node that the E2E command collects: 35 invocations across eight modules. Parameterized functions count once per listed parameter value. The Build and CI page gives the complementary reader-facing view: the 12 public contract families and the CI topology.

Source module

Exact test node(s) and expansion

Contract covered

test_installed_wheel_golden_paths.py

test_installed_wheel_exposes_only_canonical_domain_owned_paths; test_installed_wheel_failure_diagnostics_retain_journey_workspace; test_installed_wheel_retains_each_same_process_failure_for_sanitization; test_narrowband_golden_path_is_durable_and_deterministic; test_chirp_golden_path_is_durable_and_deterministic (5 invocations)

Installed-wheel canonical-path isolation and failure retention; the local Golden Paths.

test_local_entry_points.py

Installed-wheel discovery and loading of retained extension selectors.

Distribution metadata and retained plugin boundaries.

test_local_entry_points.py

test_installed_provider_free_entry_points_load_from_distribution_metadata; test_adsb_installed_extra_exposes_its_declared_stub_boundary; test_installed_declared_stub_boundaries_are_discoverable_and_explicit; test_remaining_local_extension_contracts (4 invocations)

Local entry points and the explicit ADS-B and TorchSig-impairments product boundaries.

test_fixture_plugin.py

test_external_fixture_wheel_discovers_runs_and_roundtrips; test_external_fixture_wheel_generates_and_consumes_through_installed_cli; test_invalid_external_selector_fails_at_public_registry_boundary (3 invocations)

External wheel discovery, full CLI selection of fixture components, consumer round-trip, and an invalid-selector failure.

test_annotation_overlay_lifecycle.py

test_deterministic_annotation_overlay_persists_and_resumes_without_a_second_request (1 invocation)

Local append, provenance, durable readback, and idempotent annotation resume.

test_coverage_manifest.py

test_checked_in_manifest_covers_every_declared_entry_point_once; test_manifest_rejects_an_unmapped_declared_identifier; test_manifest_rejects_a_stale_scenario_node; test_manifest_rejects_a_new_unmapped_public_cli_command; test_public_cli_inventory_uses_the_canonical_cli_package_source (5 invocations)

A valid checked-in manifest, a missing declared identifier, a stale scenario node, a newly unmapped public CLI command, and canonical-package CLI inventory discovery. The validator also implements duplicate, ambiguous, and unknown-identifier checks, but this module does not inject separate negative cases for those rules.

test_diagnostic_collection.py

test_collector_allowlists_and_redacts_e2e_failure_artifacts; test_collector_structurally_redacts_command_cwd_and_junit_identities; test_ci_wires_raw_failure_diagnostics_to_a_distinct_collector_input (3 invocations)

Allowlisted diagnostics, structural redaction, and separation of raw collection input from uploaded output.

test_source_checkout_install.py

test_fresh_editable_source_checkout_install_matches_documented_uv_command × tutorial-extras, gemini-extra (2 invocations)

The documented uv pip install -e '.[torch,torchsig]' and uv pip install -e '.[gemini]' routes, executable discovery from outside the checkout, editable source import location, and PEP 610 direct-URL metadata.

The installed-wheel fixture also deliberately triggers one failed command and requires its local assertion to name the command, captured stdout/stderr, and retained journey workspace. The CI artifact retains only the safe structural summary, not those raw streams, so a failed run remains actionable without uploading raw IQ samples or other dataset payloads.

The gate deliberately excludes Gemini and other hosted-model calls, Sionna, GPU, GNU Radio/OOT and other non-PyPI runtimes, hardware, and scientific validation. The coverage manifest records dispositions and reasons for declared extras and entry points; the remaining items are stated suite boundaries rather than manifest rows. Hosted model text is not expected to be byte-identical.

When adding a public CLI command, entry-point selector (a named plug-in choice), store, or optional extra, update that manifest with at least one E2E scenario or an explicit external/manual reason. The validator implements checks for missing, stale, duplicate, ambiguous, and unknown coverage entries; the four direct negative test cases listed above exercise only the missing, stale, and newly unmapped-CLI paths. On failure, CI uploads a sanitized JUnit result plus redacted submitted configuration files, command diagnostics, inspection reports, and store indexes when available. The collector allowlists those artifact types, strips captured stdout/stderr and test-failure bodies, redacts credential fields, and removes raw IQ, stored payloads, and hosted-model responses before upload.