diff --git a/docs/ui-modernisation/DISCOVERY_VALIDATION.md b/docs/ui-modernisation/DISCOVERY_VALIDATION.md
new file mode 100644
index 00000000..4e7f9390
--- /dev/null
+++ b/docs/ui-modernisation/DISCOVERY_VALIDATION.md
@@ -0,0 +1,31 @@
+# A3-IM05 existing discovery presentation qualification
+
+3 November2026. Owner explicitly answered **"Approve applications and A3-IM05"**. Branch codex/a3-ui-05 starts at accepted application receipt172074e9. No older design tree or unrelated implementation branch merged.
+
+Filters and saved searches form a left rail beside a single result list above1000px. Narrow screens preserve filters-before-results DOM order; Jump to results and Return to search filters move focus without requests or route changes. Source coverage explanation is above both columns. Existing query/location fields, sort, saved-search create/run/pause/delete/dismiss, source attribution/provenance/original links, Save-to-tracker route and busy/empty/error/retry owners remain unchanged. Added only three paired EN/NB labels. UI language does not translate source content.
+
+This is presentation of the existing NAV workflow. No new country, provider, radius, taxonomy, matching or in-app full-description capability was fabricated. Global Jobs' future three-pane authorised-detail experience depends on GJ prerequisites, rights and actual data contracts. GJ-00 planning is separate; GJ-01+ acceptance/provider activation is not implied. Source master and initial planning pack were read at `E:\Storage\Projects\Active\Job tracker\docs\planning\global-jobs-prompts\` because this older integration branch does not contain that pack. The original external source's provider/prerequisite constraints remain intact.
+
+| Evidence | Result and boundary |
+|---|---|
+| Baseline |21 discovery tests passed before edits |
+| Test-first focus contracts |Two EN/NB missing-landmark failures reproduced before implementation |
+| Final frontend |32 tests/3 suites passed: discovery23, provider6, catalogue3; reviewer23 and baseline overlap, not additional cases |
+| Backend preservation |14 passed, zero failures/skips: JobDiscoveryControllerTests, SavedJobSearchSqliteTests, SavedJobSearchAlertTests. Synthetic HTTP handler/FakeDiscovery, InMemory/isolated SQLite; no live NAV/provider request or app worker activation |
+| Types/full lint/build |Passed; new browser script also passed scoped zero-warning lint |
+| Built React browser |16 conditions:320/390/768/1440 × EN/NB × light/dark;48 whole-page axe scans, zero violations,48 PNGs |
+| Connected journeys |All16: initial guidance/no automatic provider search, keyboard jump/return, wide/stack geometry, three-occupation search, save nurse/Oslo query, pause alerts, manual saved run, retained original link, dismiss and separately confirmed deletion |
+| Mutation boundary |80 explicit requests fulfilled only by in-memory fixtures:16 each create/pause/run/dismiss/delete. Zero unexpected writes/page errors. All external requests aborted; no real backend/provider writes |
+| Independent review |No actionable findings;23 tests/one suite passed independently, overlapping32. Reviewer did not independently execute browser/backend |
+
+Native reports/captures and source manifest: [evidence/discovery](evidence/discovery). Browser harness runs from job-tracker-ui: `rtk proxy node scripts/verify-a3-discovery.mjs`, against the static export on localhost4338. Synthetic nurse/teacher/engineer listings are fixtures, never represented as current live search results. Source data remains in its original language even in Bokmål UI.
+
+Two harness defects were corrected: initial URL used a nonexistent /jobs/discover path instead of /discover; immediate uncheck assumed optimistic switch state. The final verifier clicks the control and waits for the existing backend-acknowledged state. No application behavior was weakened to satisfy either harness issue. Failed attempts are not passing journeys. Fixed bars can appear within full-page scroll captures; native-device layout is not qualified by those captures.
+
+Existing unit coverage retains sorting/metadata, initial versus empty results, saved-list validation/loading/retry, per-search result boundaries, stale-free request snapshots, failure-retained drafts/toggles/deletion/dismissal, duplicate-start prevention, current-language errors without replay, and explicit mutation recovery. These are controlled contracts; the browser did not repeat every failure path or perform actual Save-to-tracker import.
+
+No backend/schema/API/dependency/revision writer/route or physical document renderer changes. Existing owner/persistence/right checks stay with their services. Rollback reverts this UI increment; no database or data rollback. The separate ca519cac document-date patch and de3d5031 security policy are not silently combined here.
+
+NOT RUN: live NAV/commercial providers, MariaDB, real backend/browser end-to-end, hosted CI, native screen-reader/device/touch/actual zoom/native-language review, final integrated security/recovery/release. Complete Product Review, Global Jobs, European localisation and Phase10 remain open. No production/main changes.
+
+Next protected dependency: publish/remote verify and owner Gate F before A3-IM06 Career overview/CV/letter workflows. Deferred CV-import engine overhaul remains excluded; canonical Career Profile, null-as-inherit settings, undo/save/conflict/history and RD21 must be preserved.
diff --git a/docs/ui-modernisation/UI-05.md b/docs/ui-modernisation/UI-05.md
new file mode 100644
index 00000000..c7daca14
--- /dev/null
+++ b/docs/ui-modernisation/UI-05.md
@@ -0,0 +1,13 @@
+# A3-IM05 — discovery presentation and existing saved searches
+
+3 November2026 owner reply: **"Approve applications and A3-IM05"**. Application implementation98e9502a/publication receipt172074e9 accepted for progression. Isolated codex/a3-ui-05 starts at172074e9. No new international provider or geography authorization is inferred.
+
+## Bounded plan
+
+- [x] Baseline21 existing discovery tests passed.
+- [x] Filter/saved-search rail left, result list right above1000px; narrow logical stack and named jump/return focus. Existing source explanation prominent.
+- [x] All existing handlers/semantics retained; no unsupported provider/country/radius controls or API changes.
+- [x]32 selected frontend/3 suites,14 mocked-provider/local backend tests, type/lint/build,16 controlled browser journeys/48 scans/captures passed. Independent review found no actionable issue; reviewer23 overlaps32.
+- [ ] Publish/readback, Gate F before A3-IM06 Career/CV/letter work.
+
+Callers: JobDiscoveryPage, its EN/NB messages, tests and browser fixtures only. Existing API/data/provider owners retained. Canonical occupation/geography expansion remains Global Jobs work with its own prerequisites and permissions; GJ-01+ is not accepted by a presentation change. Rollback reverts presentation/tests; no migration or data rollback. Preserve source ads and generated-content language distinction.
diff --git a/docs/ui-modernisation/evidence/discovery/BASELINE.json b/docs/ui-modernisation/evidence/discovery/BASELINE.json
new file mode 100644
index 00000000..6d0fcd33
--- /dev/null
+++ b/docs/ui-modernisation/evidence/discovery/BASELINE.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":1,"numPassedTests":21,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":21,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1793697255037,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":248,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"shows honest source metadata and offers the existing reviewed save flow","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793697258527,"status":"passed","title":"shows honest source metadata and offers the existing reviewed save flow"},{"ancestorTitles":[],"duration":74,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"distinguishes the initial guidance from a completed empty search","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697258775,"status":"passed","title":"distinguishes the initial guidance from a completed empty search"},{"ancestorTitles":[],"duration":162,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries the last submitted search after an error","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793697258849,"status":"passed","title":"retries the last submitted search after an error"},{"ancestorTitles":[],"duration":167,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"sorts returned vacancies by title","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793697259011,"status":"passed","title":"sorts returned vacancies by title"},{"ancestorTitles":[],"duration":71,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders the discovery workflow in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793697259178,"status":"passed","title":"renders the discovery workflow in Norwegian Bokmål"},{"ancestorTitles":[],"duration":201,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"runs a saved search, marks unseen vacancies, and dismisses them","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793697259249,"status":"passed","title":"runs a saved search, marks unseen vacancies, and dismisses them"},{"ancestorTitles":[],"duration":77,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"lets the user pause automatic alerts for a saved search","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697259450,"status":"passed","title":"lets the user pause automatic alerts for a saved search"},{"ancestorTitles":[],"duration":50,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"announces saved-search loading without presenting a successful empty list","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793697259527,"status":"passed","title":"announces saved-search loading without presenting a successful empty list"},{"ancestorTitles":[],"duration":265,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"reports saved-search failure and retries that read without replacing active discovery filters or results","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793697259577,"status":"passed","title":"reports saved-search failure and retries that read without replacing active discovery filters or results"},{"ancestorTitles":[],"duration":52,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload null as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697259842,"status":"passed","title":"rejects malformed saved-search payload null as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":60,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload {\"message\":\"not a list\"} as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697259894,"status":"passed","title":"rejects malformed saved-search payload {\"message\":\"not a list\"} as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":61,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload [{\"id\":7}] as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697259954,"status":"passed","title":"rejects malformed saved-search payload [{\"id\":7}] as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":246,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a manual search after saved-search results has no dismiss action belonging to the saved search","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793697260015,"status":"passed","title":"a manual search after saved-search results has no dismiss action belonging to the saved search"},{"ancestorTitles":[],"duration":206,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"starting saved search B hides saved search A's results and actions while the B response is held","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793697260261,"status":"passed","title":"starting saved search B hides saved search A's results and actions while the B response is held"},{"ancestorTitles":[],"duration":250,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retrying a failed saved-search run repeats that saved ID instead of running a manual query","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793697260467,"status":"passed","title":"retrying a failed saved-search run repeats that saved ID instead of running a manual query"},{"ancestorTitles":[],"duration":199,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed saved-search creation retains its draft and recovers only through the save action","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793697260717,"status":"passed","title":"failed saved-search creation retains its draft and recovers only through the save action"},{"ancestorTitles":[],"duration":137,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed alert toggle retains its checked state and recovers through that same toggle without manual search retry","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793697260916,"status":"passed","title":"a failed alert toggle retains its checked state and recovers through that same toggle without manual search retry"},{"ancestorTitles":[],"duration":408,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed saved-search deletion preserves the search and requires another explicit confirmation to recover","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793697261054,"status":"passed","title":"failed saved-search deletion preserves the search and requires another explicit confirmation to recover"},{"ancestorTitles":[],"duration":317,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed dismissal retains the vacancy and recovers only through that same result's dismiss action","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793697261462,"status":"passed","title":"failed dismissal retains the vacancy and recovers only through that same result's dismiss action"},{"ancestorTitles":[],"duration":125,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held saved-search creation locks its request snapshot and prevents a second start while preserving a failed draft","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793697261779,"status":"passed","title":"a held saved-search creation locks its request snapshot and prevents a second start while preserving a failed draft"},{"ancestorTitles":[],"duration":141,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a saved-run failure follows the current language without refetching or replaying the request","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793697261904,"status":"passed","title":"a saved-run failure follows the current language without refetching or replaying the request"}],"endTime":1793697262047,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\job-discovery.test.tsx","startTime":1793697255934,"status":"passed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/discovery/CHECKS.json b/docs/ui-modernisation/evidence/discovery/CHECKS.json
new file mode 100644
index 00000000..bd5faf2b
--- /dev/null
+++ b/docs/ui-modernisation/evidence/discovery/CHECKS.json
@@ -0,0 +1,17 @@
+{
+ "date": "2026-11-03",
+ "branch": "codex/a3-ui-05",
+ "base": "172074e90f3c7067b1cbc7e65724b303c2fc9ff6",
+ "frontend": {"passed": 32, "failed": 0, "suites": 3, "report": "FINAL_TESTS.json"},
+ "backend": {"passed": 14, "failed": 0, "skipped": 0, "report": "backend/a3-discovery.trx", "environment": "mock HTTP/FakeDiscovery with InMemory/isolated SQLite"},
+ "commands": [
+ {"command": "rtk proxy npm run typecheck", "exitCode": 0},
+ {"command": "rtk proxy npm run lint", "exitCode": 0},
+ {"command": "rtk proxy npm run build", "exitCode": 0},
+ {"command": "rtk proxy npm exec eslint -- scripts/verify-a3-discovery.mjs --max-warnings=0", "exitCode": 0},
+ {"command": "rtk proxy node scripts/verify-a3-discovery.mjs", "exitCode": 0},
+ {"command": "rtk proxy graphify update .", "exitCode": 0, "limits": "AST only; SQL extractor unavailable"}
+ ],
+ "independentReview": {"result": "no actionable findings", "testsPassed": 23, "overlapsFrontend": true},
+ "notRun": ["live NAV or commercial providers", "new global geography/taxonomy/provider features", "MariaDB", "real backend browser integration", "hosted CI", "native device/screen-reader/zoom/language qualification", "actual Save-to-tracker import", "final integrated security", "production/release"]
+}
diff --git a/docs/ui-modernisation/evidence/discovery/FINAL_TESTS.json b/docs/ui-modernisation/evidence/discovery/FINAL_TESTS.json
new file mode 100644
index 00000000..72ac6713
--- /dev/null
+++ b/docs/ui-modernisation/evidence/discovery/FINAL_TESTS.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":3,"numPassedTests":32,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":3,"numTotalTests":32,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1793697338423,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":184,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps en filters before results with keyboard jump/return and no automatic provider search","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793697341920,"status":"passed","title":"keeps en filters before results with keyboard jump/return and no automatic provider search"},{"ancestorTitles":[],"duration":72,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps nb filters before results with keyboard jump/return and no automatic provider search","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793697342105,"status":"passed","title":"keeps nb filters before results with keyboard jump/return and no automatic provider search"},{"ancestorTitles":[],"duration":163,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"shows honest source metadata and offers the existing reviewed save flow","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793697342177,"status":"passed","title":"shows honest source metadata and offers the existing reviewed save flow"},{"ancestorTitles":[],"duration":89,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"distinguishes the initial guidance from a completed empty search","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697342340,"status":"passed","title":"distinguishes the initial guidance from a completed empty search"},{"ancestorTitles":[],"duration":183,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries the last submitted search after an error","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793697342429,"status":"passed","title":"retries the last submitted search after an error"},{"ancestorTitles":[],"duration":168,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"sorts returned vacancies by title","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793697342612,"status":"passed","title":"sorts returned vacancies by title"},{"ancestorTitles":[],"duration":66,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders the discovery workflow in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793697342780,"status":"passed","title":"renders the discovery workflow in Norwegian Bokmål"},{"ancestorTitles":[],"duration":237,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"runs a saved search, marks unseen vacancies, and dismisses them","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793697342846,"status":"passed","title":"runs a saved search, marks unseen vacancies, and dismisses them"},{"ancestorTitles":[],"duration":107,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"lets the user pause automatic alerts for a saved search","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697343083,"status":"passed","title":"lets the user pause automatic alerts for a saved search"},{"ancestorTitles":[],"duration":61,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"announces saved-search loading without presenting a successful empty list","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793697343190,"status":"passed","title":"announces saved-search loading without presenting a successful empty list"},{"ancestorTitles":[],"duration":282,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"reports saved-search failure and retries that read without replacing active discovery filters or results","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793697343251,"status":"passed","title":"reports saved-search failure and retries that read without replacing active discovery filters or results"},{"ancestorTitles":[],"duration":69,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload null as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697343533,"status":"passed","title":"rejects malformed saved-search payload null as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":63,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload {\"message\":\"not a list\"} as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697343602,"status":"passed","title":"rejects malformed saved-search payload {\"message\":\"not a list\"} as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":64,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload [{\"id\":7}] as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697343665,"status":"passed","title":"rejects malformed saved-search payload [{\"id\":7}] as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":189,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a manual search after saved-search results has no dismiss action belonging to the saved search","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793697343729,"status":"passed","title":"a manual search after saved-search results has no dismiss action belonging to the saved search"},{"ancestorTitles":[],"duration":258,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"starting saved search B hides saved search A's results and actions while the B response is held","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793697343918,"status":"passed","title":"starting saved search B hides saved search A's results and actions while the B response is held"},{"ancestorTitles":[],"duration":314,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retrying a failed saved-search run repeats that saved ID instead of running a manual query","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793697344176,"status":"passed","title":"retrying a failed saved-search run repeats that saved ID instead of running a manual query"},{"ancestorTitles":[],"duration":181,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed saved-search creation retains its draft and recovers only through the save action","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793697344490,"status":"passed","title":"failed saved-search creation retains its draft and recovers only through the save action"},{"ancestorTitles":[],"duration":108,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed alert toggle retains its checked state and recovers through that same toggle without manual search retry","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793697344671,"status":"passed","title":"a failed alert toggle retains its checked state and recovers through that same toggle without manual search retry"},{"ancestorTitles":[],"duration":402,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed saved-search deletion preserves the search and requires another explicit confirmation to recover","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793697344779,"status":"passed","title":"failed saved-search deletion preserves the search and requires another explicit confirmation to recover"},{"ancestorTitles":[],"duration":311,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed dismissal retains the vacancy and recovers only through that same result's dismiss action","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793697345181,"status":"passed","title":"failed dismissal retains the vacancy and recovers only through that same result's dismiss action"},{"ancestorTitles":[],"duration":156,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held saved-search creation locks its request snapshot and prevents a second start while preserving a failed draft","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793697345492,"status":"passed","title":"a held saved-search creation locks its request snapshot and prevents a second start while preserving a failed draft"},{"ancestorTitles":[],"duration":160,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a saved-run failure follows the current language without refetching or replaying the request","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793697345648,"status":"passed","title":"a saved-run failure follows the current language without refetching or replaying the request"}],"endTime":1793697345809,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\job-discovery.test.tsx","startTime":1793697339310,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":27,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"migrates the legacy Norwegian code and persists Bokmål using nb-NO","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793697346444,"status":"passed","title":"migrates the legacy Norwegian code and persists Bokmål using nb-NO"},{"ancestorTitles":[],"duration":6,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"hydrates an authenticated server preference without writing it back","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697346471,"status":"passed","title":"hydrates an authenticated server preference without writing it back"},{"ancestorTitles":[],"duration":270,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed account language save keeps the local choice and offers a localized retry: Norsk","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793697346478,"status":"passed","title":"a failed account language save keeps the local choice and offers a localized retry: Norsk"},{"ancestorTitles":[],"duration":262,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed account language save keeps the local choice and offers a localized retry: English","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793697346749,"status":"passed","title":"a failed account language save keeps the local choice and offers a localized retry: English"},{"ancestorTitles":[],"duration":9,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a delayed language-save failure cannot offer a retry for a newer successful choice","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697347011,"status":"passed","title":"a delayed language-save failure cannot offer a retry for a newer successful choice"},{"ancestorTitles":[],"duration":47,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a previously delivered language retry cannot reverse a newer choice","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793697347020,"status":"passed","title":"a previously delivered language retry cannot reverse a newer choice"}],"endTime":1793697347068,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\i18n-provider.test.tsx","startTime":1793697345819,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":8,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"English and Bokmål expose the same UI message keys","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793697347280,"status":"passed","title":"English and Bokmål expose the same UI message keys"},{"ancestorTitles":[],"duration":4,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål preserves every English substitution variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793697347289,"status":"passed","title":"Bokmål preserves every English substitution variable"},{"ancestorTitles":[],"duration":4,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"supported UI catalogues contain no blank messages","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793697347293,"status":"passed","title":"supported UI catalogues contain no blank messages"}],"endTime":1793697347297,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\translation-catalogue.test.ts","startTime":1793697347077,"status":"passed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/discovery/RED_TESTS.json b/docs/ui-modernisation/evidence/discovery/RED_TESTS.json
new file mode 100644
index 00000000..7749b91d
--- /dev/null
+++ b/docs/ui-modernisation/evidence/discovery/RED_TESTS.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":1,"numFailedTests":2,"numPassedTestSuites":0,"numPassedTests":0,"numPendingTestSuites":0,"numPendingTests":21,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":23,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1793697308779,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":195,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["TestingLibraryElementError: Unable to find an accessible element with the role \"complementary\" and name \"Search filters\"\n\nHere are the accessible roles:\n\n textbox:\n\n Name \"Role or company\":\n \u001b[36m\u001b[39m\n\n Name \"Municipality\":\n \u001b[36m\u001b[39m\n\n Name \"Search name\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"Search NAV\":\n \u001b[36m\u001b[39m\n\n Name \"Save search\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n heading:\n\n Name \"Saved searches\":\n \u001b[36m
\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n alert:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n region:\n\n Name \"Search results\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n status:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[0mOfficial Norwegian vacancies from NAV. FINN, Indeed and LinkedIn jobs can still be captured by URL.\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[0mSearch recent active vacancies by role, company, or municipality.\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\config.js:37:19)\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:76:38\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:52:17\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:95:19\n at getByRole (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\job-discovery.test.tsx:33:26)"],"fullName":"keeps en filters before results with keyboard jump/return and no automatic provider search","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312111,"status":"failed","title":"keeps en filters before results with keyboard jump/return and no automatic provider search"},{"ancestorTitles":[],"duration":87,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["TestingLibraryElementError: Unable to find an accessible element with the role \"complementary\" and name \"Søkefiltre\"\n\nHere are the accessible roles:\n\n textbox:\n\n Name \"Rolle eller bedrift\":\n \u001b[36m\u001b[39m\n\n Name \"Kommune\":\n \u001b[36m\u001b[39m\n\n Name \"Navn på søket\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"Søk i NAV\":\n \u001b[36m\u001b[39m\n\n Name \"Lagre søk\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n heading:\n\n Name \"Lagrede søk\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n alert:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n region:\n\n Name \"Søkeresultater\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n status:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[0mOffisielle norske stillinger fra NAV. Stillinger fra FINN, Indeed og LinkedIn kan fortsatt hentes inn via nettadresse.\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[0mSøk i nylige aktive stillinger etter rolle, bedrift eller kommune.\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\config.js:37:19)\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:76:38\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:52:17\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:95:19\n at getByRole (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\job-discovery.test.tsx:33:26)"],"fullName":"keeps nb filters before results with keyboard jump/return and no automatic provider search","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312318,"status":"failed","title":"keeps nb filters before results with keyboard jump/return and no automatic provider search"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"shows honest source metadata and offers the existing reviewed save flow","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312405,"status":"pending","title":"shows honest source metadata and offers the existing reviewed save flow"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"distinguishes the initial guidance from a completed empty search","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312405,"status":"pending","title":"distinguishes the initial guidance from a completed empty search"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries the last submitted search after an error","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312405,"status":"pending","title":"retries the last submitted search after an error"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"sorts returned vacancies by title","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312405,"status":"pending","title":"sorts returned vacancies by title"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders the discovery workflow in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312405,"status":"pending","title":"renders the discovery workflow in Norwegian Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"runs a saved search, marks unseen vacancies, and dismisses them","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312405,"status":"pending","title":"runs a saved search, marks unseen vacancies, and dismisses them"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"lets the user pause automatic alerts for a saved search","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312405,"status":"pending","title":"lets the user pause automatic alerts for a saved search"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"announces saved-search loading without presenting a successful empty list","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"announces saved-search loading without presenting a successful empty list"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"reports saved-search failure and retries that read without replacing active discovery filters or results","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"reports saved-search failure and retries that read without replacing active discovery filters or results"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload null as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"rejects malformed saved-search payload null as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload {\"message\":\"not a list\"} as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"rejects malformed saved-search payload {\"message\":\"not a list\"} as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rejects malformed saved-search payload [{\"id\":7}] as a failed read rather than an empty list","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"rejects malformed saved-search payload [{\"id\":7}] as a failed read rather than an empty list"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a manual search after saved-search results has no dismiss action belonging to the saved search","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"a manual search after saved-search results has no dismiss action belonging to the saved search"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"starting saved search B hides saved search A's results and actions while the B response is held","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"starting saved search B hides saved search A's results and actions while the B response is held"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retrying a failed saved-search run repeats that saved ID instead of running a manual query","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"retrying a failed saved-search run repeats that saved ID instead of running a manual query"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed saved-search creation retains its draft and recovers only through the save action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"failed saved-search creation retains its draft and recovers only through the save action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed alert toggle retains its checked state and recovers through that same toggle without manual search retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"a failed alert toggle retains its checked state and recovers through that same toggle without manual search retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed saved-search deletion preserves the search and requires another explicit confirmation to recover","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"failed saved-search deletion preserves the search and requires another explicit confirmation to recover"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed dismissal retains the vacancy and recovers only through that same result's dismiss action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"failed dismissal retains the vacancy and recovers only through that same result's dismiss action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held saved-search creation locks its request snapshot and prevents a second start while preserving a failed draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"a held saved-search creation locks its request snapshot and prevents a second start while preserving a failed draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a saved-run failure follows the current language without refetching or replaying the request","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793697312406,"status":"pending","title":"a saved-run failure follows the current language without refetching or replaying the request"}],"endTime":1793697312419,"message":" ● keeps en filters before results with keyboard jump/return and no automatic provider search\n\n TestingLibraryElementError: Unable to find an accessible element with the role \"complementary\" and name \"Search filters\"\n\n Here are the accessible roles:\n\n textbox:\n\n Name \"Role or company\":\n \u001b[36m\u001b[39m\n\n Name \"Municipality\":\n \u001b[36m\u001b[39m\n\n Name \"Search name\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"Search NAV\":\n \u001b[36m\u001b[39m\n\n Name \"Save search\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n heading:\n\n Name \"Saved searches\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n alert:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n region:\n\n Name \"Search results\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n status:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\n Ignored nodes: comments, script, style\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[0mOfficial Norwegian vacancies from NAV. FINN, Indeed and LinkedIn jobs can still be captured by URL.\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[0mSearch recent active vacancies by role, company, or municipality.\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n\n 31 | renderPage();\n 32 | await screen.findByText(translations[language].jobDiscoveryNoSavedSearches);\n > 33 | const filters = screen.getByRole('complementary', { name: filtersName });\n | ^\n 34 | const results = screen.getByRole('region', { name: translations[language].jobDiscoveryResults });\n 35 | expect(filters.compareDocumentPosition(results) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();\n 36 | expect(within(filters).getByRole('form', { name: filtersName })).toBeInTheDocument();\n\n at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)\n at node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at node_modules/@testing-library/dom/dist/query-helpers.js:95:19\n at getByRole (src/job-discovery.test.tsx:33:26)\n\n ● keeps nb filters before results with keyboard jump/return and no automatic provider search\n\n TestingLibraryElementError: Unable to find an accessible element with the role \"complementary\" and name \"Søkefiltre\"\n\n Here are the accessible roles:\n\n textbox:\n\n Name \"Rolle eller bedrift\":\n \u001b[36m\u001b[39m\n\n Name \"Kommune\":\n \u001b[36m\u001b[39m\n\n Name \"Navn på søket\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"Søk i NAV\":\n \u001b[36m\u001b[39m\n\n Name \"Lagre søk\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n heading:\n\n Name \"Lagrede søk\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n alert:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n region:\n\n Name \"Søkeresultater\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n status:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\n Ignored nodes: comments, script, style\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[0mOffisielle norske stillinger fra NAV. Stillinger fra FINN, Indeed og LinkedIn kan fortsatt hentes inn via nettadresse.\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[0mSøk i nylige aktive stillinger etter rolle, bedrift eller kommune.\u001b[0m\n \u001b[36m