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 intest-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 intest-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_SCENARIO_SET=geometry-preservation explicitly selects the 22 registered
geometry-preservation scenarios. With the mandatory profile and zero retries,
preparation creates 44 slots (22 Chromium and 22 Firefox) instead of the
full profile's 144. The Python registry validator resolves this named set from
independent required evidence; the guard, preparation, browser collection and
coverage reporter use that same selection. Unknown sets, incompatible profiles,
mismatched scenario IDs and a nonempty E2E_GREP combined with a set are rejected.
Preflight also rejects manifests whose selected IDs, profile, retries or slots
differ from the guard. Existing per-slot resource ownership checks still apply.
Owner-run focused command, after verifying disposable-target authority:
make e2e E2E_PROFILE=mandatory E2E_RETRIES=0 E2E_SCENARIO_SET=geometry-preservation E2E_GREP= E2E_GENERATED_ENV_FILE=test-results/geometry-preservation-red-local/generated.env
For feature 031's focused validation, the owner selected disposable
e2e_landtooldb at 127.0.0.1:5436 in lmstool2-postgis-test. The isolated,
ignored output path above avoids reusing the prior remote target's manifest.
Run-specific evidence and remaining acceptance work are described below.
See tasks/todo.md, section “Checkpoint 1: explicit focused fixture selection
(2026-09-19)”, for selector TDD evidence, and the corrected red-gate section below
for the completed T023 browser gate.
The subsequent owner run prepared all 44 slots and passed readiness, but both browsers stopped before collection at the coverage reporter's registry import. That module-loading failure is harness evidence, not a geometry regression. The reporter now uses the same loader as the TypeScript configuration for the shared registry bridge. Before requesting another guarded run, check the real configuration and its configured reporters without launching browsers or fixtures:
node --test tests/node/e2e_focused_selection.test.mjs tests/node/e2e_skip_budget_reporter.test.mjs
The collection tests invoke Playwright --list with the actual repository
configuration and all its reporters, using isolated temporary report paths.
They verify 22 cases for each individually selected browser, 44 for the focused
set and 144 for unfiltered mandatory collection, and reject missing browser
evidence. A --reporter=json override alone bypasses the coverage reporter and
cannot validate this loading contract. Collection reports remain incomplete
execution evidence. See tasks/todo.md, section “Checkpoint 1: actual Playwright
reporter loading contract (2026-09-19)", for the module-contract red/green checks.
The later owner run 5a8152f4a6254408bbb1692300e0acb9 prepared exactly 44 slots;
preflight and readiness agreed on the generation. Chromium and Firefox each
executed all 22 selected cases, with zero skips or collection errors. Independent
triage on 2026-09-20 confirms 41 application failures, including persisted EWKB
drift, invalid ring transport, missing intent and retained released bindings.
Three results do not establish the intended regression: both overlap cases
stopped at a pending trace preview, and Firefox's no-op case timed out clicking
a vertex after zooming. The test now configures every snapping mode explicitly,
waits for each settings response, and waits for stable zoom completion. The
53 reporter/collection controls pass; those checks do not execute the corrected
gestures. At that point, T023 still required corrected browser evidence.
See tasks/todo.md, section “Checkpoint 1: owner-run red triage and remaining
browser harness corrections (2026-09-20)”, for case-level evidence and recovery.
The corrected owner run 90e3572469c6454fba59469a74a7cb7f closes that red gate.
Setup, preflight and readiness agree on 44 slots in one generation. Chromium
and Firefox each executed 22 cases: 21 genuine application failures and one
passing material-overlap compatibility control, with zero skips, unexecuted
cases, retries or collection errors. Both no-op cases now fail the exact
projected-baseline assertion, including 0.0316395478 m and 0.0506092791 m residuals
against near-zero independent references, even though neighbour area stays zero.
Other failures reproduce persisted attribute drift, invalid one-ring transport,
missing intent and retained released bindings. Existing Django/Node red evidence
and green fixture/observer/selector/reporter evidence are reused unchanged.
See tasks/todo.md, section “Checkpoint 1: corrected red gate complete
(2026-09-20)”, for inspected versus personally executed checks and downstream
assertions not yet reached. At that red checkpoint, T001–T023 were complete;
T024–T049 and all green application acceptance remained pending. No production
behavior changed during the red prepass. Subsequent focused green runs are owner-authorized on the same
local disposable target; unfiltered browser validation belongs to the final
checkpoint.
Checkpoint 2 owner run 4ba5981b9bfa4bc69cf828f64d11e432 now supplies US1 green
evidence after T024–T028. Setup/preflight/readiness agree on 44 slots; each
browser executes 22 cases, with zero skips, unexecuted cases, retries or
collection errors. SOURCE, SOURCE-NO-DRAWING, APPROVAL and NOOP pass in both
browsers. Their assertions require exact payload/proposal baseline equality,
zero neighbour area and unrelated authoritative conflicts, retained attributes,
successful submission/approval and the existing no-change restriction.
The unchanged 15 focused Django and 16 focused Node passes remain valid.
T029 and checkpoint 2 are complete; the full focused gate is still failing.
Chromium passes 17/fails 5; Firefox passes 18/fails 4. Both fail
NEW-CHAIN-NO-DRAWING, CANCEL, BINDING-RELEASE and MICRO-ONLY; Chromium also fails
DELETION when the overlap overlay intercepts the click (Firefox passes).
At that checkpoint, T030–T049 remained pending, including corrections, focused green,
broader compatibility and final performance. See tasks/todo.md, section
“Checkpoint 2: owner-run US1 green gate complete (2026-09-20)”, for measurements,
assertion limits, source-hash verification and recovery. This is inspected
owner-run evidence, not a new writer-run browser invocation.
A named selection remains partial package evidence, but all selected evidence is required, even when an additional browser filter would omit it. Both projects are attempted after assertion failures, provided the guard still owns the live server; any failed project makes the command fail. Full mandatory CI retains every registered scenario and its existing coverage enforcement when the selector is unset. To explicitly clear local focused settings:
make e2e E2E_PROFILE=mandatory E2E_RETRIES=0 E2E_SCENARIO_SET= E2E_GREP=
E2E_GREP alone filters browser execution without pruning fixtures and reports
partial evidence; arbitrary grep text never selects fixture resources.
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.
Feature 031 checkpoint 3 is complete. The earlier owner run
5cfc9e339d134a1586656cbf6079ec43 passed 19 Chromium and 20 Firefox cases;
CANCEL, MICRO-ONLY and Chromium DELETION still failed. Fail-first Node coverage
preceded the session restoration, pending-response ownership, existing-ring
handle and non-interactive overlap presentation fixes. The original browser
assertions were retained.
Owner run a77c01d1d0654ae7a93230e152576bc1 now passes 22/22 in Chromium
and 22/22 in Firefox, with zero failures, skips, retries, unexecuted cases or
collection/reporter errors. Setup/preflight/readiness agree on exactly 44 slots
in generation e99ec8062804bfd6a0075184ee00da7f, against disposable local
e2e_landtooldb at 127.0.0.1:5436. The owner's generated environment is under
test-results/geometry-preservation-checkpoint3-green-owner/. This supersedes
the earlier sandbox alias launch blocker for focused acceptance. The unchanged
31 Django and 116 Node passes are retained after comparing 519 runtime/test hashes.
Independent read-only observations of all 44 retained slots confirm final
geometry and workflow outcomes. CANCEL has exact payload/proposal baseline
EWKB and zero neighbour area. MICRO-ONLY retains a 0.00999999896157534 m
vertex displacement with 0.025000017211875343 m² symmetric difference below
the existing 0.0375 m² change threshold and remains DRAFT. Deliberate partial
edits retain every untouched vertex within its independent reference residual;
subsequent attribute-only saves preserve the edited baseline exactly. Both
DELETION cases now pass without forced clicks, longer timeouts or test changes.
T032–T038 are checked. The selected reporter still correctly says
selection=partial complete=false reliable=true: broader/full Django,
unfiltered mandatory E2E, final documentation/source quality, performance/query
evidence and final review remain checkpoint-4 gates. Black and make check
remain unapproved. Commands, complete measurements, provenance and evidence
limits are in tasks/todo.md, section “Checkpoint 3: owner-run focused green
gate complete (2026-09-20)”. No raw private fixture/session data is published.
Feature 031 checkpoint 4 has executed full-application validation. Its focused correction checks pass 35 Django tests; broader Node checks pass 208 tests, and broader/shared-consumer Django checks pass 205 tests, all without skips. The full Django command runs 1,230 tests: 1,212 pass, 17 existing opt-in measurements skip, and the topology workspace release benchmark fails at 2.4654226709972136 s p95 against <2 s. Validation, approval and queue/query benchmarks pass. The failed workspace workload has 20 outputs of 497 vertices and 20 samples. No matched base timing is available, so this is not labelled a proven pre-existing failure. The owner subsequently provisionally accepts this environmental timing variance under concurrent heavy LLM/Python load and instructs the flow to continue. That run satisfied T039 under explicit acceptance, not a literal threshold pass. The strict <2 s benchmark and the feature's final 100/250 ms budgets are unchanged.
The final inspected browser evidence covers all 144 mandatory scenario/browser
pairs: 108 Chromium and 36 Firefox passes, with zero skips, failures, retries,
flakes or unexecuted cases. Run 2f0517ccd4374971b313bf44084f4a64 prepared
144 slots and completed Chromium in 43.6 minutes; its Firefox log stops after
seven passes without a final report. The separate guarded, unfiltered Firefox
run 06ae2052e86e4922bdd48bc167bbe7ea prepared all 36 Firefox slots and
passed them in 28.4 minutes. Each run's setup, preflight and readiness agree.
Both use disposable local e2e_landtooldb at 127.0.0.1:5436.
Independent comparison of the complete JSON case identities with the validated
registry establishes the full mandatory union. These are complementary project
results, not a claim that the interrupted outer command exited successfully.
The reporter's selection=partial complete=false denotes its per-project scope;
both reports have e2ePartial=false, no scenario set and no shard. At inspection, all 529
inventoried runtime/test/configuration paths matched the preceding checkpoint-4
snapshot. Subsequent review found that malformed empty JSON snap contexts could
clear saved bindings on an unchanged save. A fail-first Django regression and
narrow workflow correction now reject that input; all 31 focused Django cases
pass. The earlier browser results predate this correction. T039 and T042 are
reopened for revalidation, with focused green required before broader reruns.
The fresh guarded run c8b9468721dd4caeb22f38ada941eec0 prepared exactly
44 slots. Chromium passed 22/22; Firefox passed 21/22 and timed out on APPROVAL.
There were no skips, retries, unexecuted cases or collection/reporter errors.
Its trace records the overlap panel changing during the Submit Draft click,
followed by neither confirmation dialog nor submission POST. The preceding
exact persisted-baseline assertion passed. The interaction failure remains
unresolved; the guard exited unsuccessfully and stopped its server. This run
does not establish focused green or waive any final acceptance obligation.
The implementation evidence ledger records commands, registry verification, prior red/focused-green ordering, the accepted Django timing variance and remaining performance/query gates. The workflow guide explains exact source/draft preservation, deliberate edits and recovery. Final precision/snapping performance acceptance remains pending.
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¶
- 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.
- Retain artifact-backed controlled-provider and business-journey execution, including every recovery subcase and both precision cases in declared browsers.
- Run final default guarded
make e2ewith all 86 Chromium and 14 Firefox identities executed, zero failures and zero skips; inspect all retries/flakes. - Validate inherited rendered performance at its specified workloads, not from compact correctness fixtures or mocked timing.
- Record actual real-container acceptance or its precise separate blocker, and complete owner-controlled review/publication gates without overstating results.