test(discovery): qualify search-first layout and keyboard submission

This commit is contained in:
cesnimda
2026-11-09 23:03:59 +01:00
parent 0540e84ff6
commit 99a2b6f4f6
126 changed files with 2877 additions and 10 deletions
@@ -5,7 +5,7 @@ Owner addendum received 9 November 2026. Source `E:/Storage/Projects/Active/temp
| Work package | Next independently eligible slice | Gate or residual requirement |
| --- | --- | --- |
| Admin information isolation | First slice published on `codex/security-offline-preflight` at `ecadc29b`. Reproduced and removed imported mail subjects from the Admin Audit projection. 62 selected offline tests passed, including owner-bound notices and operations. | Integrated security, remaining delivery paths, broader minimisation and deployment checks remain separate. |
| Discover Jobs | Move the existing query to the top and make current source limits contextual. Preserve NAV request, municipality, saved search, attribution and track workflow. | Expose new filters, map and multilingual suggestions only with qualified data and the existing GJ architecture. |
| Discover Jobs | [Search-first layout](visual-correction/DISCOVERY_SEARCH_FIRST.md) moves the query above filters and qualifies the existing NAV request, keyboard submit and source disclosure. | Expose new filters, map and multilingual suggestions only with qualified data and the existing GJ architecture. Mobile filter drawer and focused detail remain open. |
| Applications | Review title/employer hierarchy, navigation and explicit bulk mode with keyboard and mobile parity. | Preserve status/revision writes, all current actions, Kanban, filtering, sorting and selection operations. |
| Admin Users and Audit | Verify row alignment and review existing read metadata, available filters and expandable records. The MFA proposal is in `docs/security/MFA_RECOVERY_PROPOSAL.md` on the security branch. | 2FA recovery and private support access require explicit owner approval of their technical and privacy designs. |
| Job Correspondence | Continue inbox layout, mailbox-status presentation and existing explicit consent flow. | Provider verification, restricted scopes, multiple-account persistence and retention decisions retain their gates. Signing in grants no mailbox access. |
+2
View File
@@ -1,5 +1,7 @@
# A3-IM10 Cross-application qualification
Discover Jobs search-first layout at `0540e84f` passed 26 native cases, types, lint, build and 108 controlled states across 36 configurations. [Search-first evidence](visual-correction/DISCOVERY_SEARCH_FIRST.md)
The owner's additional A3 refinements and mandatory Europe-ready criteria are tracked in the [refinement and Europe register](REFINEMENT_AND_EUROPE.md). It extends the current milestones and preserves their separate security, provider and release gates.
Settings privacy recovery passed 36 configurations and 180 states on unchanged runtime `e8e7d839`. Loading, unavailable, retry, rejected save and discard were exercised with fixture responses. [Settings recovery review](visual-correction/SETTINGS_RECOVERY_REVIEW.md)
@@ -0,0 +1,9 @@
# Discover Jobs search-first layout
Runtime `0540e84ff6d5106946b481a2e24484d0b0898583`. The query and Search NAV button now appear directly below the page heading. The existing municipality control stays with the filters and remains connected to the same form. The source disclosure opens from the filters and describes NAV coverage and the manual URL fallback. Provider attribution, saved-search actions, result order and Save to tracker retain their existing owners.
The current adapter matches title and employer text, with a separate location string. The layout exposes only those existing capabilities. It adds no skills search, canonical tree, map, new provider, new filtering semantics or data persistence. Those remain in Global Jobs and EUROPE-READY-01.
26 selected Jest cases, type-checking, full lint, scoped verifier lint and the export build passed. The two native layout cases failed before the change because the form was still inside the filters. The first browser pilot compared viewport-relative rectangles across a scroll reset. The revised check measures both on the same viewport. The failed pilot is retained.
36 controlled EN/NB, light/dark configurations across nine widths passed. The 108 states cover the initial hierarchy, keyboard source disclosure and filtered result. Enter from municipality submitted exactly the same query and location, one request per configuration. The result retained attribution and its track action. There were no writes, page errors or axe violations. The 36 company reads were unavailable. The built 320 px and 1440 px views were reviewed against the supplied desktop capture and the frozen A3 discovery reference. The mobile filter drawer, detail pane and canonical country-aware scope remain separate.
@@ -61,7 +61,7 @@
"visualStatus": "DIVIDED_ROWS_SCOPED_RENDERED_REVIEW",
"afterStatus": "PASSED:36 configurations /108 states; saved search synthetic actions only; full discovery-to-track journey remains open; successor discovery-to-tracker36/144 fixture states passed, exactlyone preview andcreate perconfiguration; provider/backend acceptance open",
"functionalCriteria": "Original preservation register retained; no capability acceptance promotion",
"evidence": "evidence/discovery/BROWSER.json; DASHBOARD_DISCOVERY.md; DISCOVERY_TRACK_REVIEW.md; evidence/discovery-track/BROWSER.json"
"evidence": "DISCOVERY_SEARCH_FIRST.md; evidence/discovery-search-first/BROWSER.json; earlier DASHBOARD_DISCOVERY.md and DISCOVERY_TRACK_REVIEW.md"
},
{
"route": "/jobs",
@@ -0,0 +1,26 @@
{
"screens": [
{
"width": 320,
"language": "en",
"mode": "light",
"state": "initial",
"violations": []
}
],
"journeys": [],
"errors": [],
"unexpectedWrites": [],
"mockedWrites": [],
"previewRequests": [],
"unavailableReads": [
"/api/companies"
],
"blockedExternal": [
"https://fonts.googleapis.com"
],
"limits": [
"synthetic provider/API fixtures, not live NAV or backend qualification",
"no new providers/geography or native/security/release acceptance"
]
}
@@ -0,0 +1,80 @@
{
"screens": [
{
"width": 320,
"language": "en",
"mode": "light",
"state": "initial",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "light",
"state": "source-context",
"violations": []
},
{
"width": 320,
"language": "en",
"mode": "light",
"state": "results",
"violations": []
},
{
"width": 1440,
"language": "en",
"mode": "light",
"state": "initial",
"violations": []
},
{
"width": 1440,
"language": "en",
"mode": "light",
"state": "source-context",
"violations": []
},
{
"width": 1440,
"language": "en",
"mode": "light",
"state": "results",
"violations": []
}
],
"journeys": [
{
"width": 320,
"language": "en",
"mode": "light",
"searchFirst": "PASS",
"municipalityKeyboardSubmit": "PASS",
"providerWrites": "NOT RUN"
},
{
"width": 1440,
"language": "en",
"mode": "light",
"searchFirst": "PASS",
"municipalityKeyboardSubmit": "PASS",
"providerWrites": "NOT RUN"
}
],
"errors": [],
"unexpectedWrites": [],
"mockedWrites": [],
"previewRequests": [],
"unavailableReads": [
"/api/companies",
"/api/companies"
],
"blockedExternal": [
"https://fonts.googleapis.com",
"https://fonts.googleapis.com"
],
"limits": [
"synthetic provider/API fixtures, not live NAV or backend qualification",
"no new providers/geography or native/security/release acceptance"
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Some files were not shown because too many files have changed in this diff Show More