Files
jobtrackingapp/docs/ui-modernisation/DISCOVERY_NATIVE_DRAWER_RECONCILIATION.md
T

7.3 KiB

Existing discovery browser tests: mobile drawer reconciliation

Status: PASSED — all 11 existing tests passed together on the exact final test source, with no retries, skips or flaky outcomes. This is bounded browser regression evidence, not full A3 or release acceptance.

Baseline: published A3 ec57a24d77854bb416c9ea02b8b371be3e5554c0. Isolated branch codex/a3-discovery-native-drawer; worktree C:\Users\Connor\.codex\worktrees\a3-discovery-native-drawer\Job tracker.

This package changes only e2e/phase7-discovery.spec.ts, e2e/saved-search-repair.spec.ts and bounded evidence. Final application source is the baseline plus the root-owned confirmation fix df93bfb64eb80dbfa30f86c89b54a9021c43a9c6, cherry-picked locally as a584fc0b. That separate source fix must not be applied twice when integrating this test/evidence package. The separate Add/Edit dates package is not included.

Changes

Existing narrow journeys now explicitly open Search filters, edit drawer fields, close or jump to results, and reopen filters for saved-row actions/readback. The top-level query remains outside the modal; draft edits use the real visible controls in sequence. English/Bokmål drafts and native owner writes/readbacks remain asserted. Held requests continue checking disabled mounted controls, closed-drawer unavailability, one request per activation, progress announcements, stable retry context and focus. Busy assertions do not open a drawer or move focus away from the pending control. Drawer helpers use authoritative aria-expanded state and include hidden exiting dialog nodes when waiting for physical unmount, avoiding transition-time locator snapshots.

Confirmation locators identify their own title because the filter Drawer is also a dialog. Dismiss errors are scoped to the visible Results region, distinguishing its error from the retained hidden drawer copy. The result-region keyboard journey now asserts the new Return to search button before the existing Sort control. The desktop language test uses the current Norsk bokmål accessible name. The mobile user-moved-focus test uses the persistent header User control as its neutral focus destination.

No provider rights, routes, application behavior, persistence assertions, error/focus assertions or approval gates are relaxed. Only previously documented vacancy search/run output and explicitly injected faults/dismiss presentation use interception. Native saved-search listing/create/alert updates/delete and foreign/anonymous denials remain actual isolated API calls. The provider boundary remains recorded in each suite.

Execution and evidence

All runs used one serialized Chromium worker, Playwright-managed API/Next servers, a unique disposable SQLite root, disabled model/import/alert workers and the installed .NET 9.0.317 executable. No reused server, external provider or model was used. The root's separate new drawer and controlled saved-search matrices were not repeated.

Native run Result Scope
pilot 3 passed, 1 failed Held saved B, failed saved-run retry, native keyboard create/alert/delete, native saved-list faults
remainder 5 passed, 2 failed Other seven existing cases; Dismiss and locale failed on obsolete selectors/tab assumptions
focused 1 passed, 2 failed Locale corrected; Dismiss reached new Return to search tab stop; confirmation focus diagnostic reproduced
dismiss 3 passed Corrected Dismiss plus held-B/retry; later helper review identified avoidable focus movement
focus-preserved 2 passed, 1 failed Busy checks preserved original focus; held-B exposed exiting-drawer locator timing
confirm-fix 1 passed, 1 failed Original native keyboard create/delete passed on root modal fix; held-B helper still transient
held-final 1 failed Isolated held-B helper race, retained as failed evidence
held-stable 1 passed Focus-preserving helper stabilization; later combined run exposed hidden-node timing
final11 10 passed, 1 failed First combined run; only exiting-drawer locator timing remained
final-stable11 11 passed Exact final helpers/callers plus root modal fix; complete two-spec run

These runs overlap and must not be summed. The final combined run alone passed 11 tests, including the full native keyboard cancellation/held-delete journey, with 31 screenshots and 27 automated accessibility audits. Early native-keyboard failures did not execute their subsequent steps; the final combined run did. The final raw receipt reports zero skipped, unexpected or flaky outcomes.

Exact native Playwright JSON/list outputs are gzip-preserved under evidence/discovery-native-drawer. The manifest records raw/compressed byte lengths and SHA256 hashes. Latest distinct outcomes identifies the latest execution for every existing case. JSON retains screenshots/audits/request-boundary/focus attachments. These are actual local executions, not production or human/device acceptance.

  • PASSED: Release API build: zero warnings/errors.
  • PASSED: TypeScript and scoped ESLint.
  • PASSED: git diff --check.
  • PASSED: graphify update ., local AST-only graph refresh. Missing optional PDF/SQL extractors and files without extracted symbols remain graph coverage limits. Generated graph files remain local/untracked.
  • NOT RUN: Hosted MariaDB, providers, live models, human accessibility/device qualification, production acceptance.

Startup logs contain existing SQLite migration and disposable Data Protection key warnings. The final combined run contains zero UNIQUE-constraint errors; no checklist recovery claim is needed for that run.

Reproduced application issue and resolution

The Bokmål 360px native keyboard journey opens a saved-search Delete confirmation above the already open temporary Search filters Drawer. Before the root fix, Cancel had autoFocus but the actual active element was a DIV with role="presentation" containing the confirmation. The original Cancel-focus assertion reproduced the defect and remains intact.

The drawer was reopened after a manual Search had automatically returned to Results. Failed active element, native trace, screenshot and error context preserve the observation. The root fix recovers Cancel on transition completion only when focus remains exactly on the confirmation container, preserving intentional focus elsewhere. The single original case then passed; the final combined run passed its original focus trap, Cancel restoration, held native DELETE, request-count and persisted deletion checks. Final pre-assertion focus snapshot still observes the container before transition completion; the subsequent unchanged polling assertion establishes that Cancel receives focus afterward. No blanket focus-enforcement changes or relaxed assertions were introduced.

Rollback: revert this test/evidence package to restore the old callers. Application rollback is separately owned by the root confirmation fix. Publication/integration is left to the parent development lane. Hosted MariaDB, live providers/models, human/device accessibility and final integrated security/release gates remain separate.