diff --git a/docs/ui-modernisation/APPLICATIONS_VALIDATION.md b/docs/ui-modernisation/APPLICATIONS_VALIDATION.md new file mode 100644 index 00000000..f3c5e63f --- /dev/null +++ b/docs/ui-modernisation/APPLICATIONS_VALIDATION.md @@ -0,0 +1,39 @@ +# A3-IM04 B1 applications and right context + +3 November2026. Authorised by the owner's exact reply **"Approve dashboard/onboarding and A3-IM04"**. codex/a3-ui-04 starts at accepted dashboard receipt dc93b589, without merging the older design tree. Implementation preserves existing task, data, revision and permission owners. + +## Result + +Table and Board retain shared filters/search/counts, all columns, density, paging, saved views, selection/bulk/trash and precise status controls. Filters now use quiet separators instead of another rounded container; results/board cards follow the D1/B1 foundation. Board's contained horizontal scroller is explicitly named and keyboard-focusable; existing pickup/drop/cancel and exact-status menu remain. No feature/action was removed to match a mockup. + +Full detail puts primary task content left and recorded context right above1000px. Context follows primary content in DOM and stacks below it on narrow/compact-preview layouts. Jump focuses the named context heading; Return focuses the current labelled task panel without route changes. Source/company/location/country/salary/tags and recorded dates remain visible across sections. Existing overview dates move into this shared context; missing dates remain unknown and date-only deadlines remain local calendar dates. Original detail disclosure, description/translation distinction, preparation/next action/activity and every tab/subtab stay available. No new API read/write is introduced. + +Visual review reproduced an existing trust defect: a null nextStep claimed the application was fully prepared despite missing CV/letter data. Two EN/NB tests failed first; the existing message now says no next action is recorded and asks the user to review preparation, with informational severity. It no longer infers readiness from absence of a next action. + +## Evidence and preservation + +| Lane | Result / exact scope | +|---|---| +| Baseline |62 tests/7 suites PASSED before changes | +| Test-first contracts |Two missing-context failures; separately two false-readiness failures reproduced before their fixes | +| Final core frontend |69 tests/8 suites PASSED, including new focus/context/readiness cases, table/board/workspace, daily/trust loop and catalogue | +| Disjoint writer suites |57 tests/2 suites PASSED: application-assets and edit-job-revision.126 unique selected frontend cases across10 suites; reviewer52 and baseline overlap, never added | +| Backend preservation |88 tests PASSED, zero failed/skipped: ApplicationWorkspace, JobQueryParity, Rd21JobPersistence, JobApplicationsAuthorization, JobPipeline, JobApplicationsAppliedDateHistory. InMemory/isolated SQLite and mocked summarizer; no real models/providers or MariaDB | +| Typecheck / full lint / build |PASSED on final implementation sources; static export includes the copy correction | +| Browser |Actual built React with local synthetic API responses;16 configurations at320/390/768/1440 × EN/NB × light/dark.48 axe scans/captures, zero returned violations.16 search → Board → precise Waiting status → full detail → context jump/return → originating filtered Board journeys | +| Writes |16 PATCH status requests explicitly fulfilled by fixtures. Zero unexpected writes/page exceptions; no request reached a real backend. All external requests aborted. This is separate from backend service/controller tests | +| Independent review |No actionable findings.52 tests/3 suites passed independently but overlap core69. Native horizontal ArrowRight scroll behavior was not explicitly asserted by the browser verifier | + +Tests retain sorting, page size, optional columns, shared query/view history/membership, saved-view account ownership, partial bulk failures, trash restore, custom statuses, precise menu, keyboard pickup/drop/Escape/focus, dirty-letter/answers navigation, coherent/stale Answers snapshots, legacy documents/correspondence/notes links, aggregate errors/retry, CV source revisions, attachments/history/frozen packages and edit revision conflict behavior. Secondary domain unit tests use controlled components/services; browser journeys above exercise the actual table/board/overview only. They do not establish successful live workflows for every task/document tab. + +Intermediate verification exposed one old date-summary selector after moving that summary into context; corrected to the new named landmark, retaining checks for recorded and unknown dates. Typecheck caught an unsupported testing-library exact option; removed it. Both were resolved before final runs. Baseline/red native reports remain separate from green evidence. Source/evidence manifest binds final sources and exported assets. UI language still does not change source job content or document language. + +## Open qualifications and rollback + +No backend implementation, schema, dependency, route, permissions or revision writer changed. All57 inherited groups/34 route declarations remain; membership is not blanket functional/security acceptance. Canonical Career Profile/CV override/revision/RD21 contracts and physical document renderer remain untouched. No reason to reopen accepted PDF metrics or visuals. + +Rollback this presentation increment on its branch; no data rollback. Existing application records, filters and saved views use the same owners. UI03 agenda compatibility remains documented separately. The independently published document-date patch ca519cac remains separate and is not silently included in these results. + +NOT RUN: MariaDB, real service-backed browser/database end-to-end, hosted CI, native devices/touch/screen-reader/actual zoom, native-language review, licensed providers/live AI, final integrated security or release qualification. Final all-route integrated acceptance remains A3-IM10. Phase10, Product Review overall, Global Jobs, full Europe localisation, homepage and release gates remain open. + +Next: publish/read back this increment, then required owner Gate F before A3-IM05 discovery presentation/permitted saved-search UX. Provider/geography expansion remains governed by the separate Global Jobs prerequisites and rights. diff --git a/docs/ui-modernisation/UI-04.md b/docs/ui-modernisation/UI-04.md new file mode 100644 index 00000000..0d93e2fe --- /dev/null +++ b/docs/ui-modernisation/UI-04.md @@ -0,0 +1,17 @@ +# A3-IM04 — B1 applications and persistent right context + +Owner reply3 November 2026: **"Approve dashboard/onboarding and A3-IM04"**. Dashboard implementation c7d26d35 and publication receipt dc93b589 are accepted for progression. Isolated codex/a3-ui-04 starts at dc93b589; no older design-tree merge. A3 frozen design237c79b8 and original five concepts remain unchanged. + +## Bounded implementation plan + +- [x] Baseline62 tests/7 suites passed before edits. +- [x] B1 quiet filter/results surfaces and compact board cards through existing MUI owners. Existing density/sort/filter/page/columns/saved views/bulk/trash owners retained. +- [x] Persistent right context above1000px; context follows the task in DOM and narrow/compact layouts. Named jump/return controls. Existing dates moved, next action/preparation/activity/details and tabs retained. +- [x] Full-page/preview, list return/focus, unsaved guards, source language, precise status menu and revision writers retained. Corrected reproduced unsupported fully-prepared claim when next action is absent. +- [x] Test new focus/navigation contract first; final126 selected frontend,88 backend, types/lint/build and16 controlled browser journeys/48 scans/captures passed. Limits in APPLICATIONS_VALIDATION.md. +- [x] Independent read-only review: no actionable findings; reviewer52 tests overlap selected totals. +- [ ] Final source-bound evidence, coherent commits, publish/remote verify and Gate F before A3-IM05. + +Affected callers: JobTable's jobs/trash/table/board modes; Kanban card/status navigation; ApplicationWorkspace full-page and overlay callers, primary/secondary tabs; shared EN/NB keys/tests/browser fixtures. APIs, persistence, schema, permissions and physical document rendering are unchanged. No provider/model calls, database migrations or dependency changes. + +Rollback: revert this presentation increment on its branch; no data rollback. Do not modify revision writers just to ease fixtures. Remaining breadth must stay OPEN until qualified; baseline tests alone are not complete IM04 or Phase10 acceptance. diff --git a/docs/ui-modernisation/evidence/applications/BASELINE.json b/docs/ui-modernisation/evidence/applications/BASELINE.json new file mode 100644 index 00000000..87887912 --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/BASELINE.json @@ -0,0 +1 @@ +{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":7,"numPassedTests":62,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":7,"numTotalTests":62,"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":1793695949153,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":1225,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"row status/edit/delete controls retain selection and do not open the workspace","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793695952571,"status":"passed","title":"row status/edit/delete controls retain selection and do not open the workspace"},{"ancestorTitles":[],"duration":799,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"table sort, page-size and optional columns keep their existing independent contracts","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793695953796,"status":"passed","title":"table sort, page-size and optional columns keep their existing independent contracts"},{"ancestorTitles":[],"duration":249,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Trash select-all and bulk restore use the original IDs without workspace navigation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695954595,"status":"passed","title":"Trash select-all and bulk restore use the original IDs without workspace navigation"},{"ancestorTitles":[],"duration":513,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"density preserves selected rows, query, page, custom status, columns and listing link without refetch","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793695954844,"status":"passed","title":"density preserves selected rows, query, page, custom status, columns and listing link without refetch"},{"ancestorTitles":[],"duration":254,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"density is local and resets on unmount without writing settings or a saved view","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695955357,"status":"passed","title":"density is local and resets on unmount without writing settings or a saved view"},{"ancestorTitles":[],"duration":694,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"density survives an empty result and a failed refresh with the existing retry action","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793695955611,"status":"passed","title":"density survives an empty result and a failed refresh with the existing retry action"},{"ancestorTitles":[],"duration":339,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål display localizes standard statuses without changing API values or custom status filters","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793695956305,"status":"passed","title":"Bokmål display localizes standard statuses without changing API values or custom status filters"},{"ancestorTitles":[],"duration":669,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"partial bulk failure refreshes successful rows and retains only failed visible IDs","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695956644,"status":"passed","title":"partial bulk failure refreshes successful rows and retains only failed visible IDs"},{"ancestorTitles":[],"duration":630,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"saved view create/apply/delete stays scoped to the signed-in account","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793695957313,"status":"passed","title":"saved view create/apply/delete stays scoped to the signed-in account"},{"ancestorTitles":[],"duration":485,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"changing the result set clears selection before an old row can be bulk-updated","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695957943,"status":"passed","title":"changing the result set clears selection before an old row can be bulk-updated"}],"endTime":1793695958430,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\job-table-density.test.tsx","startTime":1793695950105,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":654,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"follow-up workflow signals route all overview surfaces to the same follow-up workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695959456,"status":"passed","title":"follow-up workflow signals route all overview surfaces to the same follow-up workspace"},{"ancestorTitles":[],"duration":460,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"package-work workflow signals route all overview surfaces to the shared tailored-cv workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695960111,"status":"passed","title":"package-work workflow signals route all overview surfaces to the shared tailored-cv workspace"},{"ancestorTitles":[],"duration":497,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"job table readiness filter follows workflow signals instead of raw notes or cv text heuristics","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695960571,"status":"passed","title":"job table readiness filter follows workflow signals instead of raw notes or cv text heuristics"}],"endTime":1793695961068,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\workflow-trust-signals.test.tsx","startTime":1793695958441,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["end-to-end trust loop"],"duration":362,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"end-to-end trust loop overview entry opens the canonical communication workspace without sending mail","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695961862,"status":"passed","title":"overview entry opens the canonical communication workspace without sending mail"}],"endTime":1793695962224,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\end-to-end-trust-loop.test.tsx","startTime":1793695961076,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":2015,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Table/Board switches preserve query, complete membership, page, density and history without hidden reads","invocations":1,"location":null,"numPassingAsserts":14,"retryReasons":[],"startAt":1793695962906,"status":"passed","title":"Table/Board switches preserve query, complete membership, page, density and history without hidden reads"},{"ancestorTitles":[],"duration":233,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"direct Board and both switch directions retain exact result membership: ?q=Engineer&status=Custom+review","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793695964922,"status":"passed","title":"direct Board and both switch directions retain exact result membership: ?q=Engineer&status=Custom+review"},{"ancestorTitles":[],"duration":201,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"direct Board and both switch directions retain exact result membership: ?q=absent","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793695965155,"status":"passed","title":"direct Board and both switch directions retain exact result membership: ?q=absent"},{"ancestorTitles":[],"duration":1330,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Board uses the shared filter controls and saved query owner without fetching Table","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695965356,"status":"passed","title":"Board uses the shared filter controls and saved query owner without fetching Table"},{"ancestorTitles":[],"duration":358,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Trash stays a Table even when supplied a Board view parameter","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695966686,"status":"passed","title":"Trash stays a Table even when supplied a Board view parameter"},{"ancestorTitles":[],"duration":1125,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"saved filters applied in Board reset the Table page and refresh only the active population","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793695967044,"status":"passed","title":"saved filters applied in Board reset the Table page and refresh only the active population"}],"endTime":1793695968169,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\jobs-view-integration.test.tsx","startTime":1793695962231,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":813,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens the dedicated workspace from the whole row and preserves list state on return","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793695969146,"status":"passed","title":"opens the dedicated workspace from the whole row and preserves list state on return"},{"ancestorTitles":[],"duration":108,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens a direct workspace URL and returns to applications","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793695969959,"status":"passed","title":"opens a direct workspace URL and returns to applications"},{"ancestorTitles":[],"duration":233,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"row controls do not trigger navigation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695970068,"status":"passed","title":"row controls do not trigger navigation"},{"ancestorTitles":[],"duration":61,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"handles a deleted or inaccessible job without rendering a broken workspace","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695970301,"status":"passed","title":"handles a deleted or inaccessible job without rendering a broken workspace"},{"ancestorTitles":[],"duration":567,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"warns before section navigation would discard application edits","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695970362,"status":"passed","title":"warns before section navigation would discard application edits"},{"ancestorTitles":[],"duration":185,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders shared workspace navigation and progress in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793695970929,"status":"passed","title":"renders shared workspace navigation and progress in Norwegian Bokmål"},{"ancestorTitles":[],"duration":133,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"hydrates list filters, sort and page from a shareable URL","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695971115,"status":"passed","title":"hydrates list filters, sort and page from a shareable URL"},{"ancestorTitles":[],"duration":136,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"names the progress scroll region and identifies the current stage without making stages actions","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695971249,"status":"passed","title":"names the progress scroll region and identifies the current stage without making stages actions"},{"ancestorTitles":[],"duration":113,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps custom status literal without claiming a completed standard pipeline","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695971385,"status":"passed","title":"keeps custom status literal without claiming a completed standard pipeline"},{"ancestorTitles":[],"duration":165,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries a failed workspace read without creating or changing application content","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695971498,"status":"passed","title":"retries a failed workspace read without creating or changing application content"},{"ancestorTitles":[],"duration":356,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps the server-selected next action and preparation entry on the existing CV section","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695971664,"status":"passed","title":"keeps the server-selected next action and preparation entry on the existing CV section"},{"ancestorTitles":[],"duration":63,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"uses recorded dates in the summary and keeps absent dates unknown","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695972020,"status":"passed","title":"uses recorded dates in the summary and keeps absent dates unknown"},{"ancestorTitles":[],"duration":116,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section changes retain follow-up query context and expose the selected labelled panel","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695972083,"status":"passed","title":"section changes retain follow-up query context and expose the selected labelled panel"},{"ancestorTitles":[],"duration":117,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"accordion controls identify exactly one labelled content region","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695972199,"status":"passed","title":"accordion controls identify exactly one labelled content region"},{"ancestorTitles":[],"duration":63,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy document links reveal current attachments and frozen history in the named section","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695972316,"status":"passed","title":"legacy document links reveal current attachments and frozen history in the named section"},{"ancestorTitles":[],"duration":166,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the missing-profile next task opens the existing canonical profile entry","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695972379,"status":"passed","title":"the missing-profile next task opens the existing canonical profile entry"},{"ancestorTitles":[],"duration":757,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application subsection navigation retains metadata and protects unsaved answers","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793695972546,"status":"passed","title":"application subsection navigation retains metadata and protects unsaved answers"},{"ancestorTitles":[],"duration":141,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy correspondence and notes reveal distinct domain content","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793695973303,"status":"passed","title":"legacy correspondence and notes reveal distinct domain content"},{"ancestorTitles":[],"duration":157,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793695973444,"status":"passed","title":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate"},{"ancestorTitles":[],"duration":178,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"entering Answers waits for a fresh coherent snapshot after sibling writes","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695973601,"status":"passed","title":"entering Answers waits for a fresh coherent snapshot after sibling writes"},{"ancestorTitles":[],"duration":183,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a late previous Answers-entry read cannot enable the current editor","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695973779,"status":"passed","title":"a late previous Answers-entry read cannot enable the current editor"},{"ancestorTitles":[],"duration":153,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Answers-entry read stays closed until a successful retry","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695973962,"status":"passed","title":"a failed Answers-entry read stays closed until a successful retry"},{"ancestorTitles":[],"duration":47,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"leaving a pending direct Answers entry still loads the workspace header","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695974115,"status":"passed","title":"leaving a pending direct Answers entry still loads the workspace header"}],"endTime":1793695974163,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-workspace-overlay.test.tsx","startTime":1793695968176,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":75,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the board collapses ten stages into the three agreed groups","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793695974873,"status":"passed","title":"the board collapses ten stages into the three agreed groups"},{"ancestorTitles":[],"duration":80,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a custom status gets an Other column that is not a drop target","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695974948,"status":"passed","title":"a custom status gets an Other column that is not a drop target"},{"ancestorTitles":[],"duration":66,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"loading and retryable error states replace the board","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695975028,"status":"passed","title":"loading and retryable error states replace the board"},{"ancestorTitles":[],"duration":38,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"loading and retry controls follow the selected Bokmål locale","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695975094,"status":"passed","title":"loading and retry controls follow the selected Bokmål locale"},{"ancestorTitles":[],"duration":77,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"dropping onto a group applies that group entry stage","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695975132,"status":"passed","title":"dropping onto a group applies that group entry stage"},{"ancestorTitles":[],"duration":71,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard pickup and drop moves a card to a valid column","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695975209,"status":"passed","title":"keyboard pickup and drop moves a card to a valid column"},{"ancestorTitles":[],"duration":78,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed move keeps the card and reports a retryable error","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695975280,"status":"passed","title":"a failed move keeps the card and reports a retryable error"},{"ancestorTitles":[],"duration":79,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the card menu offers precise stages grouped by section","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695975358,"status":"passed","title":"the card menu offers precise stages grouped by section"},{"ancestorTitles":[],"duration":159,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"full-board population keeps jobs beyond the table page and offers a separate table link","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695975437,"status":"passed","title":"full-board population keeps jobs beyond the table page and offers a separate table link"},{"ancestorTitles":[],"duration":176,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard Escape cancels movement without a write and successful movement restores card focus","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695975596,"status":"passed","title":"keyboard Escape cancels movement without a write and successful movement restores card focus"},{"ancestorTitles":[],"duration":63,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opening a card preserves its board return route and does not mutate status","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695975772,"status":"passed","title":"opening a card preserves its board return route and does not mutate status"},{"ancestorTitles":[],"duration":73,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard activation of the exact-status menu does not open the job","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793695975835,"status":"passed","title":"keyboard activation of the exact-status menu does not open the job"},{"ancestorTitles":[],"duration":32,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Board sends the shared logical URL query, excluding Table paging and client ownership fields","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793695975909,"status":"passed","title":"Board sends the shared logical URL query, excluding Table paging and client ownership fields"},{"ancestorTitles":[],"duration":140,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a successful filtered move reloads membership and focuses the board when the job leaves it","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695975941,"status":"passed","title":"a successful filtered move reloads membership and focuses the board when the job leaves it"},{"ancestorTitles":[],"duration":93,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a committed move followed by a failed query hides stale membership until retry succeeds","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695976081,"status":"passed","title":"a committed move followed by a failed query hides stale membership until retry succeeds"}],"endTime":1793695976174,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\kanban-grouped-board.test.tsx","startTime":1793695974171,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":173,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"dashboard attention card opens follow-up workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793695976957,"status":"passed","title":"dashboard attention card opens follow-up workspace"},{"ancestorTitles":[],"duration":118,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"empty dashboard prioritizes onboarding and suppresses meaningless analytics","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793695977130,"status":"passed","title":"empty dashboard prioritizes onboarding and suppresses meaningless analytics"},{"ancestorTitles":[],"duration":69,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"reminders open action routes tailored-cv gaps into the tailored cv workspace","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695977248,"status":"passed","title":"reminders open action routes tailored-cv gaps into the tailored cv workspace"},{"ancestorTitles":[],"duration":710,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"job table urgency signals and next actions route into the shared workspace flow","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793695977317,"status":"passed","title":"job table urgency signals and next actions route into the shared workspace flow"}],"endTime":1793695978028,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\daily-control-loop.test.tsx","startTime":1793695976182,"status":"passed","summary":""}],"wasInterrupted":false} diff --git a/docs/ui-modernisation/evidence/applications/CHECKS.json b/docs/ui-modernisation/evidence/applications/CHECKS.json new file mode 100644 index 00000000..9981349b --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/CHECKS.json @@ -0,0 +1,16 @@ +{ + "date": "2026-11-03", + "branch": "codex/a3-ui-04", + "base": "dc93b589c995f4edcc48f658ddde571356d6dd86", + "coreFrontend": {"passed": 69, "failed": 0, "suites": 8, "report": "CORE_TESTS.json"}, + "disjointWriterFrontend": {"passed": 57, "failed": 0, "suites": 2, "report": "WRITER_TESTS.json"}, + "backend": {"passed": 88, "failed": 0, "skipped": 0, "report": "backend/a3-applications.trx", "environment": "InMemory and isolated SQLite; mocked summarizer, no live models"}, + "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 node scripts/verify-a3-applications.mjs", "exitCode": 0} + ], + "independentReview": {"result": "no actionable findings", "testsPassed": 52, "overlapCoreTotal": true}, + "notRun": ["MariaDB", "real backend browser integration", "hosted CI", "native device and screen-reader review", "explicit board ArrowRight scroll assertion", "actual zoom", "native linguistic approval", "provider/model services", "final integrated security", "production/release qualification"] +} diff --git a/docs/ui-modernisation/evidence/applications/CONTEXT_RED.json b/docs/ui-modernisation/evidence/applications/CONTEXT_RED.json new file mode 100644 index 00000000..d8529774 --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/CONTEXT_RED.json @@ -0,0 +1 @@ +{"numFailedTestSuites":1,"numFailedTests":2,"numPassedTestSuites":0,"numPassedTests":0,"numPendingTestSuites":0,"numPendingTests":23,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":25,"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":1793695991764,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens the dedicated workspace from the whole row and preserves list state on return","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793695995359,"status":"pending","title":"opens the dedicated workspace from the whole row and preserves list state on return"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens a direct workspace URL and returns to applications","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793695995359,"status":"pending","title":"opens a direct workspace URL and returns to applications"},{"ancestorTitles":[],"duration":4110,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["Error: Unable to find role=\"complementary\" and name \"Application context\"\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m/jobs/42\u001b[0m\n \u001b[0m?section=match\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mContent loaded.\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 \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mWorkspace\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 \u001b[0mBackend Developer\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mAcme\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 \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mEdit application\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 \u001b[0mWaiting\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOslo\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mApplication progress\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 \u001b[0mSaved\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-each\\build\\index.js:80:140)\n at Promise.finally.completed (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1501:10)\n at _callCircusTest (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1011:40)\n at _runTest (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:951:3)\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:866:11)\n at run (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1993:21)\n at jestAdapter (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\runner.js:111:19)\n at runTestInternal (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-runner\\build\\index.js:276:16)\n at runTest (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-runner\\build\\index.js:344:7)"],"fullName":"keeps en context after the primary task with a keyboard jump and return across sections","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793695995359,"status":"failed","title":"keeps en context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":4046,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["Error: Unable to find role=\"complementary\" and name \"Søknadskontekst\"\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m/jobs/42\u001b[0m\n \u001b[0m?section=match\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mInnhold lastet.\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 \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mArbeidsområde\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 \u001b[0mBackend Developer\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mAcme\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 \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mRediger søknad\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 \u001b[0mVenter\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOslo\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mSøknadsprogresjon\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 \u001b[0mLagret\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-each\\build\\index.js:80:140)\n at Promise.finally.completed (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1501:10)\n at _callCircusTest (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1011:40)\n at _runTest (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:951:3)\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:866:11)\n at run (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1993:21)\n at jestAdapter (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-circus\\build\\runner.js:111:19)\n at runTestInternal (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-runner\\build\\index.js:276:16)\n at runTest (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-runner\\build\\index.js:344:7)"],"fullName":"keeps nb context after the primary task with a keyboard jump and return across sections","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793695999469,"status":"failed","title":"keeps nb context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"row controls do not trigger navigation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"row controls do not trigger navigation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"handles a deleted or inaccessible job without rendering a broken workspace","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"handles a deleted or inaccessible job without rendering a broken workspace"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"warns before section navigation would discard application edits","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"warns before section navigation would discard application edits"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders shared workspace navigation and progress in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"renders shared workspace navigation and progress in Norwegian Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"hydrates list filters, sort and page from a shareable URL","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"hydrates list filters, sort and page from a shareable URL"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"names the progress scroll region and identifies the current stage without making stages actions","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"names the progress scroll region and identifies the current stage without making stages actions"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps custom status literal without claiming a completed standard pipeline","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"keeps custom status literal without claiming a completed standard pipeline"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries a failed workspace read without creating or changing application content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"retries a failed workspace read without creating or changing application content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps the server-selected next action and preparation entry on the existing CV section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"keeps the server-selected next action and preparation entry on the existing CV section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"uses recorded dates in the summary and keeps absent dates unknown","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"uses recorded dates in the summary and keeps absent dates unknown"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section changes retain follow-up query context and expose the selected labelled panel","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"section changes retain follow-up query context and expose the selected labelled panel"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"accordion controls identify exactly one labelled content region","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"accordion controls identify exactly one labelled content region"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy document links reveal current attachments and frozen history in the named section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"legacy document links reveal current attachments and frozen history in the named section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the missing-profile next task opens the existing canonical profile entry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"the missing-profile next task opens the existing canonical profile entry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application subsection navigation retains metadata and protects unsaved answers","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"application subsection navigation retains metadata and protects unsaved answers"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy correspondence and notes reveal distinct domain content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"legacy correspondence and notes reveal distinct domain content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"entering Answers waits for a fresh coherent snapshot after sibling writes","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"entering Answers waits for a fresh coherent snapshot after sibling writes"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a late previous Answers-entry read cannot enable the current editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"a late previous Answers-entry read cannot enable the current editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Answers-entry read stays closed until a successful retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"a failed Answers-entry read stays closed until a successful retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"leaving a pending direct Answers entry still loads the workspace header","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696003515,"status":"pending","title":"leaving a pending direct Answers entry still loads the workspace header"}],"endTime":1793696003530,"message":" ● keeps en context after the primary task with a keyboard jump and return across sections\n\n Unable to find role=\"complementary\" and name \"Application context\"\n\n Ignored nodes: comments, script, style\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m/jobs/42\u001b[0m\n \u001b[0m?section=match\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mContent loaded.\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 \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mWorkspace\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 \u001b[0mBackend Developer\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mAcme\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 \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mEdit application\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 \u001b[0mWaiting\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOslo\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mApplication progress\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 \u001b[0mSaved\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m 210 | const context = await screen.findByRole('complementary', { name: contextName });\n | ^\n 211 | expect(within(context).getByText('nav', { exact: true })).toBeVisible();\n 212 | const panel = screen.getByRole('tabpanel');\n 213 | expect(panel.compareDocumentPosition(context) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();\n\n at waitForWrapper (node_modules/@testing-library/dom/dist/wait-for.js:163:27)\n at node_modules/@testing-library/dom/dist/query-helpers.js:86:33\n at findByRole (src/application-workspace-overlay.test.tsx:210:32)\n\n ● keeps nb context after the primary task with a keyboard jump and return across sections\n\n Unable to find role=\"complementary\" and name \"Søknadskontekst\"\n\n Ignored nodes: comments, script, style\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m/jobs/42\u001b[0m\n \u001b[0m?section=match\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mInnhold lastet.\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 \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mArbeidsområde\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 \u001b[0mBackend Developer\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mAcme\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 \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mRediger søknad\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 \u001b[0mVenter\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOslo\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mSøknadsprogresjon\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 \u001b[0mLagret\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m 210 | const context = await screen.findByRole('complementary', { name: contextName });\n | ^\n 211 | expect(within(context).getByText('nav', { exact: true })).toBeVisible();\n 212 | const panel = screen.getByRole('tabpanel');\n 213 | expect(panel.compareDocumentPosition(context) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();\n\n at waitForWrapper (node_modules/@testing-library/dom/dist/wait-for.js:163:27)\n at node_modules/@testing-library/dom/dist/query-helpers.js:86:33\n at findByRole (src/application-workspace-overlay.test.tsx:210:32)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-workspace-overlay.test.tsx","startTime":1793695992666,"status":"failed","summary":""}],"wasInterrupted":false} diff --git a/docs/ui-modernisation/evidence/applications/CORE_TESTS.json b/docs/ui-modernisation/evidence/applications/CORE_TESTS.json new file mode 100644 index 00000000..3fdc72d3 --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/CORE_TESTS.json @@ -0,0 +1 @@ +{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":8,"numPassedTests":69,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":8,"numTotalTests":69,"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":1793696373625,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":920,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens the dedicated workspace from the whole row and preserves list state on return","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793696377446,"status":"passed","title":"opens the dedicated workspace from the whole row and preserves list state on return"},{"ancestorTitles":[],"duration":197,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens a direct workspace URL and returns to applications","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696378366,"status":"passed","title":"opens a direct workspace URL and returns to applications"},{"ancestorTitles":[],"duration":158,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps en context after the primary task with a keyboard jump and return across sections","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696378563,"status":"passed","title":"keeps en context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":168,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps nb context after the primary task with a keyboard jump and return across sections","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696378721,"status":"passed","title":"keeps nb context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":104,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"does not infer en application readiness from an absent next action","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696378889,"status":"passed","title":"does not infer en application readiness from an absent next action"},{"ancestorTitles":[],"duration":110,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"does not infer nb application readiness from an absent next action","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696378993,"status":"passed","title":"does not infer nb application readiness from an absent next action"},{"ancestorTitles":[],"duration":208,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"row controls do not trigger navigation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696379103,"status":"passed","title":"row controls do not trigger navigation"},{"ancestorTitles":[],"duration":39,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"handles a deleted or inaccessible job without rendering a broken workspace","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696379311,"status":"passed","title":"handles a deleted or inaccessible job without rendering a broken workspace"},{"ancestorTitles":[],"duration":571,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"warns before section navigation would discard application edits","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696379350,"status":"passed","title":"warns before section navigation would discard application edits"},{"ancestorTitles":[],"duration":218,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders shared workspace navigation and progress in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696379921,"status":"passed","title":"renders shared workspace navigation and progress in Norwegian Bokmål"},{"ancestorTitles":[],"duration":158,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"hydrates list filters, sort and page from a shareable URL","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696380139,"status":"passed","title":"hydrates list filters, sort and page from a shareable URL"},{"ancestorTitles":[],"duration":102,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"names the progress scroll region and identifies the current stage without making stages actions","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696380297,"status":"passed","title":"names the progress scroll region and identifies the current stage without making stages actions"},{"ancestorTitles":[],"duration":77,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps custom status literal without claiming a completed standard pipeline","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696380399,"status":"passed","title":"keeps custom status literal without claiming a completed standard pipeline"},{"ancestorTitles":[],"duration":174,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries a failed workspace read without creating or changing application content","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696380476,"status":"passed","title":"retries a failed workspace read without creating or changing application content"},{"ancestorTitles":[],"duration":378,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps the server-selected next action and preparation entry on the existing CV section","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696380650,"status":"passed","title":"keeps the server-selected next action and preparation entry on the existing CV section"},{"ancestorTitles":[],"duration":95,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"uses recorded dates in the summary and keeps absent dates unknown","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696381028,"status":"passed","title":"uses recorded dates in the summary and keeps absent dates unknown"},{"ancestorTitles":[],"duration":144,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section changes retain follow-up query context and expose the selected labelled panel","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696381123,"status":"passed","title":"section changes retain follow-up query context and expose the selected labelled panel"},{"ancestorTitles":[],"duration":97,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"accordion controls identify exactly one labelled content region","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696381267,"status":"passed","title":"accordion controls identify exactly one labelled content region"},{"ancestorTitles":[],"duration":36,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy document links reveal current attachments and frozen history in the named section","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696381365,"status":"passed","title":"legacy document links reveal current attachments and frozen history in the named section"},{"ancestorTitles":[],"duration":120,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the missing-profile next task opens the existing canonical profile entry","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696381401,"status":"passed","title":"the missing-profile next task opens the existing canonical profile entry"},{"ancestorTitles":[],"duration":801,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application subsection navigation retains metadata and protects unsaved answers","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696381522,"status":"passed","title":"application subsection navigation retains metadata and protects unsaved answers"},{"ancestorTitles":[],"duration":173,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy correspondence and notes reveal distinct domain content","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696382323,"status":"passed","title":"legacy correspondence and notes reveal distinct domain content"},{"ancestorTitles":[],"duration":181,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793696382496,"status":"passed","title":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate"},{"ancestorTitles":[],"duration":221,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"entering Answers waits for a fresh coherent snapshot after sibling writes","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696382677,"status":"passed","title":"entering Answers waits for a fresh coherent snapshot after sibling writes"},{"ancestorTitles":[],"duration":294,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a late previous Answers-entry read cannot enable the current editor","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696382898,"status":"passed","title":"a late previous Answers-entry read cannot enable the current editor"},{"ancestorTitles":[],"duration":185,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Answers-entry read stays closed until a successful retry","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696383192,"status":"passed","title":"a failed Answers-entry read stays closed until a successful retry"},{"ancestorTitles":[],"duration":48,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"leaving a pending direct Answers entry still loads the workspace header","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696383377,"status":"passed","title":"leaving a pending direct Answers entry still loads the workspace header"}],"endTime":1793696383426,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-workspace-overlay.test.tsx","startTime":1793696374525,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":1357,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"row status/edit/delete controls retain selection and do not open the workspace","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696384144,"status":"passed","title":"row status/edit/delete controls retain selection and do not open the workspace"},{"ancestorTitles":[],"duration":1062,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"table sort, page-size and optional columns keep their existing independent contracts","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696385501,"status":"passed","title":"table sort, page-size and optional columns keep their existing independent contracts"},{"ancestorTitles":[],"duration":295,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Trash select-all and bulk restore use the original IDs without workspace navigation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696386563,"status":"passed","title":"Trash select-all and bulk restore use the original IDs without workspace navigation"},{"ancestorTitles":[],"duration":511,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"density preserves selected rows, query, page, custom status, columns and listing link without refetch","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793696386858,"status":"passed","title":"density preserves selected rows, query, page, custom status, columns and listing link without refetch"},{"ancestorTitles":[],"duration":404,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"density is local and resets on unmount without writing settings or a saved view","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696387369,"status":"passed","title":"density is local and resets on unmount without writing settings or a saved view"},{"ancestorTitles":[],"duration":549,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"density survives an empty result and a failed refresh with the existing retry action","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696387773,"status":"passed","title":"density survives an empty result and a failed refresh with the existing retry action"},{"ancestorTitles":[],"duration":471,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål display localizes standard statuses without changing API values or custom status filters","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696388322,"status":"passed","title":"Bokmål display localizes standard statuses without changing API values or custom status filters"},{"ancestorTitles":[],"duration":606,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"partial bulk failure refreshes successful rows and retains only failed visible IDs","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696388793,"status":"passed","title":"partial bulk failure refreshes successful rows and retains only failed visible IDs"},{"ancestorTitles":[],"duration":1020,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"saved view create/apply/delete stays scoped to the signed-in account","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696389399,"status":"passed","title":"saved view create/apply/delete stays scoped to the signed-in account"},{"ancestorTitles":[],"duration":646,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"changing the result set clears selection before an old row can be bulk-updated","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696390420,"status":"passed","title":"changing the result set clears selection before an old row can be bulk-updated"}],"endTime":1793696391066,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\job-table-density.test.tsx","startTime":1793696383437,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":2606,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Table/Board switches preserve query, complete membership, page, density and history without hidden reads","invocations":1,"location":null,"numPassingAsserts":14,"retryReasons":[],"startAt":1793696392001,"status":"passed","title":"Table/Board switches preserve query, complete membership, page, density and history without hidden reads"},{"ancestorTitles":[],"duration":388,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"direct Board and both switch directions retain exact result membership: ?q=Engineer&status=Custom+review","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696394607,"status":"passed","title":"direct Board and both switch directions retain exact result membership: ?q=Engineer&status=Custom+review"},{"ancestorTitles":[],"duration":262,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"direct Board and both switch directions retain exact result membership: ?q=absent","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696394995,"status":"passed","title":"direct Board and both switch directions retain exact result membership: ?q=absent"},{"ancestorTitles":[],"duration":1517,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Board uses the shared filter controls and saved query owner without fetching Table","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696395257,"status":"passed","title":"Board uses the shared filter controls and saved query owner without fetching Table"},{"ancestorTitles":[],"duration":443,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Trash stays a Table even when supplied a Board view parameter","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696396774,"status":"passed","title":"Trash stays a Table even when supplied a Board view parameter"},{"ancestorTitles":[],"duration":1368,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"saved filters applied in Board reset the Table page and refresh only the active population","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696397217,"status":"passed","title":"saved filters applied in Board reset the Table page and refresh only the active population"}],"endTime":1793696398585,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\jobs-view-integration.test.tsx","startTime":1793696391080,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":845,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"follow-up workflow signals route all overview surfaces to the same follow-up workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696399574,"status":"passed","title":"follow-up workflow signals route all overview surfaces to the same follow-up workspace"},{"ancestorTitles":[],"duration":698,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"package-work workflow signals route all overview surfaces to the shared tailored-cv workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696400420,"status":"passed","title":"package-work workflow signals route all overview surfaces to the shared tailored-cv workspace"},{"ancestorTitles":[],"duration":599,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"job table readiness filter follows workflow signals instead of raw notes or cv text heuristics","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696401118,"status":"passed","title":"job table readiness filter follows workflow signals instead of raw notes or cv text heuristics"}],"endTime":1793696401718,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\workflow-trust-signals.test.tsx","startTime":1793696398595,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":91,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the board collapses ten stages into the three agreed groups","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793696402534,"status":"passed","title":"the board collapses ten stages into the three agreed groups"},{"ancestorTitles":[],"duration":78,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a custom status gets an Other column that is not a drop target","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696402626,"status":"passed","title":"a custom status gets an Other column that is not a drop target"},{"ancestorTitles":[],"duration":73,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"loading and retryable error states replace the board","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696402705,"status":"passed","title":"loading and retryable error states replace the board"},{"ancestorTitles":[],"duration":36,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"loading and retry controls follow the selected Bokmål locale","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696402778,"status":"passed","title":"loading and retry controls follow the selected Bokmål locale"},{"ancestorTitles":[],"duration":85,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"dropping onto a group applies that group entry stage","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696402814,"status":"passed","title":"dropping onto a group applies that group entry stage"},{"ancestorTitles":[],"duration":94,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard pickup and drop moves a card to a valid column","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696402899,"status":"passed","title":"keyboard pickup and drop moves a card to a valid column"},{"ancestorTitles":[],"duration":79,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed move keeps the card and reports a retryable error","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696402994,"status":"passed","title":"a failed move keeps the card and reports a retryable error"},{"ancestorTitles":[],"duration":77,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the card menu offers precise stages grouped by section","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696403073,"status":"passed","title":"the card menu offers precise stages grouped by section"},{"ancestorTitles":[],"duration":180,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"full-board population keeps jobs beyond the table page and offers a separate table link","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696403150,"status":"passed","title":"full-board population keeps jobs beyond the table page and offers a separate table link"},{"ancestorTitles":[],"duration":223,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard Escape cancels movement without a write and successful movement restores card focus","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696403330,"status":"passed","title":"keyboard Escape cancels movement without a write and successful movement restores card focus"},{"ancestorTitles":[],"duration":63,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opening a card preserves its board return route and does not mutate status","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696403553,"status":"passed","title":"opening a card preserves its board return route and does not mutate status"},{"ancestorTitles":[],"duration":77,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard activation of the exact-status menu does not open the job","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696403616,"status":"passed","title":"keyboard activation of the exact-status menu does not open the job"},{"ancestorTitles":[],"duration":23,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Board sends the shared logical URL query, excluding Table paging and client ownership fields","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696403693,"status":"passed","title":"Board sends the shared logical URL query, excluding Table paging and client ownership fields"},{"ancestorTitles":[],"duration":113,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a successful filtered move reloads membership and focuses the board when the job leaves it","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696403716,"status":"passed","title":"a successful filtered move reloads membership and focuses the board when the job leaves it"},{"ancestorTitles":[],"duration":171,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a committed move followed by a failed query hides stale membership until retry succeeds","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696403829,"status":"passed","title":"a committed move followed by a failed query hides stale membership until retry succeeds"}],"endTime":1793696404001,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\kanban-grouped-board.test.tsx","startTime":1793696401727,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":190,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"dashboard attention card opens follow-up workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696404973,"status":"passed","title":"dashboard attention card opens follow-up workspace"},{"ancestorTitles":[],"duration":151,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"empty dashboard prioritizes onboarding and suppresses meaningless analytics","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793696405163,"status":"passed","title":"empty dashboard prioritizes onboarding and suppresses meaningless analytics"},{"ancestorTitles":[],"duration":64,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"reminders open action routes tailored-cv gaps into the tailored cv workspace","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696405314,"status":"passed","title":"reminders open action routes tailored-cv gaps into the tailored cv workspace"},{"ancestorTitles":[],"duration":846,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"job table urgency signals and next actions route into the shared workspace flow","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696405378,"status":"passed","title":"job table urgency signals and next actions route into the shared workspace flow"}],"endTime":1793696406224,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\daily-control-loop.test.tsx","startTime":1793696404011,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["end-to-end trust loop"],"duration":437,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"end-to-end trust loop overview entry opens the canonical communication workspace without sending mail","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696407163,"status":"passed","title":"overview entry opens the canonical communication workspace without sending mail"}],"endTime":1793696407601,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\end-to-end-trust-loop.test.tsx","startTime":1793696406232,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":7,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"English and Bokmål expose the same UI message keys","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696407844,"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":1793696407851,"status":"passed","title":"Bokmål preserves every English substitution variable"},{"ancestorTitles":[],"duration":2,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"supported UI catalogues contain no blank messages","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696407855,"status":"passed","title":"supported UI catalogues contain no blank messages"}],"endTime":1793696407858,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\translation-catalogue.test.ts","startTime":1793696407608,"status":"passed","summary":""}],"wasInterrupted":false} diff --git a/docs/ui-modernisation/evidence/applications/READINESS_RED.json b/docs/ui-modernisation/evidence/applications/READINESS_RED.json new file mode 100644 index 00000000..111dcb6d --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/READINESS_RED.json @@ -0,0 +1 @@ +{"numFailedTestSuites":1,"numFailedTests":2,"numPassedTestSuites":0,"numPassedTests":0,"numPendingTestSuites":0,"numPendingTests":25,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":27,"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":1793696357028,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens the dedicated workspace from the whole row and preserves list state on return","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696360800,"status":"pending","title":"opens the dedicated workspace from the whole row and preserves list state on return"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens a direct workspace URL and returns to applications","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696360800,"status":"pending","title":"opens a direct workspace URL and returns to applications"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps en context after the primary task with a keyboard jump and return across sections","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696360800,"status":"pending","title":"keeps en context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps nb context after the primary task with a keyboard jump and return across sections","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696360800,"status":"pending","title":"keeps nb context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":258,"failing":false,"failureDetails":[{"matcherResult":{"pass":false,"message":"expect(element).toHaveTextContent()\n\nExpected element to have text content:\n No next action is recorded.\nReceived:\n Nothing outstanding — this application is fully prepared."}}],"failureMessages":["Error: expect(element).toHaveTextContent()\n\nExpected element to have text content:\n No next action is recorded.\nReceived:\n Nothing outstanding — this application is fully prepared.\n at toHaveTextContent (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-workspace-overlay.test.tsx:230:20)"],"fullName":"does not infer en application readiness from an absent next action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696360800,"status":"failed","title":"does not infer en application readiness from an absent next action"},{"ancestorTitles":[],"duration":112,"failing":false,"failureDetails":[{"matcherResult":{"pass":false,"message":"expect(element).toHaveTextContent()\n\nExpected element to have text content:\n Ingen neste handling er registrert.\nReceived:\n Ingenting gjenstår — denne søknaden er ferdig forberedt."}}],"failureMessages":["Error: expect(element).toHaveTextContent()\n\nExpected element to have text content:\n Ingen neste handling er registrert.\nReceived:\n Ingenting gjenstår — denne søknaden er ferdig forberedt.\n at toHaveTextContent (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-workspace-overlay.test.tsx:230:20)"],"fullName":"does not infer nb application readiness from an absent next action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361081,"status":"failed","title":"does not infer nb application readiness from an absent next action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"row controls do not trigger navigation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"row controls do not trigger navigation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"handles a deleted or inaccessible job without rendering a broken workspace","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"handles a deleted or inaccessible job without rendering a broken workspace"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"warns before section navigation would discard application edits","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"warns before section navigation would discard application edits"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders shared workspace navigation and progress in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"renders shared workspace navigation and progress in Norwegian Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"hydrates list filters, sort and page from a shareable URL","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"hydrates list filters, sort and page from a shareable URL"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"names the progress scroll region and identifies the current stage without making stages actions","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"names the progress scroll region and identifies the current stage without making stages actions"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps custom status literal without claiming a completed standard pipeline","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"keeps custom status literal without claiming a completed standard pipeline"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries a failed workspace read without creating or changing application content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"retries a failed workspace read without creating or changing application content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps the server-selected next action and preparation entry on the existing CV section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"keeps the server-selected next action and preparation entry on the existing CV section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"uses recorded dates in the summary and keeps absent dates unknown","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"uses recorded dates in the summary and keeps absent dates unknown"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section changes retain follow-up query context and expose the selected labelled panel","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"section changes retain follow-up query context and expose the selected labelled panel"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"accordion controls identify exactly one labelled content region","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"accordion controls identify exactly one labelled content region"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy document links reveal current attachments and frozen history in the named section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"legacy document links reveal current attachments and frozen history in the named section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the missing-profile next task opens the existing canonical profile entry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"the missing-profile next task opens the existing canonical profile entry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application subsection navigation retains metadata and protects unsaved answers","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"application subsection navigation retains metadata and protects unsaved answers"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy correspondence and notes reveal distinct domain content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"legacy correspondence and notes reveal distinct domain content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"entering Answers waits for a fresh coherent snapshot after sibling writes","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"entering Answers waits for a fresh coherent snapshot after sibling writes"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a late previous Answers-entry read cannot enable the current editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"a late previous Answers-entry read cannot enable the current editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Answers-entry read stays closed until a successful retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"a failed Answers-entry read stays closed until a successful retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"leaving a pending direct Answers entry still loads the workspace header","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793696361194,"status":"pending","title":"leaving a pending direct Answers entry still loads the workspace header"}],"endTime":1793696361206,"message":" ● does not infer en application readiness from an absent next action\n\n expect(element).toHaveTextContent()\n\n Expected element to have text content:\n No next action is recorded.\n Received:\n Nothing outstanding — this application is fully prepared.\n\n 228 | renderTable('/jobs/42');\n 229 | const feedback = await screen.findByRole('alert');\n > 230 | expect(feedback).toHaveTextContent(message);\n | ^\n 231 | expect(feedback).not.toHaveTextContent(falseClaim);\n 232 | });\n 233 |\n\n at toHaveTextContent (src/application-workspace-overlay.test.tsx:230:20)\n\n ● does not infer nb application readiness from an absent next action\n\n expect(element).toHaveTextContent()\n\n Expected element to have text content:\n Ingen neste handling er registrert.\n Received:\n Ingenting gjenstår — denne søknaden er ferdig forberedt.\n\n 228 | renderTable('/jobs/42');\n 229 | const feedback = await screen.findByRole('alert');\n > 230 | expect(feedback).toHaveTextContent(message);\n | ^\n 231 | expect(feedback).not.toHaveTextContent(falseClaim);\n 232 | });\n 233 |\n\n at toHaveTextContent (src/application-workspace-overlay.test.tsx:230:20)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-workspace-overlay.test.tsx","startTime":1793696357991,"status":"failed","summary":""}],"wasInterrupted":false} diff --git a/docs/ui-modernisation/evidence/applications/SOURCE_MANIFEST.json b/docs/ui-modernisation/evidence/applications/SOURCE_MANIFEST.json new file mode 100644 index 00000000..d95a6831 --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/SOURCE_MANIFEST.json @@ -0,0 +1,167 @@ +{ + "base": "dc93b589c995f4edcc48f658ddde571356d6dd86", + "recordedAtUtc": "2026-11-03T09:03:57.755433+00:00", + "policy": "Text LF-normalised SHA256; PNG/export raw bytes", + "sources": { + "JobTrackerApi.Tests/ApplicationWorkspaceTests.cs": "ebbf3cc7762bb5087861da37f3d6faac5a0c988598487dadfdadfab9a6dea0c2", + "JobTrackerApi.Tests/JobApplicationsAppliedDateHistoryTests.cs": "367a3e9d1a61358571afb8852d4edbe794522276f36009c5af2ea2cde1965b75", + "JobTrackerApi.Tests/JobApplicationsAuthorizationTests.cs": "1eba1b885107db636bd5d9a12e0e163f8cb578e810801c4e8dc58eed09b899bf", + "JobTrackerApi.Tests/JobPipelineTests.cs": "15513f49a0b8a47295cbed15cf0b4d62d4e85faa57b4b5608ea8b52fdccebd2f", + "JobTrackerApi.Tests/JobQueryParityTests.cs": "fd5ff8a7ed9cea356e1778514572380e203ac3806aff11ca334f7e1502a26fcd", + "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs": "945fb6ee4195ff9d6f14795441df1325c810b9a655dc841f825a646dcdecd452", + "docs/pre-phase10-ux/preservation.json": "a4c2a5a0244ea89381008218de32daee1f615a250eb3808b60e0ee103c674d4d", + "docs/ui-modernisation/APPLICATIONS_VALIDATION.md": "a3781d1c2cdd368e0606b82218ef6dc0e543b0b82fb563278a367a1132282aba", + "docs/ui-modernisation/UI-04.md": "d2b2c3d5db1ec9a6ccbea3014bec22f16986bede368e8546caf7ebf6b70fcbe6", + "job-tracker-ui/package-lock.json": "bf31e90d7af03e8af059db2aaf893925b9e8881a30a1688034ed88ef45d4fcab", + "job-tracker-ui/package.json": "3745394e406cefa40d30a87e840bccb359be147bac6ffba736e2ae90898a8626", + "job-tracker-ui/scripts/verify-a3-applications.mjs": "f55aa36ae492e7f8c004a6bf3da0d7eee44dfc457d88163a78fbceace0f34200", + "job-tracker-ui/src/application-workspace-overlay.test.tsx": "86ec993ae4e0c2f96eec71e2797502247f4e5335cf6f39001e881d0c44991152", + "job-tracker-ui/src/applicationWorkspace.ts": "3b00a4fe16159bdb9603eeb37bfdf5e5eb9a87d7815227fa3aa2f0da6e4f232c", + "job-tracker-ui/src/components/JobTable.tsx": "515191502a1bb0629f816936059791ed71dd05b1fc6549f06ec6e88e9c22733c", + "job-tracker-ui/src/components/KanbanBoard.tsx": "9bb9b08fa66884e0f40fa751c540d421fa4c4c604a796c30e21a0ca53e0c7387", + "job-tracker-ui/src/i18n/I18nProvider.tsx": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113", + "job-tracker-ui/src/i18n/translations.ts": "2ee1320e2aa70b42adf73a7876fe979dc3bba8914889914003998dc35df2657c", + "job-tracker-ui/src/layout/AppShell.tsx": "33dc40054ce390cc532e3bc51d6301795359f4105bac38b2dcdf2d17b3f4b917", + "job-tracker-ui/src/views/ApplicationWorkspacePage.tsx": "f3fe99a0c73a8bf04f632832e01e3a0cef6e7cfde6d6a815e3aa0faf0068b673" + }, + "evidence": { + "backend/a3-applications.trx": "b0908ef7a089f728d314c06e1e5440bc208406a371a00ba7e50f425c1fe2a364", + "BASELINE.json": "2ff316833a60138e6b5c9e782fd5a637ca743edfac495b7a277e244e4fd44b2a", + "browser/board-en-dark-1440.png": "4b76debdeee108d27e1ad464943f4657238bf938978235af924cc98c2a767205", + "browser/board-en-dark-320.png": "5bb81e37c4c3def10b1828837b429d66c76af9a5b7fab6c95c1321a2381ecbb3", + "browser/board-en-dark-390.png": "d1574105dfa92344b3b018e70fc40913d3f006aec88ae99f3f9bd2941112bb52", + "browser/board-en-dark-768.png": "9cb7c5c302698d5ba398043a08ded844d9376e02e0364472cd06eff1ad5fccb2", + "browser/board-en-light-1440.png": "513770e2f1fd6f87b758262dee4f7aaf0cfec77da23e3842d6c49785b2b0758d", + "browser/board-en-light-320.png": "fd92a944b245169459e2bbf96b312c8de349a69fc5fc8330bb314aa4fd92a285", + "browser/board-en-light-390.png": "e40abb4a83675e6344dd0843f59425a84752759dd38f2e7c5dc08cebeb6a4d84", + "browser/board-en-light-768.png": "ada203cedea470fea279b397da8a9b1eb38f6113ce36b54cb6fd4aae7a58b634", + "browser/board-nb-dark-1440.png": "88936a94046edb46e15f598a7171cb17fdf1a9fffaf5e4fc22d7dcd8a950d7b1", + "browser/board-nb-dark-320.png": "c94c9bdcb91bed1c91ffeea5057002ea0ae363aca88ffd6c004b0768e294840a", + "browser/board-nb-dark-390.png": "a975021ae84550fe103fe2c8af5456301e69fa7be52cbea8091403c29517b11e", + "browser/board-nb-dark-768.png": "88f65c6bb5c040a0f70f0b15983bb7b298df9bc017c405bb21c733d17708e219", + "browser/board-nb-light-1440.png": "0dcc04d07f297da3ebda5c67a50d97e81ef699d76da4c71087cdf9a5a16c05ae", + "browser/board-nb-light-320.png": "294bba1ca76969cb4b2ebeb0c5cdd2311387cd9c4255c23c9735c22747e0f831", + "browser/board-nb-light-390.png": "332374c110f0274fe98de9cf36f6dea21d6ef8374a32e6f17bfe285edb20a527", + "browser/board-nb-light-768.png": "142ed86182f17a41424f8da70c2f215c5a9634251ad7c12217493ab61a518c16", + "browser/BROWSER.json": "014e4d9db96b643e9b1d9d9e009a6db63dc64639197907d4572fac3bb1fecd45", + "browser/detail-en-dark-1440.png": "18e8509a104e96d76025c486ad846ef653ce258628ea5154bf9673e5ceaadcc0", + "browser/detail-en-dark-320.png": "78da997f5d102f4657d9809f0529a27a09201174a0c2a42d62e47d682e8cdc26", + "browser/detail-en-dark-390.png": "f706eb060d8c28f7624e3ddebfb0cb693fc7e9bb1186f37c0d023b08105db037", + "browser/detail-en-dark-768.png": "a70666a0e29892164db49e6f62e472bba5ee87a5541e6ae431c3d4a23d6e3614", + "browser/detail-en-light-1440.png": "fd6889a8896aa149169bc38f1ccd15da10374b05f600347acf2b34f08ab72e69", + "browser/detail-en-light-320.png": "0fa9a83f6021d729ad0b72c8c4a45d78fc98a19561a24b89a32ca81fac0915d3", + "browser/detail-en-light-390.png": "b94429f5ae4fe864c2404ea096c9f529cc0acde9bb04cec3b026020d6775b39b", + "browser/detail-en-light-768.png": "c4387bc5d3f4a9cbc0a90ee81ec04d75faf17e4383f1b8746566067edeaa6d4f", + "browser/detail-nb-dark-1440.png": "2e627b7cafd883d8d6cc2da205ae67730277a333db0de557d613619b99926853", + "browser/detail-nb-dark-320.png": "776a9e2dd4e282a388a316a2553b9ee6ce05b5185a34148fef85872d808228d4", + "browser/detail-nb-dark-390.png": "8dbdc071b082973a03efdc913a126563fe3d9d8fac43aca9b6cc3973d8b305bc", + "browser/detail-nb-dark-768.png": "f45f95b53ae27251a7ad28d6333d3b4f4f580337a277e57f378834bc005aa610", + "browser/detail-nb-light-1440.png": "cae879f63a83d1224e8e5938d28f5c0466e175e9bbd7d52f9c1f1dfd804a8faa", + "browser/detail-nb-light-320.png": "ad7273bc551228a8336cf89e7fd08d336040cc759b3e6d76aa7392c79ab25468", + "browser/detail-nb-light-390.png": "bf0e3842922559b5eb276ebc330dfced3d735a897bc950cb3381c944fd6217ec", + "browser/detail-nb-light-768.png": "6d652da800de55b8f8faf224ad114f7195bf7a3062eb33e77d433a829529aaaa", + "browser/table-en-dark-1440.png": "3418f05ede09989ce851b46c1ee527f2eb9d082aabc69c87bcc96a2e298dcea3", + "browser/table-en-dark-320.png": "fbed9a3661707389bc9dd4e6c9ccb06a5202a01d7814a06ee268835f8615e807", + "browser/table-en-dark-390.png": "b22ff8c2cfe60426987c09db08eb316d6b06becd5400a06d719c8860e2079bdf", + "browser/table-en-dark-768.png": "2fafba08d45d97443122960ae8ebd05cdda2ae6a020b890531d494ecca9d3b70", + "browser/table-en-light-1440.png": "ec8b007b6b77a560bd323355a1a256804aef96c9c3f0699f12fcd6a3a6d30522", + "browser/table-en-light-320.png": "b4ee0a232b804ff9d6fb40bc4d9e77eb197b13a16fb1c871828ed9926700d0d1", + "browser/table-en-light-390.png": "f8f413381aa9c71fcfd5ec9df08f71e6c708648779e5ddc8af7e734592ea701b", + "browser/table-en-light-768.png": "77df715142dd5cd6b7b32ddfe1cf425f7992d8d10db3175d1122af2ccadb1191", + "browser/table-nb-dark-1440.png": "507e11b09e537a7a2f7650f16d3c0ef8b680ddef10cec2ba6c13bd6b27cf62cf", + "browser/table-nb-dark-320.png": "6ae3e32205a325d42f9cc0102cb2d50480687917f894400ddf99360f821ccafa", + "browser/table-nb-dark-390.png": "d3739c8f4b662a19813f69f21ea905b683ea04836c91ccfe299147bd976792fd", + "browser/table-nb-dark-768.png": "e8a2420a3b8ca18aa9cd609622512a33c6e152d55ee23409e1dba459ee9cf66b", + "browser/table-nb-light-1440.png": "e68ce699398394386266270a908c831738b0683442122956d4332bba10a00be8", + "browser/table-nb-light-320.png": "54beded4edf634714e3c3a849530af56d5826159e5b851394069a848bae2d83b", + "browser/table-nb-light-390.png": "010dad9ad4aa6fc56284de4ca1f8561497421df878871a27a21b58d47756dc5f", + "browser/table-nb-light-768.png": "9a215b0382afd0ccf919a0a07e2a09ffeeb209256c6a3e1265046489613ff6b0", + "CHECKS.json": "787ec1ccf1e42fc8776b65e8a70e9861bf70081831088700b5d0f016791e5680", + "CONTEXT_RED.json": "2e4d00bedec88c050cb9cd4f443497c4846ca889054c2f367b2b1fe356e60c16", + "CORE_TESTS.json": "d59ca1fb7894367735c9e26725e0f946bdf7bfdc3cb4a100fce1fbe2f201caa0", + "READINESS_RED.json": "570007618104ef186c569236634e9bb3d5158722faea847a20f6df33c100144d", + "WRITER_TESTS.json": "24c77d92cd9d66ccaac07d11c8c142d11d48f050e99c30d87af5088c9f87ae34" + }, + "export": { + "404.html": "84c9eba7e93604d360efad259856ac2ecb38e577918efa2174032628ff7552b8", + "__next.__PAGE__.txt": "97cf0e26dafeb33b6d11e12d8f34661b17c08c66b3ec05919ed23b035a36728f", + "__next._full.txt": "5d1b95cc3160a9ac024392d1b49aab735c1b325c598001291f6ecc56bbf85ca8", + "__next._tree.txt": "4a52ed54431d58bbe9c96d0b45816c031682e23b163c363f204cd0de0584a9e0", + "_next/static/chunks/0-_aq6ipzcshj.js": "39f90c215bf52aef6274ed3dcc0f8af32e21a37fe8845b3bca0d6ea60da6a8c2", + "_next/static/chunks/07vdc-duql714.js": "5a4840d1ba6b65782459968940a2f4cf973c99f0f77890f4171c4f420f339353", + "_next/static/chunks/0ah1fzqmie05a.js": "5c65505a7dcbac63ac71d254e619a4c800943bfb4fa16cd40c10cdbe7e9b6e31", + "_next/static/chunks/0bdt7ln111t48.js": "6184b1a61f22e2a640c17941634fdc75678ce93d142848d9f07f163e0d1fd201", + "_next/static/chunks/0bwvt3mysnclc.js": "7705667a1b75812b7833d9c9dff47fe023015e58e382c40f4507d9948c973af4", + "_next/static/chunks/0cz1d0mv5g_q7.js": "0973c1d64c88adc8e3c950410cb58b288f72118d5965b78049438deb8f2f9683", + "_next/static/chunks/0enhs8x_8oeah.js": "44c76f6178d407e1f147fdf70015fd05c21e58ed220fc922d23dfd1e0f8631bd", + "_next/static/chunks/0jcvc3qm6-lyk.js": "7c27e1fe373b822adc68c63096a5bf38444ad605b9743f0920271652989c56f1", + "_next/static/chunks/0q20g9o8x-k8z.js": "3d4d9086985419aa8866b032158196c774acb8bf318f3c8245508c8daa9c5148", + "_next/static/chunks/0q_pwu9jxv4-d.js": "42a43b3d7245a413c7c29b4cbe87823037a6dbc637e2e282c92405470e0f575d", + "_next/static/chunks/11-48p8kygxgp.js": "57eb9059599b5a5a30598d0a334912d58af571c0ffe28448ca76ad77c8ea8df9", + "_next/static/chunks/14-lfugawba2w.js": "6a5780ca3c84d7f130f3c0a14431c85c7a1e799e2645b8c171161dab40a64360", + "_next/static/chunks/1435in_k_-dhc.js": "4757476512d5c4dd25f9264a18b304ed4824b23aff1c09e134fcbff21d9c36b6", + "_next/static/chunks/145oicobmjvm7.js": "d6bbbdeed1381652dc7412e5ce673a077579ecd5cee8934cb6b533c814098764", + "_next/static/chunks/14e7ovj0s3elm.js": "070567dd4d23fb9fa0b9ba132185a697af6578045d43b2b1c7bbb2a1594d935d", + "_next/static/chunks/154b5a6du9olf.js": "49e4df3a3e10119ddc34f84767883b9228ff6798a07fd759c2fb8e2be62fe9fb", + "_next/static/chunks/16lfece6cnlln.js": "716363ba044f30b0e70440756b4e5eafa2d25f2e1628e855e3bc4ab9eabee3d3", + "_next/static/chunks/1d0xrdyyzw7qc.js": "c11668ff1e152008e0d7b4454af12eb36c97df46a5860938e2eb5d8429b374a8", + "_next/static/chunks/1h7j7ef9e6i41.js": "cb6cd497566dc188b67d09b9c031ef9bbf36f2b85d0aac02621f56daa44faa34", + "_next/static/chunks/1ke8pzecwofrg.css": "32e9ab963ebadebcbe2c68dffb24cfbfc8cc24255ad91b48b7941fc777bf7439", + "_next/static/chunks/1m3dt58dmprbw.js": "3a80b00707e6a884a03fa636260511585f1760f37c24fd4861ead110e6b3e985", + "_next/static/chunks/1req80b9jj38r.js": "eee4d2e3789e1215195dba99ad0f09d34f8c83da848322b76054722233e9dae3", + "_next/static/chunks/1w3q8yrcjn2jk.js": "365200e241ee9290e93d7c2fdba169f2b0a8e774541e3cbf3f6f2781110fa644", + "_next/static/chunks/1xn023_28rgzj.js": "4f7f2108d030a48d039930736c92a55710975dddf419fe673f84d92899b1f575", + "_next/static/chunks/1xwc-b795syag.css": "f73c002233f931ca14d0ae58815c47ca9f2659f25b1547a6d1fdca12a2a00b3f", + "_next/static/chunks/1yx5pd9k61fi3.js": "1f9bb26664ca84fef80c0987470c1357c63015cf68fd14dc569f504e373fcd2a", + "_next/static/chunks/1zi8i6dnxiac_.js": "8aea28bbe6a138e5d4b619429ca71570883a7aee974b86d5a4a746d90f704dbc", + "_next/static/chunks/2-o9_wag-xnw1.js": "2d5526cb095b6f27580073719533b9448a17869517d9025c08a5b18b5060b1a7", + "_next/static/chunks/22uh2tvaw80j2.js": "dafe6b4e23dc5c1d32f8b4a60c561238d2d5e7545f23ebc5b3f7304b48626dbf", + "_next/static/chunks/22wx8--1b9tnq.js": "3f7d8e762371262c6a740b4dac21725b424847319afac46055e97074a99ff5f5", + "_next/static/chunks/245ibf0f31ne8.js": "8b27ab5d720bd278b5d73a7e824bfcccf4cc893ced9fa6f1937bb2bc7a65f967", + "_next/static/chunks/280cq9ekejv1f.js": "01de8c1c3555cdd8d711763065ea9d8aec2968c3053f61254e43e26c999027bf", + "_next/static/chunks/2br3ad_-bc7k9.js": "80fa55f7a32db4d743fda36747c36994fde00a0f53f2eb25b2a6d07c6fb97cd7", + "_next/static/chunks/2gd9s_n-0nl1p.js": "31e2811be51a3c4d0ff2d1e3cea756e7fd8d57ef89141b5de69f638c1301d039", + "_next/static/chunks/2ghgf2s9b2iou.js": "23d8ff31e2128d0541c1887785fb75885323fea7c5d4f35826513b75c12c2ae3", + "_next/static/chunks/2s2gjr6ro25dj.js": "7489e2ac285a05b563c2bcb4eaf9274bf930f2a7385f17d6d5e6850064b88b10", + "_next/static/chunks/2u5qve004opku.js": "be388d9a6aa423082bafb4584c3facc65ddfed71bcfa5c1d06b097b408c5ff97", + "_next/static/chunks/2xlg4_1fj8fxh.js": "8ab4ba521db0167f3dbf684787ebf643cbc66fa7ffff7cdc65a8d8076a926155", + "_next/static/chunks/2z42el0b2mp8_.js": "86ff990ef32c90c4839583e4f1d1bcbddb165dad3141b9fcd2ecec67f4ff24b8", + "_next/static/chunks/334vtqp3-g1j6.js": "c33d42da97f3af7388e29273297e9f42c67f54b7f5ec77a5d0637e2da06d7f7e", + "_next/static/chunks/3720519r84mh6.js": "54358db392a13914e3363046d594e824b1a3ef987913d95002bf48267dded4aa", + "_next/static/chunks/399b23gr2par9.js": "8da49aad4d33ee2f3486a41437b01160b9b3628b600024b7fb6560069aa5630c", + "_next/static/chunks/3bqn9b34na0b9.js": "f1b8ebcc1b22251c33c9f3a5d11c1f893cad2da2e8744a441e790f7347aa9e73", + "_next/static/chunks/3ckk_j5ril9ag.js": "87f631dae7b648d32171e9e05a3e000753ecb54f8d3b86a4401c0e4ab4d73553", + "_next/static/chunks/3f96r6vscobou.js": "d4b452ff3f1433f8fe1df705a8f592326f51b5a8846e6c2790d28df5a977aed3", + "_next/static/chunks/3gkylew_qn7cw.js": "7e6c74c81be0c41ab433e36d65b914f62c48f332922e27f7cc953476f4dd78cb", + "_next/static/chunks/3m8xxac_ytvhs.js": "c4b1089a400547325978631e15b4739295f0d98818fae9be31524a2090e7280c", + "_next/static/chunks/3mowdlh-jq9ii.js": "2c6ccd1500d28ec0c7312cb08ee221f0e4184ba21465ee166a054aa9a6c7f3ed", + "_next/static/chunks/3os11ovm65tyl.js": "c5a908bd61f53f0d75927efb71e53aef8fdd9b2e4fef412a167990dbc702c166", + "_next/static/chunks/3q4v10rrqy40n.js": "d87ff7b7a0f07d0d92eab3876481eb686a12d9c43d8b92cbe406aefa227a11c1", + "_next/static/chunks/3q80eur194l-9.js": "7b52d29843c23a0ed74056eeb1704de14488f36e9d05f2f8271434c61051dce0", + "_next/static/chunks/3u61o8t7m_jza.js": "86231c12e0f8cacc8638bed0bc4b34f645fc35e60de342dc154d3cce0c9a5afa", + "_next/static/chunks/3w2h78_04ah7i.js": "aaa2a9d3c3853e877c61dd49b40c2255cb0afab4989929d23d939b3c9771c5d0", + "_next/static/chunks/40y_aqqilokr2.js": "1f5a5260316134d6bffe949400752ee6b42addf908ae714ef4ae4ebde916dddd", + "_next/static/chunks/43b5x8qjjh3ax.js": "6ee7261cf9a63e0e6ea181bbb09125e09948588b6e10b5c02727c686a6062a3a", + "_next/static/chunks/442d7ylb3po0z.js": "d95cedfbdcd00c674fd718cbbf391ec01c0728018b0db2461a06df7074049132", + "_next/static/chunks/turbopack-25fzg9ay_1ss-.js": "c40f39e993a30c96d6247bb3a7b581538bb046efe8ef8ec07bea3ba32291750f", + "_next/static/k1t18XJ0YLVrar9ywkslX/_buildManifest.js": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea", + "_next/static/k1t18XJ0YLVrar9ywkslX/_clientMiddlewareManifest.js": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a", + "_next/static/k1t18XJ0YLVrar9ywkslX/_ssgManifest.js": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00", + "_not-found/__next._full.txt": "4a6107cdd9dfc4744020eec28e7f1633ea54d67113d0a46aba403cf16c6f992e", + "_not-found/__next._not-found/__PAGE__.txt": "7608252acc8387f329317433e76703bddc91437524fd36408b2badd27dc07344", + "_not-found/__next._tree.txt": "78368e5de55075d599068e4c97332e93fe4bfc16c1e47096024ff403eacf38f2", + "_not-found.html": "84c9eba7e93604d360efad259856ac2ecb38e577918efa2174032628ff7552b8", + "_not-found.txt": "4a6107cdd9dfc4744020eec28e7f1633ea54d67113d0a46aba403cf16c6f992e", + "favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a", + "favicon.svg": "63ecf8f37f8bb146ecfae3917187c6b692d4e801641e8a314486a4007912f3a3", + "index.html": "9c76b3aef2c98ea2dba87c165650061cbcdc8f01368a7fc3bdb56d4e06843062", + "index.txt": "5d1b95cc3160a9ac024392d1b49aab735c1b325c598001291f6ecc56bbf85ca8", + "logo192.png": "bc652031597fabd19b9f14e22a71f809490d218037521b3b64d013418c1390b4", + "logo512.png": "5129e9bc1ba812b711fd9a646d3a38a906d365a26ee685df183b8752458944d4", + "manifest.json": "2667ce63c2e0835b7007239816a5597639321d333da396a78638dfa9e8a7c935", + "mockups/dashboard.svg": "318be3adb1324c26eb30f05572a29528a3e38331c6a604652eef75b54f8c29dc", + "mockups/pipeline.svg": "db2ef41faabeb90e7ce85413e168581686c54535d970fc7d8deda3888a479de4", + "mockups/workspace.svg": "9bbab22349147c7b01d6e18c93c622a6f8aed6dedaf23715189ab54d60e1ddbd", + "robots.txt": "e5ab0d231eeb01b4a982d1c79a6729cac9797ad15a69247e4f28ba6afc149b4c" + } +} diff --git a/docs/ui-modernisation/evidence/applications/WRITER_TESTS.json b/docs/ui-modernisation/evidence/applications/WRITER_TESTS.json new file mode 100644 index 00000000..177e724d --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/WRITER_TESTS.json @@ -0,0 +1 @@ +{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":2,"numPassedTests":57,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":2,"numTotalTests":57,"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":1793696467998,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":495,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P7-11 tailoring] generated metadata and known history enums follow locale while evidence, unknown metadata and dirty prose stay verbatim","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"startAt":1793696472174,"status":"passed","title":"[P7-11 tailoring] generated metadata and known history enums follow locale while evidence, unknown metadata and dirty prose stay verbatim"},{"ancestorTitles":[],"duration":113,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document package history is read-only and separates captured notes from answers","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793696472669,"status":"passed","title":"document package history is read-only and separates captured notes from answers"},{"ancestorTitles":[],"duration":63,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cv section shows the attached variant and the ones available to attach","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696472783,"status":"passed","title":"cv section shows the attached variant and the ones available to attach"},{"ancestorTitles":[],"duration":161,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"attaching a different variant only re-points the application","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696472846,"status":"passed","title":"attaching a different variant only re-points the application"},{"ancestorTitles":[],"duration":45,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cv section points at the builder when there are no variants","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696473007,"status":"passed","title":"cv section points at the builder when there are no variants"},{"ancestorTitles":[],"duration":62,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tailoring renders suggestions grouped by kind","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696473052,"status":"passed","title":"tailoring renders suggestions grouped by kind"},{"ancestorTitles":[],"duration":44,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tailoring asks for a career profile when there is none","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696473114,"status":"passed","title":"tailoring asks for a career profile when there is none"},{"ancestorTitles":[],"duration":79,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"submitted package capture appends an immutable history entry","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696473158,"status":"passed","title":"submitted package capture appends an immutable history entry"},{"ancestorTitles":[],"duration":158,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cover letter loads the current text and its history","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696473237,"status":"passed","title":"cover letter loads the current text and its history"},{"ancestorTitles":[],"duration":291,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editing marks the draft dirty and saving sends the new text","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696473395,"status":"passed","title":"editing marks the draft dirty and saving sends the new text"},{"ancestorTitles":[],"duration":262,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"discarding returns to the saved text","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696473686,"status":"passed","title":"discarding returns to the saved text"},{"ancestorTitles":[],"duration":138,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring an old version calls the restore endpoint","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696473948,"status":"passed","title":"restoring an old version calls the restore endpoint"},{"ancestorTitles":[],"duration":132,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"an empty cover letter offers the template and an empty history","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696474086,"status":"passed","title":"an empty cover letter offers the template and an empty history"},{"ancestorTitles":[],"duration":229,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the empty cover-letter template and rich-text controls follow Bokmål UI language","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696474218,"status":"passed","title":"the empty cover-letter template and rich-text controls follow Bokmål UI language"},{"ancestorTitles":[],"duration":302,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"AI letter results are discarded when the source changes during generation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696474447,"status":"passed","title":"AI letter results are discarded when the source changes during generation"},{"ancestorTitles":[],"duration":275,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Improve writing uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696474749,"status":"passed","title":"letter Improve writing uses the existing reviewed action"},{"ancestorTitles":[],"duration":158,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Suggest content uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696475024,"status":"passed","title":"letter Suggest content uses the existing reviewed action"},{"ancestorTitles":[],"duration":202,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Grammar check uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696475182,"status":"passed","title":"letter Grammar check uses the existing reviewed action"},{"ancestorTitles":[],"duration":246,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Shorter uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696475384,"status":"passed","title":"letter Shorter uses the existing reviewed action"},{"ancestorTitles":[],"duration":252,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cancelling letter generation ignores its late response","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793696475631,"status":"passed","title":"cancelling letter generation ignores its late response"},{"ancestorTitles":[],"duration":551,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"AI cover letter suggestions use the linked CV and require explicit apply","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793696475883,"status":"passed","title":"AI cover letter suggestions use the linked CV and require explicit apply"},{"ancestorTitles":[],"duration":417,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI revalidates its recorded source before applying and refuses a cross-tab source conflict","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696476434,"status":"passed","title":"letter AI revalidates its recorded source before applying and refuses a cross-tab source conflict"},{"ancestorTitles":[],"duration":576,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI language follows the saved document and updates the same local language draft","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696476851,"status":"passed","title":"letter AI language follows the saved document and updates the same local language draft"},{"ancestorTitles":[],"duration":491,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local edit","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696477427,"status":"passed","title":"letter AI ignores a late source validation after local edit"},{"ancestorTitles":[],"duration":381,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local cancel","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696477918,"status":"passed","title":"letter AI ignores a late source validation after local cancel"},{"ancestorTitles":[],"duration":575,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local job change","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696478299,"status":"passed","title":"letter AI ignores a late source validation after local job change"},{"ancestorTitles":[],"duration":629,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held letter Save prevents an in-flight AI validation from replacing the submitted snapshot","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696478874,"status":"passed","title":"a held letter Save prevents an in-flight AI validation from replacing the submitted snapshot"},{"ancestorTitles":[],"duration":356,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-W06] rejecting an AI cover letter preserves the saved draft without a write","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793696479503,"status":"passed","title":"[PRES-W06] rejecting an AI cover letter preserves the saved draft without a write"},{"ancestorTitles":[],"duration":64,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed load surfaces an error","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696479859,"status":"passed","title":"a failed load surfaces an error"},{"ancestorTitles":[],"duration":185,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application answer and recruiter drafts save from the dedicated workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696479923,"status":"passed","title":"application answer and recruiter drafts save from the dedicated workspace"},{"ancestorTitles":[],"duration":186,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application package drafts can be cleared without deleting ordinary notes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696480108,"status":"passed","title":"application package drafts can be cleared without deleting ordinary notes"},{"ancestorTitles":[],"duration":673,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed cover-letter saving retains editable dirty text and original Save recovery across a live locale change","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"startAt":1793696480294,"status":"passed","title":"failed cover-letter saving retains editable dirty text and original Save recovery across a live locale change"},{"ancestorTitles":[],"duration":319,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed application-answer saving keeps both dirty drafts editable and retries only the original save payload","invocations":1,"location":null,"numPassingAsserts":14,"retryReasons":[],"startAt":1793696480967,"status":"passed","title":"failed application-answer saving keeps both dirty drafts editable and retries only the original save payload"},{"ancestorTitles":[],"duration":279,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed CV attachment leaves the current association and selector available for the original explicit action","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793696481286,"status":"passed","title":"failed CV attachment leaves the current association and selector available for the original explicit action"},{"ancestorTitles":[],"duration":1074,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"dirty version restore cancels without a write and confirmed held restore appends history exactly once","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"startAt":1793696481565,"status":"passed","title":"dirty version restore cancels without a write and confirmed held restore appends history exactly once"},{"ancestorTitles":[],"duration":642,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"held letter Save submits one snapshot and prevents an AI Apply from replacing its pending draft","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696482639,"status":"passed","title":"held letter Save submits one snapshot and prevents an AI Apply from replacing its pending draft"},{"ancestorTitles":[],"duration":963,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"held AI generation locks its controls and preserves captured action attribution after a later action selection","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793696483281,"status":"passed","title":"held AI generation locks its controls and preserves captured action attribution after a later action selection"},{"ancestorTitles":[],"duration":773,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"capture, detail and download failures keep owned frozen history and recover only through their original explicit actions","invocations":1,"location":null,"numPassingAsserts":23,"retryReasons":[],"startAt":1793696484244,"status":"passed","title":"capture, detail and download failures keep owned frozen history and recover only through their original explicit actions"},{"ancestorTitles":[],"duration":823,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"all five asset read owners expose GET-only recovery without false empty history or locale refetch","invocations":1,"location":null,"numPassingAsserts":34,"retryReasons":[],"startAt":1793696485017,"status":"passed","title":"all five asset read owners expose GET-only recovery without false empty history or locale refetch"},{"ancestorTitles":[],"duration":472,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyed job changes stop a late CV copy from attaching and never reuse another job's saved-copy recovery","invocations":1,"location":null,"numPassingAsserts":19,"retryReasons":[],"startAt":1793696485840,"status":"passed","title":"keyed job changes stop a late CV copy from attaching and never reuse another job's saved-copy recovery"},{"ancestorTitles":[],"duration":423,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyed job changes keep job B's answer drafts and callbacks independent of job A's late save","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793696486313,"status":"passed","title":"keyed job changes keep job B's answer drafts and callbacks independent of job A's late save"},{"ancestorTitles":[],"duration":277,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a parent refresh cannot attach a newer revision to dirty application drafts","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696486736,"status":"passed","title":"a parent refresh cannot attach a newer revision to dirty application drafts"},{"ancestorTitles":[],"duration":392,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cover-letter rejection (409) retains draft and source revision without a fresh read","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696487013,"status":"passed","title":"cover-letter rejection (409) retains draft and source revision without a fresh read"},{"ancestorTitles":[],"duration":345,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cover-letter rejection (0) retains draft and source revision without a fresh read","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696487405,"status":"passed","title":"cover-letter rejection (0) retains draft and source revision without a fresh read"},{"ancestorTitles":[],"duration":409,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter text preview shows unsaved formatting, hides the inactive narrow pane and never saves on switching","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793696487750,"status":"passed","title":"letter text preview shows unsaved formatting, hides the inactive narrow pane and never saves on switching"},{"ancestorTitles":[],"duration":280,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter text preview renders unsafe Markdown as inert text","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696488159,"status":"passed","title":"letter text preview renders unsafe Markdown as inert text"},{"ancestorTitles":[],"duration":961,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter preview retains the draft after cancelled restore and failed save","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696488439,"status":"passed","title":"letter preview retains the draft after cancelled restore and failed save"},{"ancestorTitles":[],"duration":771,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyed letter job changes discard the old preview and ignore its late save","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793696489400,"status":"passed","title":"keyed letter job changes discard the old preview and ignore its late save"},{"ancestorTitles":[],"duration":252,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"wide letter workspace keeps one editor beside its live preview","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696490172,"status":"passed","title":"wide letter workspace keeps one editor beside its live preview"},{"ancestorTitles":[],"duration":413,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter preview controls follow Bokmål without translating or saving the local draft","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696490424,"status":"passed","title":"letter preview controls follow Bokmål without translating or saving the local draft"},{"ancestorTitles":[],"duration":900,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document settings are dirty local drafts until explicit Save, and Discard restores saved details","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696490837,"status":"passed","title":"document settings are dirty local drafts until explicit Save, and Discard restores saved details"},{"ancestorTitles":[],"duration":717,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter PDF awaits durable settings and blocks duplicate exports; failed save never exports","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696491737,"status":"passed","title":"letter PDF awaits durable settings and blocks duplicate exports; failed save never exports"},{"ancestorTitles":[],"duration":2317,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter document preview ignores stale responses, keeps last good HTML on failure and retries without saving","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793696492454,"status":"passed","title":"letter document preview ignores stale responses, keeps last good HTML on failure and retries without saving"}],"endTime":1793696494772,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-assets.test.tsx","startTime":1793696469031,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":909,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"job save rejection (409) preserves the draft and sends the source revision","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696495958,"status":"passed","title":"job save rejection (409) preserves the draft and sends the source revision"},{"ancestorTitles":[],"duration":658,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"job save rejection (0) preserves the draft and sends the source revision","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793696496867,"status":"passed","title":"job save rejection (0) preserves the draft and sends the source revision"},{"ancestorTitles":[],"duration":442,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held job save excludes editing and closing until the captured snapshot settles","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793696497526,"status":"passed","title":"a held job save excludes editing and closing until the captured snapshot settles"},{"ancestorTitles":[],"duration":635,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a delayed old job read cannot overwrite the newer job session","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793696497968,"status":"passed","title":"a delayed old job read cannot overwrite the newer job session"}],"endTime":1793696498603,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\edit-job-revision.test.tsx","startTime":1793696494782,"status":"passed","summary":""}],"wasInterrupted":false} diff --git a/docs/ui-modernisation/evidence/applications/backend/a3-applications.trx b/docs/ui-modernisation/evidence/applications/backend/a3-applications.trx new file mode 100644 index 00000000..66841d07 --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/backend/a3-applications.trx @@ -0,0 +1,556 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 9.0.19) +[xUnit.net 00:00:00.26] Discovering: JobTrackerApi.Tests +[xUnit.net 00:00:00.42] Discovered: JobTrackerApi.Tests +[xUnit.net 00:00:00.43] Starting: JobTrackerApi.Tests +[xUnit.net 00:00:03.87] Finished: JobTrackerApi.Tests + + + + \ No newline at end of file diff --git a/docs/ui-modernisation/evidence/applications/browser/BROWSER.json b/docs/ui-modernisation/evidence/applications/browser/BROWSER.json new file mode 100644 index 00000000..2514e08f --- /dev/null +++ b/docs/ui-modernisation/evidence/applications/browser/BROWSER.json @@ -0,0 +1,562 @@ +{ + "screens": [ + { + "width": 320, + "language": "en", + "mode": "light", + "state": "table", + "violations": [] + }, + { + "width": 320, + "language": "en", + "mode": "light", + "state": "board", + "violations": [] + }, + { + "width": 320, + "language": "en", + "mode": "light", + "state": "detail", + "violations": [] + }, + { + "width": 320, + "language": "en", + "mode": "dark", + "state": "table", + "violations": [] + }, + { + "width": 320, + "language": "en", + "mode": "dark", + "state": "board", + "violations": [] + }, + { + "width": 320, + "language": "en", + "mode": "dark", + "state": "detail", + "violations": [] + }, + { + "width": 320, + "language": "nb", + "mode": "light", + "state": "table", + "violations": [] + }, + { + "width": 320, + "language": "nb", + "mode": "light", + "state": "board", + "violations": [] + }, + { + "width": 320, + "language": "nb", + "mode": "light", + "state": "detail", + "violations": [] + }, + { + "width": 320, + "language": "nb", + "mode": "dark", + "state": "table", + "violations": [] + }, + { + "width": 320, + "language": "nb", + "mode": "dark", + "state": "board", + "violations": [] + }, + { + "width": 320, + "language": "nb", + "mode": "dark", + "state": "detail", + "violations": [] + }, + { + "width": 390, + "language": "en", + "mode": "light", + "state": "table", + "violations": [] + }, + { + "width": 390, + "language": "en", + "mode": "light", + "state": "board", + "violations": [] + }, + { + "width": 390, + "language": "en", + "mode": "light", + "state": "detail", + "violations": [] + }, + { + "width": 390, + "language": "en", + "mode": "dark", + "state": "table", + "violations": [] + }, + { + "width": 390, + "language": "en", + "mode": "dark", + "state": "board", + "violations": [] + }, + { + "width": 390, + "language": "en", + "mode": "dark", + "state": "detail", + "violations": [] + }, + { + "width": 390, + "language": "nb", + "mode": "light", + "state": "table", + "violations": [] + }, + { + "width": 390, + "language": "nb", + "mode": "light", + "state": "board", + "violations": [] + }, + { + "width": 390, + "language": "nb", + "mode": "light", + "state": "detail", + "violations": [] + }, + { + "width": 390, + "language": "nb", + "mode": "dark", + "state": "table", + "violations": [] + }, + { + "width": 390, + "language": "nb", + "mode": "dark", + "state": "board", + "violations": [] + }, + { + "width": 390, + "language": "nb", + "mode": "dark", + "state": "detail", + "violations": [] + }, + { + "width": 768, + "language": "en", + "mode": "light", + "state": "table", + "violations": [] + }, + { + "width": 768, + "language": "en", + "mode": "light", + "state": "board", + "violations": [] + }, + { + "width": 768, + "language": "en", + "mode": "light", + "state": "detail", + "violations": [] + }, + { + "width": 768, + "language": "en", + "mode": "dark", + "state": "table", + "violations": [] + }, + { + "width": 768, + "language": "en", + "mode": "dark", + "state": "board", + "violations": [] + }, + { + "width": 768, + "language": "en", + "mode": "dark", + "state": "detail", + "violations": [] + }, + { + "width": 768, + "language": "nb", + "mode": "light", + "state": "table", + "violations": [] + }, + { + "width": 768, + "language": "nb", + "mode": "light", + "state": "board", + "violations": [] + }, + { + "width": 768, + "language": "nb", + "mode": "light", + "state": "detail", + "violations": [] + }, + { + "width": 768, + "language": "nb", + "mode": "dark", + "state": "table", + "violations": [] + }, + { + "width": 768, + "language": "nb", + "mode": "dark", + "state": "board", + "violations": [] + }, + { + "width": 768, + "language": "nb", + "mode": "dark", + "state": "detail", + "violations": [] + }, + { + "width": 1440, + "language": "en", + "mode": "light", + "state": "table", + "violations": [] + }, + { + "width": 1440, + "language": "en", + "mode": "light", + "state": "board", + "violations": [] + }, + { + "width": 1440, + "language": "en", + "mode": "light", + "state": "detail", + "violations": [] + }, + { + "width": 1440, + "language": "en", + "mode": "dark", + "state": "table", + "violations": [] + }, + { + "width": 1440, + "language": "en", + "mode": "dark", + "state": "board", + "violations": [] + }, + { + "width": 1440, + "language": "en", + "mode": "dark", + "state": "detail", + "violations": [] + }, + { + "width": 1440, + "language": "nb", + "mode": "light", + "state": "table", + "violations": [] + }, + { + "width": 1440, + "language": "nb", + "mode": "light", + "state": "board", + "violations": [] + }, + { + "width": 1440, + "language": "nb", + "mode": "light", + "state": "detail", + "violations": [] + }, + { + "width": 1440, + "language": "nb", + "mode": "dark", + "state": "table", + "violations": [] + }, + { + "width": 1440, + "language": "nb", + "mode": "dark", + "state": "board", + "violations": [] + }, + { + "width": 1440, + "language": "nb", + "mode": "dark", + "state": "detail", + "violations": [] + } + ], + "journeys": [ + { + "width": 320, + "language": "en", + "mode": "light", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 320, + "language": "en", + "mode": "dark", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 320, + "language": "nb", + "mode": "light", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 320, + "language": "nb", + "mode": "dark", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 390, + "language": "en", + "mode": "light", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 390, + "language": "en", + "mode": "dark", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 390, + "language": "nb", + "mode": "light", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 390, + "language": "nb", + "mode": "dark", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 768, + "language": "en", + "mode": "light", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 768, + "language": "en", + "mode": "dark", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 768, + "language": "nb", + "mode": "light", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 768, + "language": "nb", + "mode": "dark", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 1440, + "language": "en", + "mode": "light", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 1440, + "language": "en", + "mode": "dark", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 1440, + "language": "nb", + "mode": "light", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + }, + { + "width": 1440, + "language": "nb", + "mode": "dark", + "searchBoardPreciseStatusDetailContextReturn": "PASS" + } + ], + "errors": [], + "unexpectedWrites": [], + "mockedWrites": [ + { + "width": 320, + "language": "en", + "mode": "light", + "status": "Waiting" + }, + { + "width": 320, + "language": "en", + "mode": "dark", + "status": "Waiting" + }, + { + "width": 320, + "language": "nb", + "mode": "light", + "status": "Waiting" + }, + { + "width": 320, + "language": "nb", + "mode": "dark", + "status": "Waiting" + }, + { + "width": 390, + "language": "en", + "mode": "light", + "status": "Waiting" + }, + { + "width": 390, + "language": "en", + "mode": "dark", + "status": "Waiting" + }, + { + "width": 390, + "language": "nb", + "mode": "light", + "status": "Waiting" + }, + { + "width": 390, + "language": "nb", + "mode": "dark", + "status": "Waiting" + }, + { + "width": 768, + "language": "en", + "mode": "light", + "status": "Waiting" + }, + { + "width": 768, + "language": "en", + "mode": "dark", + "status": "Waiting" + }, + { + "width": 768, + "language": "nb", + "mode": "light", + "status": "Waiting" + }, + { + "width": 768, + "language": "nb", + "mode": "dark", + "status": "Waiting" + }, + { + "width": 1440, + "language": "en", + "mode": "light", + "status": "Waiting" + }, + { + "width": 1440, + "language": "en", + "mode": "dark", + "status": "Waiting" + }, + { + "width": 1440, + "language": "nb", + "mode": "light", + "status": "Waiting" + }, + { + "width": 1440, + "language": "nb", + "mode": "dark", + "status": "Waiting" + } + ], + "unavailableReads": [], + "blockedExternal": [ + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com" + ], + "limits": [ + "controlled fixtures, not real backend integration", + "secondary service reads may return honest unavailable states", + "no native device, provider, model, security or release qualification" + ] +} \ No newline at end of file diff --git a/docs/ui-modernisation/evidence/applications/browser/board-en-dark-1440.png b/docs/ui-modernisation/evidence/applications/browser/board-en-dark-1440.png new file mode 100644 index 00000000..547b15e2 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-en-dark-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-en-dark-320.png b/docs/ui-modernisation/evidence/applications/browser/board-en-dark-320.png new file mode 100644 index 00000000..41fd8560 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-en-dark-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-en-dark-390.png b/docs/ui-modernisation/evidence/applications/browser/board-en-dark-390.png new file mode 100644 index 00000000..c588d36a Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-en-dark-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-en-dark-768.png b/docs/ui-modernisation/evidence/applications/browser/board-en-dark-768.png new file mode 100644 index 00000000..a8a9a9c9 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-en-dark-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-en-light-1440.png b/docs/ui-modernisation/evidence/applications/browser/board-en-light-1440.png new file mode 100644 index 00000000..6e7e7afb Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-en-light-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-en-light-320.png b/docs/ui-modernisation/evidence/applications/browser/board-en-light-320.png new file mode 100644 index 00000000..07965905 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-en-light-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-en-light-390.png b/docs/ui-modernisation/evidence/applications/browser/board-en-light-390.png new file mode 100644 index 00000000..5733704e Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-en-light-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-en-light-768.png b/docs/ui-modernisation/evidence/applications/browser/board-en-light-768.png new file mode 100644 index 00000000..bce29310 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-en-light-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-1440.png b/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-1440.png new file mode 100644 index 00000000..33640616 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-320.png b/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-320.png new file mode 100644 index 00000000..244ad934 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-390.png b/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-390.png new file mode 100644 index 00000000..74bde011 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-768.png b/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-768.png new file mode 100644 index 00000000..9771d02e Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-nb-dark-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-nb-light-1440.png b/docs/ui-modernisation/evidence/applications/browser/board-nb-light-1440.png new file mode 100644 index 00000000..b6f44c34 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-nb-light-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-nb-light-320.png b/docs/ui-modernisation/evidence/applications/browser/board-nb-light-320.png new file mode 100644 index 00000000..3c4c22c5 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-nb-light-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-nb-light-390.png b/docs/ui-modernisation/evidence/applications/browser/board-nb-light-390.png new file mode 100644 index 00000000..86b42143 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-nb-light-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/board-nb-light-768.png b/docs/ui-modernisation/evidence/applications/browser/board-nb-light-768.png new file mode 100644 index 00000000..50d53a3e Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/board-nb-light-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-1440.png b/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-1440.png new file mode 100644 index 00000000..df8ca79f Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-320.png b/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-320.png new file mode 100644 index 00000000..204b5471 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-390.png b/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-390.png new file mode 100644 index 00000000..b4c5d934 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-768.png b/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-768.png new file mode 100644 index 00000000..4296f25e Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-en-dark-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-en-light-1440.png b/docs/ui-modernisation/evidence/applications/browser/detail-en-light-1440.png new file mode 100644 index 00000000..d3521d85 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-en-light-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-en-light-320.png b/docs/ui-modernisation/evidence/applications/browser/detail-en-light-320.png new file mode 100644 index 00000000..ae66704f Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-en-light-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-en-light-390.png b/docs/ui-modernisation/evidence/applications/browser/detail-en-light-390.png new file mode 100644 index 00000000..154d4c4b Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-en-light-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-en-light-768.png b/docs/ui-modernisation/evidence/applications/browser/detail-en-light-768.png new file mode 100644 index 00000000..6a9cc083 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-en-light-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-1440.png b/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-1440.png new file mode 100644 index 00000000..6a3794b2 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-320.png b/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-320.png new file mode 100644 index 00000000..5b420278 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-390.png b/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-390.png new file mode 100644 index 00000000..a19f5a69 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-768.png b/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-768.png new file mode 100644 index 00000000..069ab9ab Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-nb-dark-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-1440.png b/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-1440.png new file mode 100644 index 00000000..736f6972 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-320.png b/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-320.png new file mode 100644 index 00000000..558f9885 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-390.png b/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-390.png new file mode 100644 index 00000000..6ed496cf Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-768.png b/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-768.png new file mode 100644 index 00000000..cf223aba Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/detail-nb-light-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-en-dark-1440.png b/docs/ui-modernisation/evidence/applications/browser/table-en-dark-1440.png new file mode 100644 index 00000000..2cfc0f57 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-en-dark-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-en-dark-320.png b/docs/ui-modernisation/evidence/applications/browser/table-en-dark-320.png new file mode 100644 index 00000000..63a92cde Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-en-dark-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-en-dark-390.png b/docs/ui-modernisation/evidence/applications/browser/table-en-dark-390.png new file mode 100644 index 00000000..103ffc47 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-en-dark-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-en-dark-768.png b/docs/ui-modernisation/evidence/applications/browser/table-en-dark-768.png new file mode 100644 index 00000000..e6c9386b Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-en-dark-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-en-light-1440.png b/docs/ui-modernisation/evidence/applications/browser/table-en-light-1440.png new file mode 100644 index 00000000..5ea7cea5 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-en-light-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-en-light-320.png b/docs/ui-modernisation/evidence/applications/browser/table-en-light-320.png new file mode 100644 index 00000000..2ba17854 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-en-light-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-en-light-390.png b/docs/ui-modernisation/evidence/applications/browser/table-en-light-390.png new file mode 100644 index 00000000..908b23f1 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-en-light-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-en-light-768.png b/docs/ui-modernisation/evidence/applications/browser/table-en-light-768.png new file mode 100644 index 00000000..0a9557c9 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-en-light-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-1440.png b/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-1440.png new file mode 100644 index 00000000..b2292100 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-320.png b/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-320.png new file mode 100644 index 00000000..e1e74745 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-390.png b/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-390.png new file mode 100644 index 00000000..0c81b8c7 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-768.png b/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-768.png new file mode 100644 index 00000000..250244a0 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-nb-dark-768.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-nb-light-1440.png b/docs/ui-modernisation/evidence/applications/browser/table-nb-light-1440.png new file mode 100644 index 00000000..ec7d429c Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-nb-light-1440.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-nb-light-320.png b/docs/ui-modernisation/evidence/applications/browser/table-nb-light-320.png new file mode 100644 index 00000000..6630559b Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-nb-light-320.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-nb-light-390.png b/docs/ui-modernisation/evidence/applications/browser/table-nb-light-390.png new file mode 100644 index 00000000..55991c00 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-nb-light-390.png differ diff --git a/docs/ui-modernisation/evidence/applications/browser/table-nb-light-768.png b/docs/ui-modernisation/evidence/applications/browser/table-nb-light-768.png new file mode 100644 index 00000000..3915ac91 Binary files /dev/null and b/docs/ui-modernisation/evidence/applications/browser/table-nb-light-768.png differ diff --git a/job-tracker-ui/scripts/verify-a3-applications.mjs b/job-tracker-ui/scripts/verify-a3-applications.mjs new file mode 100644 index 00000000..91c4ac6a --- /dev/null +++ b/job-tracker-ui/scripts/verify-a3-applications.mjs @@ -0,0 +1,84 @@ +// Actual exported React UI; all API responses and status writes are synthetic. +import { chromium } from '@playwright/test'; +import AxeBuilder from '@axe-core/playwright'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import path from 'node:path'; +const out = path.resolve(import.meta.dirname, '../../docs/ui-modernisation/evidence/applications/browser'); +fs.mkdirSync(out, { recursive: true }); +const report = { screens: [], journeys: [], errors: [], unexpectedWrites: [], mockedWrites: [], unavailableReads: [], blockedExternal: [] }; +const browser = await chromium.launch(); +try { + for (const width of [320, 390, 768, 1440]) for (const language of ['en', 'nb']) for (const mode of ['light', 'dark']) { + const context = await browser.newContext({ viewport: { width, height: 1000 }, reducedMotion: 'reduce' }); + const page = await context.newPage(); page.on('pageerror', error => report.errors.push(error.message)); + await page.addInitScript(({ language, mode }) => { localStorage.setItem('uiLanguage', language); localStorage.setItem('jobtracker.themeMode', mode); }, { language, mode }); + const jobs = ['Community nurse', 'Primary teacher', 'Electrical engineer'].map((jobTitle, index) => ({ id: 42 + index, version: 7, jobTitle, company: { id: 1, name: 'Fjord Care' }, companyId: 1, status: 'Saved', location: 'Oslo', countryCode: 'NO', source: 'nav', salary: null, dateApplied: null, savedAt: '2026-10-01T09:00:00Z', deadline: '2026-11-12', followUpAt: null, tags: 'Care coordination', description: 'Recorded source advertisement.', isDeleted: false, needsFollowUp: false, workflowSignal: null })); + await page.route('**/*', route => { + const req = route.request(), url = new URL(req.url()); + if (!['localhost', '127.0.0.1'].includes(url.hostname)) { report.blockedExternal.push(url.origin); return route.abort(); } + if (!url.pathname.startsWith('/api/')) return route.continue(); + const answer = data => route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify(data) }); + if (req.method() === 'PATCH' && url.pathname === '/api/jobapplications/42/status') { + const { status } = req.postDataJSON(); assert.equal(status, 'Waiting'); jobs[0].status = status; + report.mockedWrites.push({ width, language, mode, status }); return answer({}); + } + if (req.method() !== 'GET') { report.unexpectedWrites.push(url.pathname); return route.abort(); } + const matching = jobs.filter(job => !url.searchParams.get('q') || job.jobTitle.toLowerCase().includes(url.searchParams.get('q').toLowerCase())); + const fixtures = { + '/api/auth/config': { requireAuth: true }, + '/api/auth/me': { id: 'a3-applications-owner', sessionContext: 'a3-applications-session', firstName: 'Alex', displayName: 'Alex Sample', roles: [], uiLanguage: language === 'nb' ? 'nb-NO' : 'en' }, + '/api/companies': [jobs[0].company], + '/api/jobapplications': { items: matching, total: matching.length, page: 1, pageSize: 15 }, + '/api/jobapplications/board': matching, + '/api/jobapplications/reminders': [], + '/api/notifications/unread-count': { count: 0 }, + '/api/jobapplications/42/workspace': { ...jobs[0], revision: 7, company: jobs[0].company.name, stageGroup: 'Applied', stageOrder: 1, jobUrl: null, translatedDescription: null, descriptionLanguage: 'en', tags: ['Care coordination'], notes: 'Ask about shift patterns.', applicationAnswerDraft: '', recruiterMessageDraft: '', hasJobDescription: true, cv: { variantId: null, variantName: null, themeId: null, hasTailoredCvText: false, updatedAtUtc: null }, hasCoverLetter: false, documentCount: 0, hasPortfolio: false, aiInteractionCount: 0, lastAiAtUtc: null, recentActivity: [], nextStep: null, checklistProgress: { total: 0, completed: 0, dismissed: 0, percent: 0 } }, + '/api/jobapplications/42/status-suggestion': null, + }; + if (Object.hasOwn(fixtures, url.pathname)) return answer(fixtures[url.pathname]); + report.unavailableReads.push(url.pathname); + return route.fulfill({ status: 404, contentType: 'application/json', body: '{}' }); + }); + const scan = async state => { + assert.equal(await page.evaluate(() => document.documentElement.scrollWidth > innerWidth + 1), false); + const result = await new AxeBuilder({ page }).withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa']).analyze(); + report.screens.push({ width, language, mode, state, violations: result.violations }); assert.deepEqual(result.violations, []); + await page.evaluate(() => window.scrollTo(0, 0)); + await page.screenshot({ path: path.join(out, `${state}-${language}-${mode}-${width}.png`), fullPage: true }); + }; + await page.goto('http://localhost:4338/jobs'); + const search = page.getByRole('textbox', { name: language === 'en' ? 'Search' : 'Søk', exact: true }); await search.waitFor(); + await page.locator('[data-job-row-id="42"], [data-job-card-id="42"]').first().waitFor(); + await scan('table'); + await search.fill('nurse'); await page.waitForURL(/q=nurse/); + await page.getByRole('link', { name: language === 'en' ? 'Board' : 'Tavle', exact: true }).click(); + const card = page.locator('[data-kanban-card-id="42"]'); await card.waitFor(); + await page.getByRole('button', { name: `${language === 'en' ? 'Quick status' : 'Hurtigstatus'}: Community nurse`, exact: true }).click(); + await page.getByRole('menuitem', { name: language === 'en' ? 'Set Waiting' : 'Sett Venter', exact: true }).click(); + await page.waitForFunction(() => document.querySelector('[data-kanban-card-id="42"]')?.innerText.includes(document.documentElement.lang === 'nb-NO' ? 'Venter' : 'Waiting')); + await scan('board'); + await card.locator('[role="button"]').press('Enter'); await page.waitForURL(/\/jobs\/42/); + const contextName = language === 'en' ? 'Application context' : 'Søknadskontekst'; + const aside = page.getByRole('complementary', { name: contextName }); await aside.waitFor(); + await page.getByRole('button', { name: language === 'en' ? 'Jump to application context' : 'Gå til søknadskontekst', exact: true }).click(); + assert.equal(await aside.getByRole('heading', { name: contextName }).evaluate(node => node === document.activeElement), true); + await aside.getByRole('button', { name: language === 'en' ? 'Return to current task' : 'Tilbake til gjeldende oppgave', exact: true }).click(); + assert.equal(await page.getByRole('tabpanel').evaluate(node => node === document.activeElement), true); + const main = await page.getByRole('tabpanel').boundingBox(), side = await aside.boundingBox(); + assert.ok(width > 1000 ? side.x > main.x + main.width - 2 && Math.abs(side.y - main.y) < 2 : side.y >= main.y + main.height - 2); + await scan('detail'); + await page.getByRole('button', { name: language === 'en' ? 'Back to applications' : 'Tilbake til søknader', exact: true }).click(); + await page.waitForURL(/view=board/); assert.equal(new URL(page.url()).searchParams.get('q'), 'nurse'); + await page.locator('[data-kanban-card-id="42"] [role="button"]').waitFor(); + report.journeys.push({ width, language, mode, searchBoardPreciseStatusDetailContextReturn: 'PASS' }); + await context.close(); + } + assert.equal(report.screens.length, 48); assert.equal(report.journeys.length, 16); assert.equal(report.mockedWrites.length, 16); + assert.deepEqual(report.errors, []); assert.deepEqual(report.unexpectedWrites, []); + assert.ok(report.blockedExternal.every(origin => origin === 'https://fonts.googleapis.com')); + console.log('PASS: 16 controlled table/board/detail journeys,48 axe scans/captures;16 mocked status writes.'); +} finally { + fs.writeFileSync(path.join(out, 'BROWSER.json'), JSON.stringify({ ...report, limits: ['controlled fixtures, not real backend integration', 'secondary service reads may return honest unavailable states', 'no native device, provider, model, security or release qualification'] }, null, 2)); + await browser.close(); +} diff --git a/job-tracker-ui/src/application-workspace-overlay.test.tsx b/job-tracker-ui/src/application-workspace-overlay.test.tsx index 6b130920..6a2200c9 100644 --- a/job-tracker-ui/src/application-workspace-overlay.test.tsx +++ b/job-tracker-ui/src/application-workspace-overlay.test.tsx @@ -201,6 +201,36 @@ test("opens a direct workspace URL and returns to applications", async () => { await waitFor(() => expect(screen.getByTestId("location")).toHaveTextContent("/jobs")); }); +test.each([ + ['en', 'Application context', 'Jump to application context', 'Return to current task', 'Application'], + ['nb', 'Søknadskontekst', 'Gå til søknadskontekst', 'Tilbake til gjeldende oppgave', 'Søknad'], +])('keeps %s context after the primary task with a keyboard jump and return across sections', async (language, contextName, jumpName, returnName, applicationName) => { + localStorage.setItem('uiLanguage', language); + renderTable('/jobs/42?section=match'); + const context = await screen.findByRole('complementary', { name: contextName }); + expect(within(context).getByText('nav', { exact: true })).toBeVisible(); + const panel = screen.getByRole('tabpanel'); + expect(panel.compareDocumentPosition(context) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy(); + fireEvent.click(screen.getByRole('button', { name: jumpName })); + expect(within(context).getByRole('heading', { name: contextName })).toHaveFocus(); + fireEvent.click(within(context).getByRole('button', { name: returnName })); + expect(panel).toHaveFocus(); + fireEvent.click(screen.getByRole('tab', { name: applicationName })); + expect(await screen.findByText('CV section')).toBeInTheDocument(); + expect(screen.getByRole('complementary', { name: contextName })).toBeVisible(); +}); + +test.each([ + ['en', 'No next action is recorded.', 'fully prepared'], + ['nb', 'Ingen neste handling er registrert.', 'ferdig forberedt'], +])('does not infer %s application readiness from an absent next action', async (language, message, falseClaim) => { + localStorage.setItem('uiLanguage', language); + renderTable('/jobs/42'); + const feedback = await screen.findByRole('alert'); + expect(feedback).toHaveTextContent(message); + expect(feedback).not.toHaveTextContent(falseClaim); +}); + test("row controls do not trigger navigation", async () => { renderTable(); @@ -318,9 +348,9 @@ test("keeps the server-selected next action and preparation entry on the existin test("uses recorded dates in the summary and keeps absent dates unknown", async () => { renderTable("/jobs/42"); - const summary = await screen.findByRole("region", { name: "Application information" }); + const summary = await screen.findByRole("complementary", { name: "Application context" }); expect(summary).toHaveTextContent(new Date(overview.dateApplied).toLocaleDateString("en")); - expect(within(summary).getAllByText("—")).toHaveLength(2); + expect(within(summary).getAllByText("—")).toHaveLength(3); // Salary, deadline and follow-up remain unrecorded. expect(screen.queryByRole("link", { name: "Open original advert" })).not.toBeInTheDocument(); }); diff --git a/job-tracker-ui/src/components/JobTable.tsx b/job-tracker-ui/src/components/JobTable.tsx index 94503417..d860cf12 100644 --- a/job-tracker-ui/src/components/JobTable.tsx +++ b/job-tracker-ui/src/components/JobTable.tsx @@ -491,7 +491,7 @@ export default function JobTable({ refreshToken, pageSize, onPageSizeChange, col ) : null} {isMobile ? ( - + {!boardView ? densityControl : null} - + ) : ( - + setColumnsAnchor(e.currentTarget)}> : null} {!boardView ? densityControl : null} - + )} {!boardView && selectedIds.length > 0 ? ( @@ -674,7 +674,7 @@ export default function JobTable({ refreshToken, pageSize, onPageSizeChange, col sx={{ mt: 1.5, overflow: "hidden", - borderRadius: 2.5, + borderRadius: 1, border: "1px solid", borderColor: "divider", boxShadow: "none", diff --git a/job-tracker-ui/src/components/KanbanBoard.tsx b/job-tracker-ui/src/components/KanbanBoard.tsx index 63374bc4..183c3af5 100644 --- a/job-tracker-ui/src/components/KanbanBoard.tsx +++ b/job-tracker-ui/src/components/KanbanBoard.tsx @@ -214,6 +214,9 @@ export default function KanbanBoard({ refreshToken = 0, onResultCount }: { refre {!jobsResource.loading && !jobsResource.refreshing && !jobsResource.error ? ( {columns.map(({ key, label, droppable }) => { @@ -260,7 +264,7 @@ export default function KanbanBoard({ refreshToken = 0, onResultCount }: { refre onDrop={() => { if (droppable) void onDropTo(key as PipelineGroup); }} sx={{ p: 1.25, - borderRadius: 2.5, + borderRadius: 1, minHeight: 220, flex: { xs: "0 0 min(85vw, 340px)", lg: "none" }, scrollSnapAlign: { xs: "start", lg: "none" }, @@ -269,7 +273,7 @@ export default function KanbanBoard({ refreshToken = 0, onResultCount }: { refre outline: isActiveTarget ? "2px solid" : "none", outlineColor: droppable ? "primary.main" : "error.main", outlineOffset: 2, - backgroundColor: isActiveTarget && droppable ? "action.hover" : "background.paper", + backgroundColor: isActiveTarget && droppable ? "action.hover" : "background.default", transition: "background-color .15s, border-color .15s, outline-color .15s", "&:focus-visible": { outline: "3px solid", outlineColor: "focus.main", outlineOffset: 2 }, }} @@ -316,11 +320,11 @@ export default function KanbanBoard({ refreshToken = 0, onResultCount }: { refre onDragEnd={() => { setDragJobId(null); setDragOverColumn(null); }} sx={{ cursor: "grab", - borderRadius: 2, + borderRadius: 1, border: "1px solid", borderColor: "divider", - borderLeft: `3px solid ${cardColor}`, - backgroundColor: "background.elevated", + borderInlineStart: `3px solid ${cardColor}`, + backgroundColor: "background.paper", boxShadow: "none", transition: "border-color .15s, background-color .15s", outline: dragJobId === j.id ? "2px solid" : "none", diff --git a/job-tracker-ui/src/i18n/translations.ts b/job-tracker-ui/src/i18n/translations.ts index 5d89c830..0b540e1f 100644 --- a/job-tracker-ui/src/i18n/translations.ts +++ b/job-tracker-ui/src/i18n/translations.ts @@ -1411,6 +1411,9 @@ export const translations = { workspaceApplied: "Applied", workspaceNotScheduled: "Not scheduled", workspaceApplicationInfo: "Application information", + workspaceContext: "Application context", + workspaceJumpContext: "Jump to application context", + workspaceReturnTask: "Return to current task", workspaceEdit: "Edit", workspaceNotes: "Notes", workspaceJobDescription: "Job description", @@ -3059,7 +3062,7 @@ export const translations = { workspaceCustomProgress: "This custom status has no standard pipeline position.", workspacePreparation: "Application preparation", workspaceNextAction: "Next recommended action", - workspaceNothingOutstanding: "Nothing outstanding — this application is fully prepared.", + workspaceNothingOutstanding: "No next action is recorded. Review your application preparation below.", workspaceRecentActivity: "Recent activity", workspaceRefresh: "Refresh", workspaceNoActivity: "No activity recorded yet.", @@ -4563,6 +4566,9 @@ export const translations = { workspaceApplied: "Søkt", workspaceNotScheduled: "Ikke planlagt", workspaceApplicationInfo: "Søknadsinformasjon", + workspaceContext: "Søknadskontekst", + workspaceJumpContext: "Gå til søknadskontekst", + workspaceReturnTask: "Tilbake til gjeldende oppgave", workspaceEdit: "Rediger", workspaceNotes: "Notater", workspaceJobDescription: "Stillingsbeskrivelse", @@ -6211,7 +6217,7 @@ export const translations = { workspaceCustomProgress: "Denne egendefinerte statusen har ingen plass i standardløpet.", workspacePreparation: "Forberedelse av søknaden", workspaceNextAction: "Neste anbefalte handling", - workspaceNothingOutstanding: "Ingenting gjenstår — denne søknaden er ferdig forberedt.", + workspaceNothingOutstanding: "Ingen neste handling er registrert. Se gjennom forberedelsene til søknaden nedenfor.", workspaceRecentActivity: "Nylig aktivitet", workspaceRefresh: "Oppdater", workspaceNoActivity: "Ingen aktivitet er registrert ennå.", diff --git a/job-tracker-ui/src/views/ApplicationWorkspacePage.tsx b/job-tracker-ui/src/views/ApplicationWorkspacePage.tsx index 37ae6bbe..e2f86490 100644 --- a/job-tracker-ui/src/views/ApplicationWorkspacePage.tsx +++ b/job-tracker-ui/src/views/ApplicationWorkspacePage.tsx @@ -84,6 +84,7 @@ export function ApplicationWorkspace({ const sectionId = useId(); const secondaryId = useId(); const panelRef = useRef(null); + const contextTitle = useRef(null); const [loadedOverview, setOverview] = useState(null); const overview = loadedOverview?.id === jobId ? loadedOverview : null; @@ -227,6 +228,7 @@ export function ApplicationWorkspace({ {t("workspace")} + {overview ? : null} {fullPageHref ? ( + {section === "overview" && jobId > 0 && } {section === "overview" && setEditOpen(true)} />} @@ -303,6 +306,10 @@ export function ApplicationWorkspace({ } + {overview ? + panelRef.current?.focus()} /> + : null} + 0 ? jobId : null} @@ -312,6 +319,41 @@ export function ApplicationWorkspace({ ); } + +function WorkspaceContext({ overview, titleRef, onReturn }: { overview: WorkspaceOverview; titleRef: React.Ref; onReturn: () => void }) { + const { language, t } = useI18n(); + return + + {[ + [t("company"), overview.company], + [t("location"), overview.location], + [t("workspaceCountry"), overview.countryCode], + [t("workspaceSource"), overview.source], + [t("jobDetailsSalary"), overview.salary], + ].map(([label, value]) => + {label} + {value || "—"} + )} + {[ + [t("workspaceDiscovered"), overview.savedAt], + [t("workspaceApplied"), overview.dateApplied], + [t("jobDetailsDeadline"), overview.deadline], + [t("intelligenceCategoryFollowUp"), overview.followUpAt], + ].map(([label, date]) => { + // Date-only deadlines are local calendar days, not midnight UTC instants. + const parsed = date ? new Date(/^\d{4}-\d{2}-\d{2}$/.test(date) ? `${date}T00:00:00` : date) : null; + return + {label} + + {parsed && !Number.isNaN(parsed.valueOf()) ? : "—"} + + ; + })} + + {overview.tags.length ? {overview.tags.map(tag => )} : null} + + ; +} function WorkspaceHeader({ overview, onEdit }: { overview: WorkspaceOverview | null; onEdit: () => void }) { const { language, t } = useI18n(); if (!overview) return ; @@ -397,19 +439,6 @@ function OverviewSection({ overview, onGo, onReload, onEdit }: { return ( - - - {[ - [t("workspaceDiscovered"), overview.savedAt], - [t("workspaceApplied"), overview.dateApplied], - [t("jobDetailsDeadline"), overview.deadline], - [t("intelligenceCategoryFollowUp"), overview.followUpAt], - ].map(([label, date]) => - {label} - {date ? new Date(date).toLocaleDateString(language === "nb" ? "nb-NO" : "en") : "—"} - )} - - {overview.nextStep ? ( {nextStepLabel} @@ -420,7 +449,7 @@ function OverviewSection({ overview, onGo, onReload, onEdit }: { ) : ( - + {t("workspaceNothingOutstanding")} )}