Playwright E2E Coverage and Fixture Backlog

Document responsibility

This document owns operational Playwright execution guidance, fixture/provider gaps, skip policy, and CI completion criteria. The broader behavioural model, evidence limitations, and golden-journey backlog are maintained in the user journey catalogue.

Current feature-030 evidence is dated explicitly below. The older snapshot and skip inventory are historical, not the active mandatory gate. Consult the latest private reports before treating a focused pass as current full acceptance.

Feature 030 lower-layer invariant inventory

This is a source-inspection inventory, not an execution report. Test discovery, sequential duplicate requests, mocked database errors, and browser stale-page checks do not establish separate-transaction race safety. A test locator below means the test exists; execution evidence is stated separately.

Required invariant Existing test locators Evidence limitation or remaining gap
Exact stage roles and actor separation apps/parcels/tests/test_workflow_authorization.py: WorkflowAuthorizationPolicyTests.test_higher_role_does_not_inherit_editor_mutation, test_creator_or_submitter_cannot_review, test_creator_submitter_or_reviewer_cannot_approve; apps/parcels/tests/test_parcel_draft_services.py: ParcelDraftWorkflowServiceTests.test_higher_roles_do_not_inherit_lower_stage_mutations, test_creator_with_reviewer_role_cannot_review_own_submission, test_creator_with_approver_role_cannot_approve_own_draft Policy tests are in-memory controls; service tests exercise persisted roles and events. Both layers are retained.
Dataset scope and no administrator bypass apps/parcels/tests/test_parcel_draft_authorization.py: test_viewer_and_no_grant_cannot_transition, test_administrator_staff_does_not_bypass_workflow_roles, test_cross_dataset_workflow_history_and_events_do_not_leak; apps/parcels/tests/test_dataset_scoping.py: test_switching_active_dataset_changes_scope; apps/parcels/tests/test_dataset_rbac_enforcement.py: test_detail_view_denies_cross_dataset_uuid_access These remain distinct from browser navigation, warm-cache switching, and anonymous denial evidence.
Ordinary approval concurrency apps/parcels/tests/test_parcel_draft_concurrency.py: ParcelDraftApprovalRaceTests.test_separate_transactions_approve_only_once_with_ordered_events, plus retained ParcelDraftConcurrencyTests.test_prevent_double_approval, test_event_sequence_is_monotonic_per_draft; apps/parcels/tests/test_parcel_draft_services.py: test_final_approve_converts_database_race_to_workflow_conflict The added TransactionTestCase proves distinct backend/transaction IDs and two simultaneous PostgreSQL advisory-lock waiters before allowing approvals to proceed. It asserts one approval, one conflict, one official successor/approval transaction, exact terminal and denial events, and unchanged winner revision. The retained sequential and injected-error controls are not substitutes for this race.
Exchange purpose, stale revision, and batch rejection apps/parcels/tests/test_draft_exchange_package.py: test_inspection_package_cannot_be_imported; apps/parcels/tests/test_draft_exchange_service.py: test_tampered_identity_rejects_entire_batch_without_domain_or_file_residue, test_success_advances_revision_and_duplicate_import_is_rejected, test_stale_member_rolls_back_the_whole_batch, test_geometry_failure_labels_only_the_causal_record_invalid Six real GeoPackage tamper cases cover missing/malformed/foreign draft IDs, parcel-chain identity, feature dataset, and manifest dataset. Stale and injected second-record geometry rejection now compare complete domain snapshots, including official/draft/event/transaction state. Rejected-operation audit is permitted; updated-record results are not.
Exchange denial before inspection and file cleanup apps/parcels/tests/test_draft_exchange_service.py: test_all_non_editor_roles_are_denied_before_inspection_without_residue; apps/parcels/tests/test_draft_exchange_views.py: test_non_editor_import_posts_leave_no_domain_audit_or_file_residue, test_reviewer_can_download_inspection_package; apps/parcels/tests/test_draft_exchange_security.py: test_unsafe_filename_does_not_escape_temporary_directory Viewer, reviewer, approver, and grant-free administrator service calls and actual POSTs are denied before inspection/import. Complete domain/exchange snapshots and isolated temporary/upload directories prove no residue. Tampered package imports and malformed filename inspection also assert temporary-file cleanup.
Production import CRS and format apps/parcels/tests/test_parcel_vector_imports.py: ParcelVectorImportTests.test_projected_non_metre_gpkg_transforms_to_storage_and_records_audit, test_shapefile_without_prj_is_rejected_before_transformation, test_missing_crs_and_unknown_linear_units_are_rejected, test_geographic_gpkg_is_rejected, test_non_transformable_projected_geometry_is_rejected, test_geojson_file_is_rejected_as_import_input, test_kml_file_is_rejected_as_import_input, test_ambiguous_gpkg_requires_layer_selection, test_conflicting_gpkg_crs_metadata_is_rejected_even_with_selected_layer Include this suite in addition to the T026 named suites: test_crs_helpers.py alone does not test production file ingestion. Separate controls cover valid explicit layer selection and conflicting projected CRS declarations in the same layer's GeoPackage metadata; the latter rejects before transformation. Accepted Shapefile ingestion is not covered here. Integration cases can skip when ogr2ogr is absent, so report skips explicitly.
Upload draft creation and repeat confirmation apps/parcels/tests/test_parcel_upload_apply_guard.py: test_apply_creates_draft_for_new_record_and_completes_upload, test_reapplying_completed_upload_raises_conflict, test_confirming_completed_upload_does_not_create_more_drafts, test_payload_with_stale_crs_contract_is_discarded These are lower-layer guards, not evidence of a user uploading, previewing, confirming, and reloading a projected file.
Topology real race apps/parcels/tests/test_parcel_change_request_conflicts.py: ParcelChangeRequestCreationRaceTests.test_competing_ordinary_and_topology_creation_allows_only_one; apps/parcels/tests/test_parcel_split_requests.py: ParcelTopologyApprovalRaceTests.test_separate_transactions_approve_split_without_duplicate_outputs The retained real creation race uses two worker connections and a barrier. The added approval race shares the ordinary PostgreSQL contention helper and asserts one committed approval, two official outputs, two lineage edges, one transaction, unchanged winning revision, and exact approval/denial event cardinality.
Topology injected rollback apps/parcels/tests/test_parcel_split_requests.py: test_final_approval_rolls_back_every_write_when_output_creation_fails; apps/parcels/tests/test_parcel_merge_requests.py: test_merge_approval_rolls_back_source_retirement_on_output_failure Split injects failure on the second official output; merge on its first output. Both now compare complete official/request/output/event rows, including source validity and terminal events, plus lineage and approval-transaction absence.
Direct overlap backstop and validity intervals apps/parcels/tests/test_overlap_governance_workflow.py: AuthoritativeOverlapBackstopTests.test_direct_overlapping_insert_raises_stable_constraint, OverlapReservationRaceTests.test_separate_transactions_reserve_overlapping_area_only_once; apps/parcels/tests/test_overlap_governance_migrations.py: OverlapGovernanceTriggerIntervalTests.test_trigger_ignores_expired_historical_overlap, test_trigger_still_blocks_future_overlap, and corresponding OverlapGovernancePreflightTests Current direct-write rejection and expired/future trigger behavior have separate tests. The new reservation race proves simultaneous separate-transaction PostgreSQL lock contention, exactly one submitted proposal and one editable denied proposal, attributable events, and no official/transaction/exemption-use writes. It does not claim concurrent direct-write trigger execution.

Current feature-030 execution evidence for this inventory: the owning ordinary draft service, workflow UI entrypoint, and overlap workflow suites completed with 62 passed, after the new denial-revision and create-form exact-editor regressions failed before their product fixes. Private evidence is retained in tmp/reliability-02/us2-denial-regression-red.log, tmp/reliability-02/us2-create-guard-red.log, and tmp/reliability-02/us2-service-ui-green.log. The subsequent combined T023, T026, and T031 named suites, with strict vector imports and overlap service/migration/workflow controls, completed with 115 passed, zero skipped in 66.468 seconds. Exact locators and results are retained in tmp/reliability-02/lower-layer-invariants.log. This run precedes the added topology approval race and exchange/reservation extensions; it does not establish a complete browser profile.

The added ordinary approval race and strengthened split/merge rollback controls also completed with 3 passed, without requiring another product change. Their initial run is retained in tmp/reliability-02/us2-race-topology-rollback-initial.log. After adding the topology approval race and sharing the contention helper, the ordinary concurrency, split, and merge suites completed with 20 passed, zero skipped in 8.443 seconds. Evidence is retained in tmp/reliability-02/approval-races-rollback-green.log. These overlapping suite totals are separate runs, not additive unique-test counts.

The exchange identity/residue/rollback and overlap-reservation extensions first completed with 22 passed. The final combined named invariant suites, including those extensions and the focused owned upload-result reset control, completed with 121 passed, zero skipped in 62.637 seconds. This latest lower-layer evidence is retained in tmp/reliability-02/lower-layer-invariants-expanded-green.log. The new coverage required no additional product change. Missing browser runs or untested import boundaries must not be inferred from these passing suites.

The later explicit CRS-metadata regression exposed a genuine import defect: a single-layer GeoPackage declared different projected SRIDs in gpkg_contents and gpkg_geometry_columns, and the importer accepted it even with an explicitly selected layer. Those declarations must match under OGC GeoPackage requirement 146. A narrow read-only metadata check now rejects the conflict before transformation. The two failing subcases are retained in tmp/reliability-02/ambiguous-crs-metadata-red.log; the vector/CRS/exchange compatibility batch then completed with 33 passed, zero skipped in 48.927 s, recorded in tmp/reliability-02/ambiguous-crs-metadata-green.log. This is separate, overlapping evidence, not an addition to the earlier 121-test unique count.

Current execution status, 2026-09-08

Feature 030 has implemented the strict registry, guarded dual-profile runner, isolated fixture manifests, independent observer and mandatory outcome reporter. The fresh, unfiltered default attempt 3 passes all 100 mandatory cases: 86 Chromium and 14 Firefox, including the fixed 15 golden journeys and two additional precision obligations. There are zero failures, skips, retries, flakes or unexecuted cases. Exact combined scenario/project/retry identities match the frozen mandatory registry, and all 80 pinned code/configuration hashes remain unchanged. Browser correctness is complete. On 2026-09-08 the owner explicitly deferred Package 2 performance tasks/overruns as non-blocking follow-up and authorized implementation publication. Performance remains unaccepted, not passed. Earlier failed attempts and focused recoveries remain separate evidence, not erased history. Implementation iteration 1 is published for independent review on 2026-09-08 (READY / waiting_review); publication is not review approval or deployment.

  • Final harness/ownership/observer controls: 39 passed, zero skips, in 164.765 s, recorded in tmp/reliability-02/final-harness-matrix.log. This includes actual approved ordinary/topology reset, preference cleanup, cross-slot workflow and resource isolation, and actor/grant/dataset/state/revision/CRS drift rejection. The three completed boundary controls first passed against the existing implementation in 29.802 s (tmp/reliability-02/final-fixture-boundary-initial.log). Two real 100-slot preparations have equal normalized inventories and distinct generation IDs. These overlapping runs complete harness proof, not browser acceptance.
  • Latest completed Node collections: 282 application controls plus 11 extension controls passed (293 total), zero skips, in tmp/reliability-02/final-node-readiness.log, including the baseline identity and four map-frame readiness contracts. The later registry/reporter/CI negative matrix passed 100 controls (48/34/18); guard/projected-file contracts passed 23. Overlapping run totals are not additive.
  • Earlier focused runs cover all ten required US2 cases in Chromium. The final stale/exact-role/multi-role/admin rerun and upload-status companion passed 5/5 with zero skips/retries in tmp/reliability-02/us2-rerun.log. Firefox access-switch also passes (28.2 s), recorded in test-results/reliability-02-us4-fixed-01/firefox.log. These are case-level results; the clean default run below supplies complete browser proof.
  • Retained cache authorization/freshness/migration controls pass 143/143, zero skips, in 494.082 s (tmp/reliability-02/retained-cache-integrity.log). Vector/CRS/exchange compatibility passes 33/33, zero skips, in 48.927 s (tmp/reliability-02/ambiguous-crs-metadata-green.log). These are separate, overlapping invariant runs, not additional browser cases.
  • The remaining named batch passes 64/64, zero skips, in 81.056 s: nine snapping workflow, eight snapping geometry, eight exchange-view and 39 harness controls. Evidence is tmp/reliability-02/final-retained-snapping-harness.log; the separate test database was destroyed afterward. Scoped isort/Black checks for 27 files, Flake8 and diff checks pass after import-only corrections. These overlap earlier controls and do not create additional browser passes.
  • The earlier full required Firefox selection passes 14/14, zero skips/retries/flakes, in test-results/reliability-02-us4-fixed-01/firefox.json. Both precision persistence obligations pass there. This single-project result remains package-incomplete in isolation; attempt 3 also executes Firefox successfully.
  • The earlier retained Chromium companion run records 53 passes and four basemap failures out of 57, zero skips/retries, in test-results/reliability-02-companions-01/chromium.json. All four affected cases subsequently pass in test-results/reliability-02-companions-focused-02/chromium.json, preserving the original failures rather than presenting these runs as one clean pass. All 57 companions and all six new US3 cases also pass in each fresh default Chromium execution. These canonical reports resolve the missing current US3 artifact proof; the early overwritten report remains historical evidence loss, not a current US3 blocker.
  • Rendered precision performance fails inherited timing budgets, including with baseline precision assets. Real extension/container acceptance remains blocked by the separately documented environment prerequisites. Neither outcome is converted into a pass by browser correctness or lower-layer tests.

See specs/030-critical-browser-journeys/evidence.md for dated commands, red/green findings and private log paths, and specs/030-critical-browser-journeys/tasks.md for remaining task scope. The catalogue marks the fixed 15 golden journeys COVERED within their documented behavioural boundaries. Broader parcel authoring remains partial; precision persistence does not waive timing budgets, and controlled providers do not prove live-provider or real-container acceptance.

Default attempt 1

Canonical report: test-results/reliability-02-final/552825b8ba414ec68dba6c3f1edfad0c/chromium.json. Chromium executed 86 cases in 29.6 minutes: 83 passed, three timed out, zero skips/retries/flakes. All retained companions, six new exchange/upload cases, US4 cases and both strict precision persistence obligations passed. Firefox did not start after the Chromium failure, so its 14 required cases remain unexecuted within this attempt, despite the earlier separate Firefox pass.

The timed-out cases were ROLE-EXACT-STAGES, ROLE-MULTI-ACTOR-SEPARATION and DRAFT-REJECT-CORRECT-CHAIN. Diagnostics identify cumulative test budgets and repeated roughly 9–10 s independent observations, not a reported failed business assertion. Their time allowances changed from 180/120/120 s to 360/240/240 s, respectively. No product behavior, required assertion or precision/performance threshold was changed. The timeouts remain failures in the retained report; larger allowances required a clean fresh run and were not passing evidence by themselves. Attempts 2 and 3 subsequently pass these original assertions.

Default attempt 2

Canonical reports are test-results/reliability-02-final/613f3af2beb4414f89fc6050bec9373d/chromium.json and test-results/reliability-02-final/613f3af2beb4414f89fc6050bec9373d/firefox.json; the outer log is tmp/reliability-02/final-default-02.log. Chromium passes 86/86, including all three earlier timeout cases with their original assertions. Firefox passes 13/14; its PRECISION-PARCEL-APPLY-DRAG-SAVE helper fails before save/storage verification. All 100 cases execute with zero skips/retries/flakes, but the guard correctly returns failure for the incomplete passing set.

The retained trace shows a marker layer transform from (296, 494) to (308, 486), the requested (+12, −8) pixel drag. Smooth document scroll changes from 177 to 175 between reads, shifting the viewport-based comparison by exactly two pixels. The narrow helper correction compares read-only map.latLngToLayerPoint displacement in the same map frame instead. It retains genuine pointer input, the strict less-than-two-pixel displacement bound and strict 0.02 m agreement between stored and independently observed dragged coordinates. No product code, geometry assignment or tolerance changes. The failed pre-save attempt does not prove persisted geometry; subsequent focused verification is recorded separately.

Focused precision recovery

The first focused recovery run exposes the same readiness defect before active split drawing: coordinate projection at document scrollTop 122 precedes a click at scrollTop 222, outside the now-shifted map edge. Its failure remains under test-results/reliability-02-final/f66bd932affc45a392a169dac780fa9b/ and tmp/reliability-02/final-precision-scroll-fix.log.

The shared tests/e2e/fixtures/map-readiness.mjs::mapFrameStable now requires three unchanged rendered frames of document scroll, container bounds, map center and zoom, without active map pan/zoom. The existing mapIdle helper reuses this condition after scrolling/zooming, before pointer projection and before drag. This is condition-based readiness, not a fixed sleep or geometry assignment. Four fail-first Node controls pass; their red/green logs are tmp/reliability-02/map-readiness-red.log and tmp/reliability-02/map-readiness-green.log.

The subsequent guarded focused run passes two Chromium and two Firefox precision cases, zero failures/skips/retries/flakes. Canonical reports are test-results/reliability-02-final/1a9731f42cc34c4789f07396476c371e/chromium.json and test-results/reliability-02-final/1a9731f42cc34c4789f07396476c371e/firefox.json. Both surfaces retain the same marker count, actual pointer gesture, strict less-than-two-pixel map-layer displacement bound and strict 0.02 m agreement between persisted and independently observed dragged coordinates. This focused pass does not replace a complete default run. The 80 code/configuration identities pinned in tmp/reliability-02/final-readiness-code-identities.json remain unchanged through the subsequent complete default run.

Default attempt 3: complete browser correctness

The unfiltered guarded make e2e run uses fresh generation b74b60018f288fd280e786da00b69f53. All 100 resource and authenticated-readiness checks pass before browser execution. Canonical evidence remains under test-results/reliability-02-final/ff9ccce19f5d4ac288f4e14060341f53/:

Project Canonical report Start (UTC) Duration Outcome
Chromium test-results/reliability-02-final/ff9ccce19f5d4ac288f4e14060341f53/chromium.json 2026-09-07 23:53:10.046 1,083,701.976 ms (18.1 min) 86 passed
Firefox test-results/reliability-02-final/ff9ccce19f5d4ac288f4e14060341f53/firefox.json 2026-09-08 00:11:16.568 515,922.942 ms (8.6 min) 14 passed

Each required case passes once at retry index zero. The combined 100 unique scenario/project/retry identities exactly match the mandatory registry, with no failures, expected failures, skips, retries, flakes or unexecuted cases. All 80 pinned identities remain unchanged. Per-project logs are adjacent to the JSON; matching private HTML reports are under playwright-report/reliability-02-final/ff9ccce19f5d4ac288f4e14060341f53/. The outer log is tmp/reliability-02/final-default-03.log. The guard exits zero, stops its owned server and releases port 8010.

This proves the fixed golden/subcase set, both precision persistence obligations in both browsers and all retained companions. It does not turn the failed precision timing assessment or blocked real-extension/container check into a pass. The explicit 2026-09-08 owner deferral makes performance follow-up non-blocking for Package 2 publication, not a performance-readiness approval. T049 remains unchecked and OWNER-DEFERRED. Preserve failed raw measurements and unchanged budgets; the bounded mitigation is handle/label/active-line Apply investigation followed by matched Chromium/Firefox measurements and actual pointer/save/reload validation. The project owner controls scheduling and acceptance; no remediation deadline is agreed. See the complete owner disposition in specs/030-critical-browser-journeys/evidence.md.

Guarded profiles and fixture policy

Use the disposable environment described in .env.e2e.example and specs/030-critical-browser-journeys/quickstart.md:

make e2e
make e2e E2E_PROFILE=chromium
make e2e E2E_PROFILE=firefox

The default runs both required projects. Before migration or fixture writes, the guard compares explicit expected database name/host/port with configured and read-only server identity, requires PostGIS, DEBUG and caller-provided fixture opt-in, rejects unrelated occupied origins and checks browser availability. Preparation emits private per-scenario/project/retry resources. Actual-resource preflight and authenticated generation readiness precede browser execution on the owned server. The guard does not attach to an arbitrary existing server.

E2E_GREP supports focused guarded iterations, which report partial evidence. Required skips, fixme, expected failures, missing identities/projects and unexecuted cases fail regardless of legacy numeric budgets. Every attempt and retry stays visible; a later retry pass does not erase flakiness. --list proves collection only. Cookies, localStorage, actor profiles, grants, geometry and files cannot be borrowed from another scenario, browser or retry slot.

The registry currently contains no optional scenarios. make e2e E2E_PROFILE=optional therefore refuses before setup. Every retained companion is mandatory, including provider/page checks. Missing business fixtures, browser binaries or authorization are failures/blockers, never optional reasons. A future external optional check must have its own documented registry reason, prerequisites and separate outcome; it cannot satisfy a mandatory evidence ID.

Controlled resources and external acceptance

tests/e2e/fixtures/controlled-map-resources.mjs::controlledMapResources, shared by the scenario fixture and rendered performance runner, supplies test-only catalog configuration, raster responses, background-only MapLibre styles and the MapTiler logo. These styles have no font, glyph, sprite or external source dependencies. Page-level rejection routes can override the controlled provider response to exercise fallback. This infrastructure is implemented; its presence alone is not execution proof. The focused four-case basemap recovery report above now supplies actual controlled-provider passes, including a real native MapLibre error reaching visible fallback while preserving the requested provider. Two owning native-event regressions failed before the lifecycle binding fix; 36 related Node controls then passed. These results still do not prove a live external provider or a clean full mandatory run.

Actual provider credentials, paid services and live network availability are not prerequisites for the mandatory basemap checks. Real Firefox extension/container acceptance is different from launcher page/Node checks: it needs a visible supported Firefox environment, the actual extension and an authorized short-lived managed-demo ticket. Follow demo environment acceptance testing and the launcher runbook. Keep any concrete environment blocker and owner-run procedure separate from page-profile results. The current real-container checkpoint is explicitly blocked: no authorized managed HTTPS demo and short-lived ticket were supplied, and the system Firefox probe emitted Snap namespace diagnostics. A display is configured; lack of a display is not the asserted blocker.

Rendered performance checkpoint

Actual rendered measurements completed with 500 visible logical vertices, five warm-ups and 30 measured samples per operation in Chromium and Firefox. Several Apply/handle operations exceed the inherited 100 ms p95 budget. The current run, matched repeat and baseline precision-asset run all fail; the baseline substitutes only the precision core/adapter assets, not the full application. This establishes an existing absolute-budget failure, not a waiver or proof that every timing difference is harmless.

The complete operation table, raw report paths and qualifications remain in specs/030-critical-browser-journeys/evidence.md. The workload has five full coordinate labels and 495 collision fallback dots, not 500 legible text labels. Active-line handle timing measures the actual temporary-marker update/redraw, not a handle rebuild. The separate 500-shape overlap-error clearing diagnostic passes its 250 ms bound in both browsers; it does not establish the inherited 10,000-parcel advisory/decision workload. Required performance acceptance remains unresolved independently of the final correctness run.

Reports and CI

The configured CI job installs Chromium and Firefox, supplies explicit disposable database identity and opt-in, and runs the same default make e2e. The lint → e2e → Django order, both Node collections and existing correctness/cost controls remain in place. Configuration/collection tests pass; this is not a claim of a successful remote CI or full browser run.

The owned guard retains migration/setup/server logs, first-failure traces and separate JSON/HTML project results under the private run directory. For coordinated direct diagnostics use PLAYWRIGHT_JSON_OUTPUT_NAME and PLAYWRIGHT_HTML_OUTPUT_DIR with unique paths. E2E_JSON_REPORT and E2E_HTML_REPORT are not supported settings and do not protect a default report from a later overwrite. Raw authenticated reports, sessions, manifests and generated files remain ignored/private; never publish session-bearing fixtures. CI artifact exclusions are verified independently of browser outcomes.

Visible Windows browser with Django in WSL2

The earlier Windows workaround used a separate ignored .windowstmp/windows-e2e checkout to avoid mixing Windows and Linux node_modules. Its manual migration, forced fixture opt-in and direct session copying sequence predates the feature-030 guard/manifest/observer contract and is not the current guarded acceptance procedure. Do not reuse it to bypass target verification or attach an unverified server.

Use the WSL guarded runner for current automated profiles. A native Windows diagnostic route needs an explicitly verified server lifecycle and compatible private manifest/observer paths before use; none is asserted validated here. For the distinct visible Firefox extension workflow, use the linked launcher runbook rather than treating a headed page test as container acceptance.

Historical coverage snapshot and skip inventory

The disposable run on 22 July 2026 reported 26 passed, 14 skipped, zero failed. The older 41-test discovery baseline and ceilings of 14 or 15 skips belong to previous configurations. They are not the current 86/14 identity contract or permission for any mandatory skip.

Historical skipped area Count Former missing dependency Current disposition
Centralized basemap inheritance 2 Provider keys, secondary paths and rejection URL Mandatory controlled-resource companions; focused recovery and the complete default run pass.
Draft editing exchange 3 Eligible actor-visible draft Mandatory companions with independent draft slots; not optional.
MapTiler provider 2 Enabled provider configuration Mandatory controlled styles/logo and native-error fallback; focused recovery and the complete default run pass.
Parcel overlap governance 1 Known conflicting geometry Mandatory companion with owned geometry; not optional.
Split and merge topology 3 Independent split/merge/corner sources Mandatory companions with per-case source slots; not optional.
Upload draft workflow 3 Preview/status/result and denied route Mandatory companions with private files and rows; status route/reset regressions pass.

Every original test locator, mutator, fixture dependency and skip condition is inventoried in tests/e2e/fixtures/scenarios.json. The preserved skip statements are not accepted evidence: missing slot prerequisites fail setup, and any resulting required skip fails the reporter.

Completion criteria

  1. Preserve the completed fixture-reset/preflight negative boundaries, double-preparation, mutation-isolation and unowned sentinel proof on subsequent harness changes; the latest 39-test matrix passes.
  2. Retain artifact-backed controlled-provider and business-journey execution, including every recovery subcase and both precision cases in declared browsers.
  3. Run final default guarded make e2e with all 86 Chromium and 14 Firefox identities executed, zero failures and zero skips; inspect all retries/flakes.
  4. Validate inherited rendered performance at its specified workloads, not from compact correctness fixtures or mocked timing.
  5. Record actual real-container acceptance or its precise separate blocker, and complete owner-controlled review/publication gates without overstating results.