diff --git a/docs/ui-modernisation/visual-correction/APPLICATION_FLAT.md b/docs/ui-modernisation/visual-correction/APPLICATION_FLAT.md new file mode 100644 index 00000000..9fdb07c1 --- /dev/null +++ b/docs/ui-modernisation/visual-correction/APPLICATION_FLAT.md @@ -0,0 +1,20 @@ +# Application list and workspace visual correction — active + +4 November 2026. Approved IM10 continuation from published/remotely verified `af2df360624d5c48ae03d80e7281704372d860ee` (secondary source checkpoint `69621788ee53d842c82cab307be129ba8806ca26`). No owner permission is outstanding for ordinary visual correction. + +Material before evidence: `evidence/applications` has36 configurations/144 successful controlled accessibility states but still shows a bordered collection enclosing large mobile job cards and a large boxed detail header. These are functional/accessibility results, not final A3 visual acceptance. Approved A3 applications390 and detail1440 reference images were inspected without restarting design selection. + +Uncommitted correction: + +- Mobile rows use quiet separators and full available width, inline existing facts and direct44px named icon actions. Every edit/status/delete/restore handler and confirmation remains. Column/density preferences, selection, tags/signals, pagination, role/tabIndex, interactive-target guards, keyboard navigation and return state remain. +- Workspace header, continuous document/notes/calendar/correspondence/next-action/recent-activity sections and expanded recorded details/advert use open sections. Two-column phone preparation links retain all five destinations. Header/Accordion padding reduced; right-side context grid and jump/return targets unchanged. +-65 tests/six suites passed, including EN/NB mobile actions independent of row navigation and existing cover-letter preservation. Types/lint/build passed. A native test initially queried background controls before the confirmation dialog finished exiting; corrected to await accessible restoration. Its failed report is retained. +- Independent source review found no actionable findings; native touch/icon discoverability and focus visibility still require rendered inspection. + +Browser evidence is deliberately distinct: `applications-flat` is the successor directory. The first36-configuration run covers five states per configuration (180 intended captures) but does **not** exercise a focused table row. A new focused-row pilot reproduced a real clipped outline in the borderless mobile collection; see `FOCUS-CLIP-FAILURE.json`. The responsible collection overflow was changed to visible on phones, retaining desktop containment. The new verifier adds a focused-row state and an explicit outline/clipping assertion: final required successor is **36 configurations /216 states**, not180. Do not attribute the older180-state run to the focus fix or mark this package complete until the final export and216-state run pass. + +Successor update: the older non-focused run completed180 states but cannot close the focus gap; retained as `PREDECESSOR-180.json` without claiming an immutable source manifest or using it for final qualification. Focus correction export built successfully; the new six-state phone pilot passed, including an explicit visible/unclipped row outline assertion. Final36-config/216-state run is next. Types/build and full lint passed for this correction. Do not add pilot/predecessor results to final totals. + +Remaining work: run full216, inspect phone/tablet/desktop and EN/NB/dark expanded detail captures, review source/evidence identities, publish/read back validated source and evidence checkpoints. Backend/physical PDF/provider/model/native/final security/release qualifications remain separate. Only app chrome changed; do not reopen accepted physical PDF metrics without an affected renderer change. + +Next eligible packages after this bounded correction: account continuous sections (V10), remaining route visual review/connected workflows, and the bounded literal-date localisation defect (V11). Whole34-route/57-group acceptance and final owner review remain OPEN. No orchestrator, main merge, production or deferred import-engine work. diff --git a/docs/ui-modernisation/visual-correction/APPLICATION_FLAT_TESTS.json b/docs/ui-modernisation/visual-correction/APPLICATION_FLAT_TESTS.json new file mode 100644 index 00000000..084f6927 --- /dev/null +++ b/docs/ui-modernisation/visual-correction/APPLICATION_FLAT_TESTS.json @@ -0,0 +1 @@ +{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":6,"numPassedTests":65,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":6,"numTotalTests":65,"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":1793749605941,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":1227,"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":1793749609380,"status":"passed","title":"row status/edit/delete controls retain selection and do not open the workspace"},{"ancestorTitles":[],"duration":848,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"en mobile row actions remain direct, named and independent of row navigation","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793749610607,"status":"passed","title":"en mobile row actions remain direct, named and independent of row navigation"},{"ancestorTitles":[],"duration":880,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"nb mobile row actions remain direct, named and independent of row navigation","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793749611455,"status":"passed","title":"nb mobile row actions remain direct, named and independent of row navigation"},{"ancestorTitles":[],"duration":928,"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":1793749612335,"status":"passed","title":"table sort, page-size and optional columns keep their existing independent contracts"},{"ancestorTitles":[],"duration":151,"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":1793749613264,"status":"passed","title":"Trash select-all and bulk restore use the original IDs without workspace navigation"},{"ancestorTitles":[],"duration":586,"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":1793749613415,"status":"passed","title":"density preserves selected rows, query, page, custom status, columns and listing link without refetch"},{"ancestorTitles":[],"duration":355,"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":1793749614001,"status":"passed","title":"density is local and resets on unmount without writing settings or a saved view"},{"ancestorTitles":[],"duration":653,"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":1793749614356,"status":"passed","title":"density survives an empty result and a failed refresh with the existing retry action"},{"ancestorTitles":[],"duration":325,"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":1793749615010,"status":"passed","title":"Bokmål display localizes standard statuses without changing API values or custom status filters"},{"ancestorTitles":[],"duration":569,"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":1793749615335,"status":"passed","title":"partial bulk failure refreshes successful rows and retains only failed visible IDs"},{"ancestorTitles":[],"duration":653,"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":1793749615904,"status":"passed","title":"saved view create/apply/delete stays scoped to the signed-in account"},{"ancestorTitles":[],"duration":548,"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":1793749616557,"status":"passed","title":"changing the result set clears selection before an old row can be bulk-updated"}],"endTime":1793749617106,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\job-table-density.test.tsx","startTime":1793749606861,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":533,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"contact copy is a reviewed canonical snapshot; cancel is inert and apply preserves recipient and design","invocations":1,"location":null,"numPassingAsserts":17,"retryReasons":[],"startAt":1793749617841,"status":"passed","title":"contact copy is a reviewed canonical snapshot; cancel is inert and apply preserves recipient and design"},{"ancestorTitles":[],"duration":401,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"contact location copies only after selection and unselected contact values preserve destination fields","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749618374,"status":"passed","title":"contact location copies only after selection and unselected contact values preserve destination fields"},{"ancestorTitles":[],"duration":244,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"blank source contacts and choosing no fields never clear destination contacts","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749618775,"status":"passed","title":"blank source contacts and choosing no fields never clear destination contacts"},{"ancestorTitles":[],"duration":444,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter language is an explicit document draft and saves independently of interface and CV language","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749619019,"status":"passed","title":"letter language is an explicit document draft and saves independently of interface and CV language"},{"ancestorTitles":[],"duration":222,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"design copy resolves null overrides through actual theme defaults and effective CV density","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793749619463,"status":"passed","title":"design copy resolves null overrides through actual theme defaults and effective CV density"},{"ancestorTitles":[],"duration":210,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter template chooser uses nine actual matching themes and preserves destination letter details","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793749619685,"status":"passed","title":"letter template chooser uses nine actual matching themes and preserves destination letter details"},{"ancestorTitles":[],"duration":155,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter template load failures retry and cancel never changes the local letter","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749619895,"status":"passed","title":"letter template load failures retry and cancel never changes the local letter"},{"ancestorTitles":[],"duration":805,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"applying a letter template updates the existing letter preview using the current body without saving","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793749620050,"status":"passed","title":"applying a letter template updates the existing letter preview using the current body without saving"},{"ancestorTitles":[],"duration":57,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"disabled letter drafting cannot open the template chooser","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749620855,"status":"passed","title":"disabled letter drafting cannot open the template chooser"},{"ancestorTitles":[],"duration":224,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"matching a customized CV copies heading density and paper but preserves letter language","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749620913,"status":"passed","title":"matching a customized CV copies heading density and paper but preserves letter language"},{"ancestorTitles":[],"duration":207,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"closing a copy dialog ignores a late selected CV read","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749621137,"status":"passed","title":"closing a copy dialog ignores a late selected CV read"},{"ancestorTitles":[],"duration":248,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed copy reads are retryable and cannot apply or save a partial snapshot","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793749621344,"status":"passed","title":"failed copy reads are retryable and cannot apply or save a partial snapshot"},{"ancestorTitles":[],"duration":703,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring a historical letter restores saved details with text after explicit dirty confirmation","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793749621592,"status":"passed","title":"restoring a historical letter restores saved details with text after explicit dirty confirmation"},{"ancestorTitles":[],"duration":448,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"successful export waits for the committed local snapshot and uses its returned revision once","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793749622295,"status":"passed","title":"successful export waits for the committed local snapshot and uses its returned revision once"},{"ancestorTitles":[],"duration":459,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a late letter PDF from a previous keyed job never downloads or replaces the current draft","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749622743,"status":"passed","title":"a late letter PDF from a previous keyed job never downloads or replaces the current draft"}],"endTime":1793749623202,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cover-letter-document.test.tsx","startTime":1793749617118,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":877,"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":1793749624120,"status":"passed","title":"opens the dedicated workspace from the whole row and preserves list state on return"},{"ancestorTitles":[],"duration":104,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens a direct workspace URL and returns to applications","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793749624997,"status":"passed","title":"opens a direct workspace URL and returns to applications"},{"ancestorTitles":[],"duration":80,"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":1793749625101,"status":"passed","title":"keeps en context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":127,"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":1793749625181,"status":"passed","title":"keeps nb context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":95,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"does not infer en application readiness from an absent next action","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749625308,"status":"passed","title":"does not infer en application readiness from an absent next action"},{"ancestorTitles":[],"duration":98,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"does not infer nb application readiness from an absent next action","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749625403,"status":"passed","title":"does not infer nb application readiness from an absent next action"},{"ancestorTitles":[],"duration":354,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"row controls do not trigger navigation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749625501,"status":"passed","title":"row controls do not trigger navigation"},{"ancestorTitles":[],"duration":37,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"handles a deleted or inaccessible job without rendering a broken workspace","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749625855,"status":"passed","title":"handles a deleted or inaccessible job without rendering a broken workspace"},{"ancestorTitles":[],"duration":570,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"warns before section navigation would discard application edits","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749625892,"status":"passed","title":"warns before section navigation would discard application edits"},{"ancestorTitles":[],"duration":208,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders shared workspace navigation and progress in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793749626462,"status":"passed","title":"renders shared workspace navigation and progress in Norwegian Bokmål"},{"ancestorTitles":[],"duration":163,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"hydrates list filters, sort and page from a shareable URL","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749626670,"status":"passed","title":"hydrates list filters, sort and page from a shareable URL"},{"ancestorTitles":[],"duration":125,"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":1793749626833,"status":"passed","title":"names the progress scroll region and identifies the current stage without making stages actions"},{"ancestorTitles":[],"duration":119,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps custom status literal without claiming a completed standard pipeline","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749626959,"status":"passed","title":"keeps custom status literal without claiming a completed standard pipeline"},{"ancestorTitles":[],"duration":115,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries a failed workspace read without creating or changing application content","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749627078,"status":"passed","title":"retries a failed workspace read without creating or changing application content"},{"ancestorTitles":[],"duration":315,"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":1793749627193,"status":"passed","title":"keeps the server-selected next action and preparation entry on the existing CV section"},{"ancestorTitles":[],"duration":111,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"uses recorded dates in the summary and keeps absent dates unknown","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749627508,"status":"passed","title":"uses recorded dates in the summary and keeps absent dates unknown"},{"ancestorTitles":[],"duration":175,"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":1793749627619,"status":"passed","title":"section changes retain follow-up query context and expose the selected labelled panel"},{"ancestorTitles":[],"duration":212,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"accordion controls identify exactly one labelled content region","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749627794,"status":"passed","title":"accordion controls identify exactly one labelled content region"},{"ancestorTitles":[],"duration":60,"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":1793749628006,"status":"passed","title":"legacy document links reveal current attachments and frozen history in the named section"},{"ancestorTitles":[],"duration":121,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the missing-profile next task opens the existing canonical profile entry","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749628066,"status":"passed","title":"the missing-profile next task opens the existing canonical profile entry"},{"ancestorTitles":[],"duration":744,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application subsection navigation retains metadata and protects unsaved answers","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793749628188,"status":"passed","title":"application subsection navigation retains metadata and protects unsaved answers"},{"ancestorTitles":[],"duration":174,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy correspondence and notes reveal distinct domain content","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793749628932,"status":"passed","title":"legacy correspondence and notes reveal distinct domain content"},{"ancestorTitles":[],"duration":158,"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":1793749629106,"status":"passed","title":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate"},{"ancestorTitles":[],"duration":207,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"entering Answers waits for a fresh coherent snapshot after sibling writes","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749629264,"status":"passed","title":"entering Answers waits for a fresh coherent snapshot after sibling writes"},{"ancestorTitles":[],"duration":295,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a late previous Answers-entry read cannot enable the current editor","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749629471,"status":"passed","title":"a late previous Answers-entry read cannot enable the current editor"},{"ancestorTitles":[],"duration":170,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Answers-entry read stays closed until a successful retry","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749629766,"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":1793749629936,"status":"passed","title":"leaving a pending direct Answers entry still loads the workspace header"}],"endTime":1793749629983,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-workspace-overlay.test.tsx","startTime":1793749623209,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":2080,"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":1793749630666,"status":"passed","title":"Table/Board switches preserve query, complete membership, page, density and history without hidden reads"},{"ancestorTitles":[],"duration":251,"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":1793749632746,"status":"passed","title":"direct Board and both switch directions retain exact result membership: ?q=Engineer&status=Custom+review"},{"ancestorTitles":[],"duration":400,"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":1793749632997,"status":"passed","title":"direct Board and both switch directions retain exact result membership: ?q=absent"},{"ancestorTitles":[],"duration":1404,"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":1793749633397,"status":"passed","title":"Board uses the shared filter controls and saved query owner without fetching Table"},{"ancestorTitles":[],"duration":194,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Trash stays a Table even when supplied a Board view parameter","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749634802,"status":"passed","title":"Trash stays a Table even when supplied a Board view parameter"},{"ancestorTitles":[],"duration":1318,"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":1793749634996,"status":"passed","title":"saved filters applied in Board reset the Table page and refresh only the active population"}],"endTime":1793749636315,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\jobs-view-integration.test.tsx","startTime":1793749629990,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":192,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"dashboard attention card opens follow-up workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749637173,"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":1793749637365,"status":"passed","title":"empty dashboard prioritizes onboarding and suppresses meaningless analytics"},{"ancestorTitles":[],"duration":65,"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":1793749637483,"status":"passed","title":"reminders open action routes tailored-cv gaps into the tailored cv workspace"},{"ancestorTitles":[],"duration":693,"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":1793749637548,"status":"passed","title":"job table urgency signals and next actions route into the shared workspace flow"}],"endTime":1793749638242,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\daily-control-loop.test.tsx","startTime":1793749636323,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["end-to-end trust loop"],"duration":386,"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":1793749639020,"status":"passed","title":"overview entry opens the canonical communication workspace without sending mail"}],"endTime":1793749639406,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\end-to-end-trust-loop.test.tsx","startTime":1793749638249,"status":"passed","summary":""}],"wasInterrupted":false} diff --git a/docs/ui-modernisation/visual-correction/APPLICATION_FLAT_TRANSITION_FAILURE.json b/docs/ui-modernisation/visual-correction/APPLICATION_FLAT_TRANSITION_FAILURE.json new file mode 100644 index 00000000..6d7833a2 --- /dev/null +++ b/docs/ui-modernisation/visual-correction/APPLICATION_FLAT_TRANSITION_FAILURE.json @@ -0,0 +1 @@ +{"numFailedTestSuites":1,"numFailedTests":2,"numPassedTestSuites":5,"numPassedTests":63,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":6,"numTotalTests":65,"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":1793749544108,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":617,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"contact copy is a reviewed canonical snapshot; cancel is inert and apply preserves recipient and design","invocations":1,"location":null,"numPassingAsserts":17,"retryReasons":[],"startAt":1793749547851,"status":"passed","title":"contact copy is a reviewed canonical snapshot; cancel is inert and apply preserves recipient and design"},{"ancestorTitles":[],"duration":387,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"contact location copies only after selection and unselected contact values preserve destination fields","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749548468,"status":"passed","title":"contact location copies only after selection and unselected contact values preserve destination fields"},{"ancestorTitles":[],"duration":318,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"blank source contacts and choosing no fields never clear destination contacts","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749548855,"status":"passed","title":"blank source contacts and choosing no fields never clear destination contacts"},{"ancestorTitles":[],"duration":584,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter language is an explicit document draft and saves independently of interface and CV language","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749549173,"status":"passed","title":"letter language is an explicit document draft and saves independently of interface and CV language"},{"ancestorTitles":[],"duration":119,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"design copy resolves null overrides through actual theme defaults and effective CV density","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793749549758,"status":"passed","title":"design copy resolves null overrides through actual theme defaults and effective CV density"},{"ancestorTitles":[],"duration":209,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter template chooser uses nine actual matching themes and preserves destination letter details","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793749549877,"status":"passed","title":"letter template chooser uses nine actual matching themes and preserves destination letter details"},{"ancestorTitles":[],"duration":213,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter template load failures retry and cancel never changes the local letter","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749550086,"status":"passed","title":"letter template load failures retry and cancel never changes the local letter"},{"ancestorTitles":[],"duration":824,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"applying a letter template updates the existing letter preview using the current body without saving","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793749550299,"status":"passed","title":"applying a letter template updates the existing letter preview using the current body without saving"},{"ancestorTitles":[],"duration":38,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"disabled letter drafting cannot open the template chooser","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749551124,"status":"passed","title":"disabled letter drafting cannot open the template chooser"},{"ancestorTitles":[],"duration":209,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"matching a customized CV copies heading density and paper but preserves letter language","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749551162,"status":"passed","title":"matching a customized CV copies heading density and paper but preserves letter language"},{"ancestorTitles":[],"duration":191,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"closing a copy dialog ignores a late selected CV read","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749551371,"status":"passed","title":"closing a copy dialog ignores a late selected CV read"},{"ancestorTitles":[],"duration":276,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed copy reads are retryable and cannot apply or save a partial snapshot","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793749551562,"status":"passed","title":"failed copy reads are retryable and cannot apply or save a partial snapshot"},{"ancestorTitles":[],"duration":555,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring a historical letter restores saved details with text after explicit dirty confirmation","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793749551838,"status":"passed","title":"restoring a historical letter restores saved details with text after explicit dirty confirmation"},{"ancestorTitles":[],"duration":515,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"successful export waits for the committed local snapshot and uses its returned revision once","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793749552393,"status":"passed","title":"successful export waits for the committed local snapshot and uses its returned revision once"},{"ancestorTitles":[],"duration":386,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a late letter PDF from a previous keyed job never downloads or replaces the current draft","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749552908,"status":"passed","title":"a late letter PDF from a previous keyed job never downloads or replaces the current draft"}],"endTime":1793749553295,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cover-letter-document.test.tsx","startTime":1793749545082,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":837,"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":1793749554413,"status":"passed","title":"opens the dedicated workspace from the whole row and preserves list state on return"},{"ancestorTitles":[],"duration":153,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"opens a direct workspace URL and returns to applications","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793749555250,"status":"passed","title":"opens a direct workspace URL and returns to applications"},{"ancestorTitles":[],"duration":127,"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":1793749555403,"status":"passed","title":"keeps en context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":158,"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":1793749555530,"status":"passed","title":"keeps nb context after the primary task with a keyboard jump and return across sections"},{"ancestorTitles":[],"duration":97,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"does not infer en application readiness from an absent next action","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749555688,"status":"passed","title":"does not infer en application readiness from an absent next action"},{"ancestorTitles":[],"duration":101,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"does not infer nb application readiness from an absent next action","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749555786,"status":"passed","title":"does not infer nb application readiness from an absent next action"},{"ancestorTitles":[],"duration":290,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"row controls do not trigger navigation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749555887,"status":"passed","title":"row controls do not trigger navigation"},{"ancestorTitles":[],"duration":42,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"handles a deleted or inaccessible job without rendering a broken workspace","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749556177,"status":"passed","title":"handles a deleted or inaccessible job without rendering a broken workspace"},{"ancestorTitles":[],"duration":570,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"warns before section navigation would discard application edits","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793749556219,"status":"passed","title":"warns before section navigation would discard application edits"},{"ancestorTitles":[],"duration":209,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"renders shared workspace navigation and progress in Norwegian Bokmål","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793749556789,"status":"passed","title":"renders shared workspace navigation and progress in Norwegian Bokmål"},{"ancestorTitles":[],"duration":177,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"hydrates list filters, sort and page from a shareable URL","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749556998,"status":"passed","title":"hydrates list filters, sort and page from a shareable URL"},{"ancestorTitles":[],"duration":104,"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":1793749557175,"status":"passed","title":"names the progress scroll region and identifies the current stage without making stages actions"},{"ancestorTitles":[],"duration":125,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keeps custom status literal without claiming a completed standard pipeline","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749557280,"status":"passed","title":"keeps custom status literal without claiming a completed standard pipeline"},{"ancestorTitles":[],"duration":114,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"retries a failed workspace read without creating or changing application content","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749557405,"status":"passed","title":"retries a failed workspace read without creating or changing application content"},{"ancestorTitles":[],"duration":313,"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":1793749557519,"status":"passed","title":"keeps the server-selected next action and preparation entry on the existing CV section"},{"ancestorTitles":[],"duration":94,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"uses recorded dates in the summary and keeps absent dates unknown","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749557832,"status":"passed","title":"uses recorded dates in the summary and keeps absent dates unknown"},{"ancestorTitles":[],"duration":164,"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":1793749557926,"status":"passed","title":"section changes retain follow-up query context and expose the selected labelled panel"},{"ancestorTitles":[],"duration":157,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"accordion controls identify exactly one labelled content region","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749558090,"status":"passed","title":"accordion controls identify exactly one labelled content region"},{"ancestorTitles":[],"duration":60,"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":1793749558247,"status":"passed","title":"legacy document links reveal current attachments and frozen history in the named section"},{"ancestorTitles":[],"duration":129,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the missing-profile next task opens the existing canonical profile entry","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749558307,"status":"passed","title":"the missing-profile next task opens the existing canonical profile entry"},{"ancestorTitles":[],"duration":695,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application subsection navigation retains metadata and protects unsaved answers","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793749558436,"status":"passed","title":"application subsection navigation retains metadata and protects unsaved answers"},{"ancestorTitles":[],"duration":177,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"legacy correspondence and notes reveal distinct domain content","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793749559131,"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":1793749559308,"status":"passed","title":"holds answers until their aggregate matches the route and ignores a late previous-job aggregate"},{"ancestorTitles":[],"duration":175,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"entering Answers waits for a fresh coherent snapshot after sibling writes","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793749559465,"status":"passed","title":"entering Answers waits for a fresh coherent snapshot after sibling writes"},{"ancestorTitles":[],"duration":138,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a late previous Answers-entry read cannot enable the current editor","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749559640,"status":"passed","title":"a late previous Answers-entry read cannot enable the current editor"},{"ancestorTitles":[],"duration":264,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Answers-entry read stays closed until a successful retry","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749559779,"status":"passed","title":"a failed Answers-entry read stays closed until a successful retry"},{"ancestorTitles":[],"duration":107,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"leaving a pending direct Answers entry still loads the workspace header","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793749560043,"status":"passed","title":"leaving a pending direct Answers entry still loads the workspace header"}],"endTime":1793749560151,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-workspace-overlay.test.tsx","startTime":1793749553307,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":1105,"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":1793749560910,"status":"passed","title":"row status/edit/delete controls retain selection and do not open the workspace"},{"ancestorTitles":[],"duration":275,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["TestingLibraryElementError: Unable to find an accessible element with the role \"button\" and name \"Quick status\"\n\nThere are no accessible roles. But there might be some inaccessible roles. If you wish to access them, then set the `hidden` option to `true`. Learn more about this here: https://testing-library.com/docs/dom-testing-library/api-queries#byrole\n\nIgnored nodes: comments, script, style\n\u001b[36m
\u001b[39m\n \u001b[0mØstlandet\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mPlatform engineer\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m8/1/2026\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m2\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mTromsø\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m-\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOpen listing\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mØstlandet\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mPlatform engineer\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m1.8.2026\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m2\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mTromsø\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m-\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mÅpne stilling\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mØstlandet\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mPlatform engineer\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m8/1/2026\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m2\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mTromsø\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m-\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOpen listing\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mØstlandet\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mPlatform engineer\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m1.8.2026\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m2\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mTromsø\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m-\u001b[0m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mÅpne stilling\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m