\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\config.js:37:19)\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:76:38\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:52:17\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:95:19\n at getByRole (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\career-editor.test.tsx:128:27)\n at runNextTicks (node:internal/process/task_queues:65:5)\n at listOnTimeout (node:internal/timers:597:9)\n at processTimers (node:internal/timers:571:7)"],"fullName":"edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709743336,"status":"failed","title":"edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts"},{"ancestorTitles":[],"duration":4128,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793709744262,"status":"passed","title":"edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a pending initial read keeps one request and reports its failure in the latest locale without language writes","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"a pending initial read keeps one request and reports its failure in the latest locale without language writes"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held Save locks every editor mutation, raw input and history restore until its snapshot settles","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"a held Save locks every editor mutation, raw input and history restore until its snapshot settles"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"two Save activations before React commits pending state send only one canonical PUT","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"two Save activations before React commits pending state send only one canonical PUT"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Save retains a scoped localized error and draft for retry through the same Save button","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"a failed Save retains a scoped localized error and draft for retry through the same Save button"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the editor exposes named H2/H3 groups and contextual repeated-item remove controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"the editor exposes named H2/H3 groups and contextual repeated-item remove controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rejected save (409) keeps the draft and its original revision for deliberate retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"a rejected save (409) keeps the draft and its original revision for deliberate retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rejected save (0) keeps the draft and its original revision for deliberate retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"a rejected save (0) keeps the draft and its original revision for deliberate retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"consecutive acknowledged career saves advance the revision returned with the saved snapshot","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"consecutive acknowledged career saves advance the revision returned with the saved snapshot"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a delayed prior lifecycle read cannot replace edits in the current career editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"a delayed prior lifecycle read cannot replace edits in the current career editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a read-only provider cannot edit canonical fields or trigger canonical writes","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709748390,"status":"pending","title":"a read-only provider cannot edit canonical fields or trigger canonical writes"}],"endTime":1793709748403,"message":" ● edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts\n\n TestingLibraryElementError: Unable to find an accessible element with the role \"textbox\" and name \"Project name\"\n\n Here are the accessible roles:\n\n banner:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n heading:\n\n Name \"Projects\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"Add project\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\n Ignored nodes: comments, script, style\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n\n 126 | const projects = await screen.findByRole('region', { name: projectsName });\n 127 | const certifications = screen.getByRole('region', { name: certificationsName });\n > 128 | expect(within(projects).getByRole('textbox', { name: projectLabel })).toHaveValue('Recorded project');\n | ^\n 129 | fireEvent.change(within(projects).getByRole('textbox', { name: projectLabel }), { target: { value: 'Reviewed community project' } });\n 130 | fireEvent.change(within(certifications).getByRole('textbox', { name: certificationLabel }), { target: { value: 'Reviewed credential' } });\n 131 | fireEvent.click(screen.getByRole('button', { name: language === 'nb' ? nb.profileSaveChanges : en.profileSaveChanges }));\n\n at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)\n at node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at node_modules/@testing-library/dom/dist/query-helpers.js:95:19\n at getByRole (src/career-editor.test.tsx:128:27)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\career-editor.test.tsx","startTime":1793709738441,"status":"failed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-green.log b/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-green.log
new file mode 100644
index 00000000..f352dde3
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-green.log
@@ -0,0 +1,949 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/career-editor.test.tsx --testNamePattern=canonical projects and certifications --json --outputFile=../docs/ui-modernisation/a3-career-sections-green.json
+
+ console.warn
+ MUI: You are providing a disabled `button` child to the Tooltip component.
+ A disabled element does not fire events.
+ Tooltip needs to listen to the child element's events to display the title.
+
+ Add a simple wrapper element, such as a `span`.
+
+ at node_modules/@mui/material/Tooltip/Tooltip.js:388:17
+ at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at commitHookEffectListMount (node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)
+ at commitHookPassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)
+ at flushPassiveEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)
+ at flushPendingEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18358:14)
+ at flushSpawnedWork (node_modules/react-dom/cjs/react-dom-client.development.js:18323:44)
+ at commitRoot (node_modules/react-dom/cjs/react-dom-client.development.js:17955:9)
+ at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16667:15)
+ at performSyncWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:18972:7)
+ at flushSyncWorkAcrossRoots_impl (node_modules/react-dom/cjs/react-dom-client.development.js:18814:21)
+
+ console.warn
+ MUI: You are providing a disabled `button` child to the Tooltip component.
+ A disabled element does not fire events.
+ Tooltip needs to listen to the child element's events to display the title.
+
+ Add a simple wrapper element, such as a `span`.
+
+ at node_modules/@mui/material/Tooltip/Tooltip.js:388:17
+ at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at commitHookEffectListMount (node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)
+ at commitHookPassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)
+ at flushPassiveEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)
+ at flushPendingEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18358:14)
+ at flushSpawnedWork (node_modules/react-dom/cjs/react-dom-client.development.js:18323:44)
+ at commitRoot (node_modules/react-dom/cjs/react-dom-client.development.js:17955:9)
+ at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16667:15)
+ at performSyncWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:18972:7)
+ at flushSyncWorkAcrossRoots_impl (node_modules/react-dom/cjs/react-dom-client.development.js:18814:21)
+
+ console.warn
+ MUI: You are providing a disabled `button` child to the Tooltip component.
+ A disabled element does not fire events.
+ Tooltip needs to listen to the child element's events to display the title.
+
+ Add a simple wrapper element, such as a `span`.
+
+ at node_modules/@mui/material/Tooltip/Tooltip.js:388:17
+ at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at commitHookEffectListMount (node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)
+ at commitHookPassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)
+ at flushPassiveEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)
+ at flushPendingEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18358:14)
+ at flushSpawnedWork (node_modules/react-dom/cjs/react-dom-client.development.js:18323:44)
+ at commitRoot (node_modules/react-dom/cjs/react-dom-client.development.js:17955:9)
+ at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16667:15)
+ at performSyncWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:18972:7)
+ at flushSyncWorkAcrossRoots_impl (node_modules/react-dom/cjs/react-dom-client.development.js:18814:21)
+
+ console.warn
+ MUI: You are providing a disabled `button` child to the Tooltip component.
+ A disabled element does not fire events.
+ Tooltip needs to listen to the child element's events to display the title.
+
+ Add a simple wrapper element, such as a `span`.
+
+ at node_modules/@mui/material/Tooltip/Tooltip.js:388:17
+ at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at commitHookEffectListMount (node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)
+ at commitHookPassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)
+ at flushPassiveEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)
+ at flushPendingEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18358:14)
+ at flushSpawnedWork (node_modules/react-dom/cjs/react-dom-client.development.js:18323:44)
+ at commitRoot (node_modules/react-dom/cjs/react-dom-client.development.js:17955:9)
+ at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16667:15)
+ at performSyncWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:18972:7)
+ at flushSyncWorkAcrossRoots_impl (node_modules/react-dom/cjs/react-dom-client.development.js:18814:21)
+
+ console.warn
+ MUI: You are providing a disabled `button` child to the Tooltip component.
+ A disabled element does not fire events.
+ Tooltip needs to listen to the child element's events to display the title.
+
+ Add a simple wrapper element, such as a `span`.
+
+ at node_modules/@mui/material/Tooltip/Tooltip.js:388:17
+ at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at commitHookEffectListMount (node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)
+ at commitHookPassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)
+ at flushPassiveEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)
+ at flushPendingEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18358:14)
+ at flushSpawnedWork (node_modules/react-dom/cjs/react-dom-client.development.js:18323:44)
+ at commitRoot (node_modules/react-dom/cjs/react-dom-client.development.js:17955:9)
+ at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16667:15)
+ at performSyncWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:18972:7)
+ at flushSyncWorkAcrossRoots_impl (node_modules/react-dom/cjs/react-dom-client.development.js:18814:21)
+
+ console.warn
+ MUI: You are providing a disabled `button` child to the Tooltip component.
+ A disabled element does not fire events.
+ Tooltip needs to listen to the child element's events to display the title.
+
+ Add a simple wrapper element, such as a `span`.
+
+ at node_modules/@mui/material/Tooltip/Tooltip.js:388:17
+ at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at commitHookEffectListMount (node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)
+ at commitHookPassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)
+ at flushPassiveEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)
+ at flushPendingEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18358:14)
+ at flushSpawnedWork (node_modules/react-dom/cjs/react-dom-client.development.js:18323:44)
+ at commitRoot (node_modules/react-dom/cjs/react-dom-client.development.js:17955:9)
+ at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16667:15)
+ at performSyncWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:18972:7)
+ at flushSyncWorkAcrossRoots_impl (node_modules/react-dom/cjs/react-dom-client.development.js:18814:21)
+
+ console.warn
+ MUI: You are providing a disabled `button` child to the Tooltip component.
+ A disabled element does not fire events.
+ Tooltip needs to listen to the child element's events to display the title.
+
+ Add a simple wrapper element, such as a `span`.
+
+ at node_modules/@mui/material/Tooltip/Tooltip.js:388:17
+ at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at commitHookEffectListMount (node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)
+ at commitHookPassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)
+ at flushPassiveEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)
+ at flushPendingEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18358:14)
+ at flushSpawnedWork (node_modules/react-dom/cjs/react-dom-client.development.js:18323:44)
+ at commitRoot (node_modules/react-dom/cjs/react-dom-client.development.js:17955:9)
+ at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16667:15)
+ at performSyncWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:18972:7)
+ at flushSyncWorkAcrossRoots_impl (node_modules/react-dom/cjs/react-dom-client.development.js:18814:21)
+
+ console.warn
+ MUI: You are providing a disabled `button` child to the Tooltip component.
+ A disabled element does not fire events.
+ Tooltip needs to listen to the child element's events to display the title.
+
+ Add a simple wrapper element, such as a `span`.
+
+ at node_modules/@mui/material/Tooltip/Tooltip.js:388:17
+ at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at commitHookEffectListMount (node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)
+ at commitHookPassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15718:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15476:11)
+ at recursivelyTraversePassiveMountEffects (node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)
+ at commitPassiveMountOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)
+ at flushPassiveEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)
+ at flushPendingEffects (node_modules/react-dom/cjs/react-dom-client.development.js:18358:14)
+ at flushSpawnedWork (node_modules/react-dom/cjs/react-dom-client.development.js:18323:44)
+ at commitRoot (node_modules/react-dom/cjs/react-dom-client.development.js:17955:9)
+ at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:16667:15)
+ at performSyncWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:18972:7)
+ at flushSyncWorkAcrossRoots_impl (node_modules/react-dom/cjs/react-dom-client.development.js:18814:21)
+
+FAIL src/career-editor.test.tsx (9.962 s)
+ ● edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts
+
+ TestingLibraryElementError: Unable to find an accessible element with the role "textbox" and name "Project name"
+
+ Here are the accessible roles:
+
+ banner:
+
+ Name "":
+
+
+ --------------------------------------------------
+ heading:
+
+ Name "Projects":
+
+
+ --------------------------------------------------
+ button:
+
+ Name "Add project":
+
+
+ --------------------------------------------------paragraph:
+
+ Name "":
+
+
+ --------------------------------------------------
+
+ Ignored nodes: comments, script, style
+
+
+
+
+ Projects
+
+
+
+
+
+
+
+
+ Nothing added yet.
+
+
+
+
+ 126 | const projects = await screen.findByRole('region', { name: projectsName });
+ 127 | const certifications = screen.getByRole('region', { name: certificationsName });
+ > 128 | expect(within(projects).getByRole('textbox', { name: projectLabel })).toHaveValue('Recorded project');
+ | ^
+ 129 | fireEvent.change(within(projects).getByRole('textbox', { name: projectLabel }), { target: { value: 'Reviewed community project' } });
+ 130 | fireEvent.change(within(certifications).getByRole('textbox', { name: certificationLabel }), { target: { value: 'Reviewed credential' } });
+ 131 | fireEvent.click(screen.getByRole('button', { name: language === 'nb' ? nb.profileSaveChanges : en.profileSaveChanges }));
+
+ at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)
+ at node_modules/@testing-library/dom/dist/query-helpers.js:76:38
+ at node_modules/@testing-library/dom/dist/query-helpers.js:52:17
+ at node_modules/@testing-library/dom/dist/query-helpers.js:95:19
+ at getByRole (src/career-editor.test.tsx:128:27)
+
+Test Suites: 1 failed, 1 total
+Tests: 1 failed, 12 skipped, 1 passed, 14 total
+Snapshots: 0 total
+Time: 11.408 s, estimated 14 s
+Ran all test suites within paths "src/career-editor.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-career-sections-green.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-red.json b/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-red.json
new file mode 100644
index 00000000..01c10e99
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-red.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":1,"numFailedTests":2,"numPassedTestSuites":0,"numPassedTests":0,"numPendingTestSuites":0,"numPendingTests":12,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":14,"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":1793709642546,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a locale update retains dirty structured and raw drafts without reading their source again","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709648101,"status":"pending","title":"a locale update retains dirty structured and raw drafts without reading their source again"},{"ancestorTitles":[],"duration":4676,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["Error: Unable to find role=\"region\" and name \"Projects\"\n\nIgnored nodes: comments, script, style\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 (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":"edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709648101,"status":"failed","title":"edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts"},{"ancestorTitles":[],"duration":4365,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["Error: Unable to find role=\"region\" and name \"Prosjekter\"\n\nIgnored nodes: comments, script, style\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 (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":"edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709652778,"status":"failed","title":"edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a pending initial read keeps one request and reports its failure in the latest locale without language writes","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"a pending initial read keeps one request and reports its failure in the latest locale without language writes"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held Save locks every editor mutation, raw input and history restore until its snapshot settles","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"a held Save locks every editor mutation, raw input and history restore until its snapshot settles"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"two Save activations before React commits pending state send only one canonical PUT","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"two Save activations before React commits pending state send only one canonical PUT"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Save retains a scoped localized error and draft for retry through the same Save button","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"a failed Save retains a scoped localized error and draft for retry through the same Save button"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the editor exposes named H2/H3 groups and contextual repeated-item remove controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"the editor exposes named H2/H3 groups and contextual repeated-item remove controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rejected save (409) keeps the draft and its original revision for deliberate retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"a rejected save (409) keeps the draft and its original revision for deliberate retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rejected save (0) keeps the draft and its original revision for deliberate retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"a rejected save (0) keeps the draft and its original revision for deliberate retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"consecutive acknowledged career saves advance the revision returned with the saved snapshot","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"consecutive acknowledged career saves advance the revision returned with the saved snapshot"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a delayed prior lifecycle read cannot replace edits in the current career editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"a delayed prior lifecycle read cannot replace edits in the current career editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a read-only provider cannot edit canonical fields or trigger canonical writes","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793709657143,"status":"pending","title":"a read-only provider cannot edit canonical fields or trigger canonical writes"}],"endTime":1793709657156,"message":" ● edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts\n\n Unable to find role=\"region\" and name \"Projects\"\n\n Ignored nodes: comments, script, style\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 126 | const projects = await screen.findByRole('region', { name: projectsName });\n | ^\n 127 | const certifications = screen.getByRole('region', { name: certificationsName });\n 128 | expect(within(projects).getByRole('textbox', { name: projectLabel })).toHaveValue('Recorded project');\n 129 | fireEvent.change(within(projects).getByRole('textbox', { name: projectLabel }), { target: { value: 'Reviewed community project' } });\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/career-editor.test.tsx:126:33)\n\n ● edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts\n\n Unable to find role=\"region\" and name \"Prosjekter\"\n\n Ignored nodes: comments, script, style\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 126 | const projects = await screen.findByRole('region', { name: projectsName });\n | ^\n 127 | const certifications = screen.getByRole('region', { name: certificationsName });\n 128 | expect(within(projects).getByRole('textbox', { name: projectLabel })).toHaveValue('Recorded project');\n 129 | fireEvent.change(within(projects).getByRole('textbox', { name: projectLabel }), { target: { value: 'Reviewed community project' } });\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/career-editor.test.tsx:126:33)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\career-editor.test.tsx","startTime":1793709643985,"status":"failed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-tests.json b/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-tests.json
new file mode 100644
index 00000000..df44b6e7
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-tests.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":2,"numPassedTests":17,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":2,"numTotalTests":17,"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":1793709883882,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":7449,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a locale update retains dirty structured and raw drafts without reading their source again","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793709889780,"status":"passed","title":"a locale update retains dirty structured and raw drafts without reading their source again"},{"ancestorTitles":[],"duration":4006,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793709897230,"status":"passed","title":"edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts"},{"ancestorTitles":[],"duration":3669,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793709901236,"status":"passed","title":"edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts"},{"ancestorTitles":[],"duration":1528,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a pending initial read keeps one request and reports its failure in the latest locale without language writes","invocations":1,"location":null,"numPassingAsserts":15,"retryReasons":[],"startAt":1793709904905,"status":"passed","title":"a pending initial read keeps one request and reports its failure in the latest locale without language writes"},{"ancestorTitles":[],"duration":7557,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held Save locks every editor mutation, raw input and history restore until its snapshot settles","invocations":1,"location":null,"numPassingAsserts":50,"retryReasons":[],"startAt":1793709906433,"status":"passed","title":"a held Save locks every editor mutation, raw input and history restore until its snapshot settles"},{"ancestorTitles":[],"duration":2649,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"two Save activations before React commits pending state send only one canonical PUT","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793709913990,"status":"passed","title":"two Save activations before React commits pending state send only one canonical PUT"},{"ancestorTitles":[],"duration":6344,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Save retains a scoped localized error and draft for retry through the same Save button","invocations":1,"location":null,"numPassingAsserts":22,"retryReasons":[],"startAt":1793709916639,"status":"passed","title":"a failed Save retains a scoped localized error and draft for retry through the same Save button"},{"ancestorTitles":[],"duration":2297,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the editor exposes named H2/H3 groups and contextual repeated-item remove controls","invocations":1,"location":null,"numPassingAsserts":21,"retryReasons":[],"startAt":1793709922984,"status":"passed","title":"the editor exposes named H2/H3 groups and contextual repeated-item remove controls"},{"ancestorTitles":[],"duration":7958,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793709925281,"status":"passed","title":"manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls"},{"ancestorTitles":[],"duration":5255,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rejected save (409) keeps the draft and its original revision for deliberate retry","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793709933239,"status":"passed","title":"a rejected save (409) keeps the draft and its original revision for deliberate retry"},{"ancestorTitles":[],"duration":5233,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rejected save (0) keeps the draft and its original revision for deliberate retry","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793709938494,"status":"passed","title":"a rejected save (0) keeps the draft and its original revision for deliberate retry"},{"ancestorTitles":[],"duration":5612,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"consecutive acknowledged career saves advance the revision returned with the saved snapshot","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793709943728,"status":"passed","title":"consecutive acknowledged career saves advance the revision returned with the saved snapshot"},{"ancestorTitles":[],"duration":4896,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a delayed prior lifecycle read cannot replace edits in the current career editor","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793709949341,"status":"passed","title":"a delayed prior lifecycle read cannot replace edits in the current career editor"},{"ancestorTitles":[],"duration":4008,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a read-only provider cannot edit canonical fields or trigger canonical writes","invocations":1,"location":null,"numPassingAsserts":45,"retryReasons":[],"startAt":1793709954238,"status":"passed","title":"a read-only provider cannot edit canonical fields or trigger canonical writes"}],"endTime":1793709958248,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\career-editor.test.tsx","startTime":1793709885305,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":12,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"English and Bokmål expose the same UI message keys","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793709958709,"status":"passed","title":"English and Bokmål expose the same UI message keys"},{"ancestorTitles":[],"duration":9,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål preserves every English substitution variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793709958721,"status":"passed","title":"Bokmål preserves every English substitution variable"},{"ancestorTitles":[],"duration":3,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"supported UI catalogues contain no blank messages","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793709958730,"status":"passed","title":"supported UI catalogues contain no blank messages"}],"endTime":1793709958734,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\translation-catalogue.test.ts","startTime":1793709958269,"status":"passed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-tests.log b/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-tests.log
new file mode 100644
index 00000000..7581648f
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-career-sections-tests.log
@@ -0,0 +1,11 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/career-editor.test.tsx src/translation-catalogue.test.ts --json --outputFile=../docs/ui-modernisation/a3-career-sections-tests.json
+
+
+Test Suites: 2 passed, 2 total
+Tests: 17 passed, 17 total
+Snapshots: 0 total
+Time: 74.862 s
+Ran all test suites within paths "src/career-editor.test.tsx", "src/translation-catalogue.test.ts".
+Test results written to: ..\docs\ui-modernisation\a3-career-sections-tests.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-career-tests.json b/docs/ui-modernisation/evidence/career/frontend/a3-career-tests.json
new file mode 100644
index 00000000..e2e5e399
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-career-tests.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":7,"numPassedTests":152,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":8,"numTotalTests":153,"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":1793710704793,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":6457,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a locale update retains dirty structured and raw drafts without reading their source again","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793710710294,"status":"passed","title":"a locale update retains dirty structured and raw drafts without reading their source again"},{"ancestorTitles":[],"duration":3562,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793710716751,"status":"passed","title":"edits en canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts"},{"ancestorTitles":[],"duration":4234,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793710720313,"status":"passed","title":"edits nb canonical projects and certifications through the existing versioned Save without changing their IDs or sibling facts"},{"ancestorTitles":[],"duration":7235,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"project and certification add/remove controls keep sibling entries and focus before the explicit canonical Save","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793710724547,"status":"passed","title":"project and certification add/remove controls keep sibling entries and focus before the explicit canonical Save"},{"ancestorTitles":[],"duration":1426,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a pending initial read keeps one request and reports its failure in the latest locale without language writes","invocations":1,"location":null,"numPassingAsserts":15,"retryReasons":[],"startAt":1793710731782,"status":"passed","title":"a pending initial read keeps one request and reports its failure in the latest locale without language writes"},{"ancestorTitles":[],"duration":8635,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held Save locks every editor mutation, raw input and history restore until its snapshot settles","invocations":1,"location":null,"numPassingAsserts":52,"retryReasons":[],"startAt":1793710733208,"status":"passed","title":"a held Save locks every editor mutation, raw input and history restore until its snapshot settles"},{"ancestorTitles":[],"duration":3291,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"two Save activations before React commits pending state send only one canonical PUT","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710741843,"status":"passed","title":"two Save activations before React commits pending state send only one canonical PUT"},{"ancestorTitles":[],"duration":7976,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed Save retains a scoped localized error and draft for retry through the same Save button","invocations":1,"location":null,"numPassingAsserts":22,"retryReasons":[],"startAt":1793710745134,"status":"passed","title":"a failed Save retains a scoped localized error and draft for retry through the same Save button"},{"ancestorTitles":[],"duration":3839,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the editor exposes named H2/H3 groups and contextual repeated-item remove controls","invocations":1,"location":null,"numPassingAsserts":21,"retryReasons":[],"startAt":1793710753111,"status":"passed","title":"the editor exposes named H2/H3 groups and contextual repeated-item remove controls"},{"ancestorTitles":[],"duration":13050,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793710756951,"status":"passed","title":"manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls"},{"ancestorTitles":[],"duration":6834,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rejected save (409) keeps the draft and its original revision for deliberate retry","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793710770001,"status":"passed","title":"a rejected save (409) keeps the draft and its original revision for deliberate retry"},{"ancestorTitles":[],"duration":6531,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rejected save (0) keeps the draft and its original revision for deliberate retry","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793710776835,"status":"passed","title":"a rejected save (0) keeps the draft and its original revision for deliberate retry"},{"ancestorTitles":[],"duration":6373,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"consecutive acknowledged career saves advance the revision returned with the saved snapshot","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710783366,"status":"passed","title":"consecutive acknowledged career saves advance the revision returned with the saved snapshot"},{"ancestorTitles":[],"duration":4730,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a delayed prior lifecycle read cannot replace edits in the current career editor","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710789740,"status":"passed","title":"a delayed prior lifecycle read cannot replace edits in the current career editor"},{"ancestorTitles":[],"duration":3509,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a read-only provider cannot edit canonical fields or trigger canonical writes","invocations":1,"location":null,"numPassingAsserts":45,"retryReasons":[],"startAt":1793710794470,"status":"passed","title":"a read-only provider cannot edit canonical fields or trigger canonical writes"}],"endTime":1793710797980,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\career-editor.test.tsx","startTime":1793710706174,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":1779,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"disabled CV worker upload gives actionable en recovery without changing the profile","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710799609,"status":"passed","title":"disabled CV worker upload gives actionable en recovery without changing the profile"},{"ancestorTitles":[],"duration":1348,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"disabled CV worker upload gives actionable nb recovery without changing the profile","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710801389,"status":"passed","title":"disabled CV worker upload gives actionable nb recovery without changing the profile"},{"ancestorTitles":[],"duration":2026,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed history reads have a scoped Retry that preserves unsaved source fields","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793710802737,"status":"passed","title":"failed history reads have a scoped Retry that preserves unsaved source fields"},{"ancestorTitles":[],"duration":2159,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a dirty canonical profile cannot be replaced through history restore","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710804763,"status":"passed","title":"a dirty canonical profile cannot be replaced through history restore"},{"ancestorTitles":[],"duration":2051,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"each failed comparison can retry its own run without refetching canonical data or losing another comparison","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793710806922,"status":"passed","title":"each failed comparison can retry its own run without refetching canonical data or losing another comparison"},{"ancestorTitles":[],"duration":1350,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"review shows actual current and imported values and discloses fields outside the comparison","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793710808973,"status":"passed","title":"review shows actual current and imported values and discloses fields outside the comparison"},{"ancestorTitles":[],"duration":2076,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"selecting then deselecting low-confidence data sends the explicit empty selection","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793710810324,"status":"passed","title":"selecting then deselecting low-confidence data sends the explicit empty selection"},{"ancestorTitles":[],"duration":3443,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"held acceptance locks review choices and all canonical editors and prevents duplicate or overlapping writes","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"startAt":1793710812400,"status":"passed","title":"held acceptance locks review choices and all canonical editors and prevents duplicate or overlapping writes"},{"ancestorTitles":[],"duration":2820,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed acceptance keeps the chosen stable IDs and shows durable translated recovery without automatically resending","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793710815843,"status":"passed","title":"failed acceptance keeps the chosen stable IDs and shows durable translated recovery without automatically resending"},{"ancestorTitles":[],"duration":3286,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"discarding an import preserves unsaved structured and raw drafts and does not reload the canonical profile","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793710818663,"status":"passed","title":"discarding an import preserves unsaved structured and raw drafts and does not reload the canonical profile"},{"ancestorTitles":[],"duration":3319,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"saving canonical changes refreshes history and comparisons and clears choices made against the earlier source","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710821949,"status":"passed","title":"saving canonical changes refreshes history and comparisons and clears choices made against the earlier source"},{"ancestorTitles":[],"duration":2987,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed restore keeps the original source and known history with an explicit retry","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793710825268,"status":"passed","title":"a failed restore keeps the original source and known history with an explicit retry"},{"ancestorTitles":[],"duration":2314,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"an operation cancellation is guarded while pending and leaves an unsaved source draft intact","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710828255,"status":"passed","title":"an operation cancellation is guarded while pending and leaves an unsaved source draft intact"},{"ancestorTitles":[],"duration":1888,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed operation retry stays scoped and only resends the same operation on explicit user retry","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710830569,"status":"passed","title":"a failed operation retry stays scoped and only resends the same operation on explicit user retry"},{"ancestorTitles":[],"duration":1417,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål localizes comparison labels while preserving imported facts named like UI labels or object properties","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710832458,"status":"passed","title":"Bokmål localizes comparison labels while preserving imported facts named like UI labels or object properties"},{"ancestorTitles":[],"duration":1569,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the known low-confidence contact placeholder is localized","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710833875,"status":"passed","title":"the known low-confidence contact placeholder is localized"}],"endTime":1793710835446,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\career-import-review.test.tsx","startTime":1793710798036,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":181,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"first-run workspace presents concise profile, import, general CV and job-specific actions","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710837025,"status":"passed","title":"first-run workspace presents concise profile, import, general CV and job-specific actions"},{"ancestorTitles":[],"duration":122,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"career workspace overview and import state render in Bokmål","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710837207,"status":"passed","title":"career workspace overview and import state render in Bokmål"},{"ancestorTitles":[],"duration":166,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"returning workspace shows missing profile information and recent general and job-specific CVs","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710837330,"status":"passed","title":"returning workspace shows missing profile information and recent general and job-specific CVs"},{"ancestorTitles":[],"duration":66,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"workspace exposes the pending_review import state as a resumable action","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710837496,"status":"passed","title":"workspace exposes the pending_review import state as a resumable action"},{"ancestorTitles":[],"duration":76,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"workspace exposes the queued import state as a resumable action","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710837562,"status":"passed","title":"workspace exposes the queued import state as a resumable action"},{"ancestorTitles":[],"duration":80,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"workspace exposes the failed import state as a resumable action","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710837639,"status":"passed","title":"workspace exposes the failed import state as a resumable action"},{"ancestorTitles":[],"duration":90,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"workspace represents loading and profile-load errors without inventing status","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710837719,"status":"passed","title":"workspace represents loading and profile-load errors without inventing status"},{"ancestorTitles":[],"duration":98,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a settled failed profile read hides the completeness score and retries only through its existing owner","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710837810,"status":"passed","title":"a settled failed profile read hides the completeness score and retries only through its existing owner"},{"ancestorTitles":[],"duration":88,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"an unknown import read cannot claim no imports, completion or first-run guidance","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710837908,"status":"passed","title":"an unknown import read cannot claim no imports, completion or first-run guidance"},{"ancestorTitles":[],"duration":95,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed import read stays unknown and keeps its own retry separate from the profile read","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710837996,"status":"passed","title":"a failed import read stays unknown and keeps its own retry separate from the profile read"},{"ancestorTitles":[],"duration":239,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed recent-CV reads do not imply first-run and retry the same list without writes","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793710838091,"status":"passed","title":"failed recent-CV reads do not imply first-run and retry the same list without writes"},{"ancestorTitles":[],"duration":8517,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"en overview opens every canonical section directly without saving or reloading the profile","invocations":1,"location":null,"numPassingAsserts":59,"retryReasons":[],"startAt":1793710838331,"status":"passed","title":"en overview opens every canonical section directly without saving or reloading the profile"},{"ancestorTitles":[],"duration":7746,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"nb overview opens every canonical section directly without saving or reloading the profile","invocations":1,"location":null,"numPassingAsserts":59,"retryReasons":[],"startAt":1793710846848,"status":"passed","title":"nb overview opens every canonical section directly without saving or reloading the profile"},{"ancestorTitles":[],"duration":931,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"en section indicators retain server scoring and stop claiming saved status for an unsaved draft","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710854595,"status":"passed","title":"en section indicators retain server scoring and stop claiming saved status for an unsaved draft"},{"ancestorTitles":[],"duration":926,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"nb section indicators retain server scoring and stop claiming saved status for an unsaved draft","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710855526,"status":"passed","title":"nb section indicators retain server scoring and stop claiming saved status for an unsaved draft"},{"ancestorTitles":[],"duration":280,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the parent exposes failed import-read retry without canonical saves or history restores","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710856452,"status":"passed","title":"the parent exposes failed import-read retry without canonical saves or history restores"},{"ancestorTitles":[],"duration":1421,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"changing language in overview cannot refetch or overwrite a dirty canonical draft","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710856733,"status":"passed","title":"changing language in overview cannot refetch or overwrite a dirty canonical draft"},{"ancestorTitles":[],"duration":973,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"visited evidence keeps its draft across sections without an unvisited or repeated list request","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710858155,"status":"passed","title":"visited evidence keeps its draft across sections without an unvisited or repeated list request"}],"endTime":1793710859130,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\career-workspace-page.test.tsx","startTime":1793710835461,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":1118,"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":1793710860779,"status":"passed","title":"contact copy is a reviewed canonical snapshot; cancel is inert and apply preserves recipient and design"},{"ancestorTitles":[],"duration":564,"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":1793710861897,"status":"passed","title":"contact location copies only after selection and unselected contact values preserve destination fields"},{"ancestorTitles":[],"duration":368,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"blank source contacts and choosing no fields never clear destination contacts","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710862461,"status":"passed","title":"blank source contacts and choosing no fields never clear destination contacts"},{"ancestorTitles":[],"duration":788,"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":1793710862829,"status":"passed","title":"letter language is an explicit document draft and saves independently of interface and CV language"},{"ancestorTitles":[],"duration":371,"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":1793710863618,"status":"passed","title":"design copy resolves null overrides through actual theme defaults and effective CV density"},{"ancestorTitles":[],"duration":349,"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":1793710863990,"status":"passed","title":"letter template chooser uses nine actual matching themes and preserves destination letter details"},{"ancestorTitles":[],"duration":386,"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":1793710864339,"status":"passed","title":"letter template load failures retry and cancel never changes the local letter"},{"ancestorTitles":[],"duration":1021,"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":1793710864725,"status":"passed","title":"applying a letter template updates the existing letter preview using the current body without saving"},{"ancestorTitles":[],"duration":144,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"disabled letter drafting cannot open the template chooser","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710865746,"status":"passed","title":"disabled letter drafting cannot open the template chooser"},{"ancestorTitles":[],"duration":701,"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":1793710865890,"status":"passed","title":"matching a customized CV copies heading density and paper but preserves letter language"},{"ancestorTitles":[],"duration":494,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"closing a copy dialog ignores a late selected CV read","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710866592,"status":"passed","title":"closing a copy dialog ignores a late selected CV read"},{"ancestorTitles":[],"duration":507,"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":1793710867086,"status":"passed","title":"failed copy reads are retryable and cannot apply or save a partial snapshot"},{"ancestorTitles":[],"duration":1654,"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":1793710867594,"status":"passed","title":"restoring a historical letter restores saved details with text after explicit dirty confirmation"},{"ancestorTitles":[],"duration":1046,"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":1793710869248,"status":"passed","title":"successful export waits for the committed local snapshot and uses its returned revision once"},{"ancestorTitles":[],"duration":1572,"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":1793710870294,"status":"passed","title":"a late letter PDF from a previous keyed job never downloads or replaces the current draft"}],"endTime":1793710871867,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cover-letter-document.test.tsx","startTime":1793710859142,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":439,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"blank creation explicitly excludes all profile sections and contact even after template selection","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793710873679,"status":"passed","title":"blank creation explicitly excludes all profile sections and contact even after template selection"},{"ancestorTitles":[],"duration":546,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile creation includes only deliberately selected available sections and contact","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710874119,"status":"passed","title":"profile creation includes only deliberately selected available sections and contact"},{"ancestorTitles":[],"duration":431,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"unavailable profile sections block profile creation and allow an explicit blank fallback","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710874665,"status":"passed","title":"unavailable profile sections block profile creation and allow an explicit blank fallback"},{"ancestorTitles":[],"duration":2,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"export validation decodes structured and blob errors without relabelling unknown failures","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710875097,"status":"passed","title":"export validation decodes structured and blob errors without relabelling unknown failures"},{"ancestorTitles":[],"duration":70,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the CV library has a section heading and announces its held initial read without showing an empty result","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710875099,"status":"passed","title":"the CV library has a section heading and announces its held initial read without showing an empty result"},{"ancestorTitles":[],"duration":123,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed CV list read has an explicit retry that clears the stale failure after recovery","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710875169,"status":"passed","title":"a failed CV list read has an explicit retry that clears the stale failure after recovery"},{"ancestorTitles":[],"duration":484,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a live language change retains an open CV name and template draft without refetching library data","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710875292,"status":"passed","title":"a live language change retains an open CV name and template draft without refetching library data"},{"ancestorTitles":[],"duration":1029,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"held CV creation locks the draft and gallery, then keeps a failed draft for an explicit retry","invocations":1,"location":null,"numPassingAsserts":17,"retryReasons":[],"startAt":1793710875776,"status":"passed","title":"held CV creation locks the draft and gallery, then keeps a failed draft for an explicit retry"},{"ancestorTitles":[],"duration":460,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a locked CV template remains identifiable and cannot change the creation request","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710876805,"status":"passed","title":"a locked CV template remains identifiable and cannot change the creation request"},{"ancestorTitles":[],"duration":688,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held duplicate blocks another action for the same CV and shows the persisted refreshed copy","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710877265,"status":"passed","title":"a held duplicate blocks another action for the same CV and shows the persisted refreshed copy"},{"ancestorTitles":[],"duration":900,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rename reads the current revision and preserves its settings when saving the new name","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710877953,"status":"passed","title":"rename reads the current revision and preserves its settings when saving the new name"},{"ancestorTitles":[],"duration":862,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rename conflict keeps the original library entry and never retries the write automatically","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710878853,"status":"passed","title":"a rename conflict keeps the original library entry and never retries the write automatically"},{"ancestorTitles":[],"duration":681,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cancelling deletion returns focus to the surviving CV action control without removing the CV","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710879715,"status":"passed","title":"cancelling deletion returns focus to the surviving CV action control without removing the CV"},{"ancestorTitles":[],"duration":1173,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed creation keeps its draft and translates its failure after closing and reopening in another language","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793710880396,"status":"passed","title":"a failed creation keeps its draft and translates its failure after closing and reopening in another language"},{"ancestorTitles":[],"duration":382,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"generic PDF failure follows the current language both after failure and when a held request fails","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793710881569,"status":"passed","title":"generic PDF failure follows the current language both after failure and when a held request fails"},{"ancestorTitles":[],"duration":545,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held deletion preserves focus moved to another surviving control before the response arrives","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793710881951,"status":"passed","title":"a held deletion preserves focus moved to another surviving control before the response arrives"},{"ancestorTitles":[],"duration":273,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF status 503 shows an actionable message without retrying","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793710882496,"status":"passed","title":"PDF status 503 shows an actionable message without retrying"},{"ancestorTitles":[],"duration":211,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF status 504 shows an actionable message without retrying","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793710882769,"status":"passed","title":"PDF status 504 shows an actionable message without retrying"},{"ancestorTitles":[],"duration":52,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"lists existing CVs from the variants API","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710882980,"status":"passed","title":"lists existing CVs from the variants API"},{"ancestorTitles":[],"duration":304,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"shows the empty state and creates a CV then navigates to the editor","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710883033,"status":"passed","title":"shows the empty state and creates a CV then navigates to the editor"},{"ancestorTitles":[],"duration":176,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"CV dashboard and create flow render in Bokmål","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710883337,"status":"passed","title":"CV dashboard and create flow render in Bokmål"},{"ancestorTitles":[],"duration":662,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"CV deletion requires confirmation and supports cancellation","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710883513,"status":"passed","title":"CV deletion requires confirmation and supports cancellation"}],"endTime":1793710884176,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-page.test.tsx","startTime":1793710871883,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":1488,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C08 C09 E08] common controls and advanced disclosure do not mutate document settings","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793710886772,"status":"passed","title":"[PRES-C08 C09 E08] common controls and advanced disclosure do not mutate document settings"},{"ancestorTitles":[],"duration":1412,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C09 C10] numeric edits reject invalid ranges, keep exact valid values and reset only one setting","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710888263,"status":"passed","title":"[PRES-C09 C10] numeric edits reject invalid ranges, keep exact valid values and reset only one setting"},{"ancestorTitles":[],"duration":4352,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C07 C08 C09] capability filtering preserves dormant saved values and exposes inherited sidebar controls","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793710889675,"status":"passed","title":"[PRES-C07 C08 C09] capability filtering preserves dormant saved values and exposes inherited sidebar controls"},{"ancestorTitles":[],"duration":1330,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C08 C10 E09] locks prevent selection and confirmed template resets preserve content and document metadata","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"startAt":1793710894028,"status":"passed","title":"[PRES-C08 C10 E09] locks prevent selection and confirmed template resets preserve content and document metadata"},{"ancestorTitles":[],"duration":356,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C08 C09 E08] Bokmål controls expose their scope, values and non-colour selection state","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710895359,"status":"passed","title":"[PRES-C08 C09 E08] Bokmål controls expose their scope, values and non-colour selection state"},{"ancestorTitles":[],"duration":771,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C08 C09] unsupported and legacy saved values survive unrelated edits without implicit normalization","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710895715,"status":"passed","title":"[PRES-C08 C09] unsupported and legacy saved values survive unrelated edits without implicit normalization"}],"endTime":1793710896488,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-document-controls.test.tsx","startTime":1793710884187,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":5608,"failing":false,"failureDetails":[{"matcherResult":{"pass":false,"message":"expect(element).toHaveValue()\n\nExpected the element to have value:\n\nReceived:\n D"}}],"failureMessages":["Error: expect(element).toHaveValue()\n\nExpected the element to have value:\n\nReceived:\n D\n at Object.toHaveValue (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx:104:20)"],"fullName":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710898744,"status":"failed","title":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave"},{"ancestorTitles":[],"duration":688,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tablet width keeps both editing and preview available in the stacked document flow","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710904384,"status":"passed","title":"tablet width keeps both editing and preview available in the stacked document flow"},{"ancestorTitles":[],"duration":2846,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710905073,"status":"passed","title":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo"},{"ancestorTitles":[],"duration":1738,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a revision conflict disables document history without silently writing an undo","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710907919,"status":"passed","title":"a revision conflict disables document history without silently writing an undo"},{"ancestorTitles":[],"duration":1997,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"switching documents hides the previous draft while loading and starts fresh history","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710909657,"status":"passed","title":"switching documents hides the previous draft while loading and starts fresh history"},{"ancestorTitles":[],"duration":935,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"explicit blank editing excludes master content and includes a profile section only after an Add action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710911654,"status":"passed","title":"explicit blank editing excludes master content and includes a profile section only after an Add action"},{"ancestorTitles":[],"duration":840,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a blank CV can deliberately add an additional Career Profile section","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793710912589,"status":"passed","title":"a blank CV can deliberately add an additional Career Profile section"},{"ancestorTitles":[],"duration":1875,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a historical restore response from the previous document cannot change the newly opened CV","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710913429,"status":"passed","title":"a historical restore response from the previous document cannot change the newly opened CV"},{"ancestorTitles":[],"duration":502,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"content sections follow the editing-region heading without mutating CV settings","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710915304,"status":"passed","title":"content sections follow the editing-region heading without mutating CV settings"},{"ancestorTitles":[],"duration":679,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"settings history explains current Career Profile resolution without writing data","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793710915806,"status":"passed","title":"settings history explains current Career Profile resolution without writing data"},{"ancestorTitles":[],"duration":2322,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710916485,"status":"passed","title":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable"},{"ancestorTitles":[],"duration":1599,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits during a held PDF response prevent an older document download","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710918807,"status":"passed","title":"edits during a held PDF response prevent an older document download"},{"ancestorTitles":[],"duration":1006,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"moving a section to the first position announces its actual order and focuses its row","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793710920407,"status":"passed","title":"moving a section to the first position announces its actual order and focuses its row"},{"ancestorTitles":[],"duration":4512,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section navigation opens and focuses omitted/custom sections without changing their data","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793710921413,"status":"passed","title":"section navigation opens and focuses omitted/custom sections without changing their data"},{"ancestorTitles":[],"duration":1451,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard move controls retain focus and persist the same section order shown by navigation","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710925926,"status":"passed","title":"keyboard move controls retain focus and persist the same section order shown by navigation"},{"ancestorTitles":[],"duration":1603,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"secondary duplicate action saves the current draft before creating the copy","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710927377,"status":"passed","title":"secondary duplicate action saves the current draft before creating the copy"},{"ancestorTitles":[],"duration":647,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"pane navigation focuses the existing preview without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710928981,"status":"passed","title":"pane navigation focuses the existing preview without changing the pending draft"},{"ancestorTitles":[],"duration":456,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"deep link loads the exact variant named in the route","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793710929628,"status":"passed","title":"deep link loads the exact variant named in the route"},{"ancestorTitles":[],"duration":40,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a variant that does not exist shows a safe error instead of an empty editor","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793710930084,"status":"passed","title":"a variant that does not exist shows a safe error instead of an empty editor"},{"ancestorTitles":[],"duration":42,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"another user's variant is refused by the server and never rendered","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710930124,"status":"passed","title":"another user's variant is refused by the server and never rendered"},{"ancestorTitles":[],"duration":35,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a denied CV read has localized permission context without a write or retry","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710930166,"status":"passed","title":"a denied CV read has localized permission context without a write or retry"},{"ancestorTitles":[],"duration":236,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a temporary CV opening failure retries reads and restores focus to the editor without saving","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710930201,"status":"passed","title":"a temporary CV opening failure retries reads and restores focus to the editor without saving"},{"ancestorTitles":[],"duration":1149,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål history localizes known sources while preserving unknown metadata and versions","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710930437,"status":"passed","title":"Bokmål history localizes known sources while preserving unknown metadata and versions"},{"ancestorTitles":[],"duration":924,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"invalid names are explained and are not silently autosaved","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710931587,"status":"passed","title":"invalid names are explained and are not silently autosaved"},{"ancestorTitles":[],"duration":1653,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed autosave is visible and can be retried with the latest data","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710932511,"status":"passed","title":"failed autosave is visible and can be retried with the latest data"},{"ancestorTitles":[],"duration":1672,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"session undo and redo restore content edits before autosave","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710934164,"status":"passed","title":"session undo and redo restore content edits before autosave"},{"ancestorTitles":[],"duration":1900,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"queued saves use acknowledged server versions without replacing newer local editing state","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710935836,"status":"passed","title":"queued saves use acknowledged server versions without replacing newer local editing state"},{"ancestorTitles":[],"duration":3315,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"revision conflict retains the draft and blocks later autosaves until explicit reload","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793710937736,"status":"passed","title":"revision conflict retains the draft and blocks later autosaves until explicit reload"},{"ancestorTitles":[],"duration":2182,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits made while a confirmed reload is in flight remain recoverable","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793710941051,"status":"passed","title":"edits made while a confirmed reload is in flight remain recoverable"},{"ancestorTitles":[],"duration":2593,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring history uses the current version and never replaces edits made during the request","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710943233,"status":"passed","title":"restoring history uses the current version and never replaces edits made during the request"},{"ancestorTitles":[],"duration":1487,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Content is the primary studio panel and all advanced tabs retain their controls","invocations":1,"location":null,"numPassingAsserts":14,"retryReasons":[],"startAt":1793710945826,"status":"passed","title":"Content is the primary studio panel and all advanced tabs retain their controls"},{"ancestorTitles":[],"duration":2237,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"choosing a template restores its own structure instead of inheriting the previous template layout","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710947314,"status":"passed","title":"choosing a template restores its own structure instead of inheriting the previous template layout"},{"ancestorTitles":[],"duration":1438,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editor sections, design controls and document settings render in Bokmål","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793710949551,"status":"passed","title":"editor sections, design controls and document settings render in Bokmål"},{"ancestorTitles":[],"duration":1878,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"internal navigation warns and can be cancelled before discarding a pending edit","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710950989,"status":"passed","title":"internal navigation warns and can be cancelled before discarding a pending edit"},{"ancestorTitles":[],"duration":11467,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"custom entries can be added, edited, reordered and deleted with confirmation","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"startAt":1793710952867,"status":"passed","title":"custom entries can be added, edited, reordered and deleted with confirmation"},{"ancestorTitles":[],"duration":3674,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793710964334,"status":"passed","title":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV"},{"ancestorTitles":[],"duration":5296,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793710968008,"status":"passed","title":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo"},{"ancestorTitles":[],"duration":3665,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710973304,"status":"passed","title":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save"},{"ancestorTitles":[],"duration":2484,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710976969,"status":"passed","title":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation"},{"ancestorTitles":[],"duration":7145,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile-backed sections expand, reorder, hide and persist variant-only overrides","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793710979454,"status":"passed","title":"profile-backed sections expand, reorder, hide and persist variant-only overrides"},{"ancestorTitles":[],"duration":2174,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"focusing a preview retry control keeps its pointer target stationary","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793710986599,"status":"passed","title":"focusing a preview retry control keeps its pointer target stationary"},{"ancestorTitles":[],"duration":1862,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"preview failure is visible and retryable without leaving the editor","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793710988773,"status":"passed","title":"preview failure is visible and retryable without leaving the editor"},{"ancestorTitles":[],"duration":827,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793710990635,"status":"passed","title":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears"},{"ancestorTitles":[],"duration":1010,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793710991462,"status":"passed","title":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled"},{"ancestorTitles":[],"duration":3692,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793710992472,"status":"passed","title":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document"},{"ancestorTitles":[],"duration":1120,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793710996164,"status":"passed","title":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft"},{"ancestorTitles":[],"duration":2241,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793710997284,"status":"passed","title":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":1479,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793710999526,"status":"passed","title":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":1930,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711001006,"status":"passed","title":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied"},{"ancestorTitles":[],"duration":1831,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711002936,"status":"passed","title":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied"},{"ancestorTitles":[],"duration":1830,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711004768,"status":"passed","title":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied"},{"ancestorTitles":[],"duration":6839,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793711006598,"status":"passed","title":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable"},{"ancestorTitles":[],"duration":3547,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"startAt":1793711013437,"status":"passed","title":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content"},{"ancestorTitles":[],"duration":4659,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"late document proposals cannot return after tab unmount or a source undo","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711016984,"status":"passed","title":"late document proposals cannot return after tab unmount or a source undo"},{"ancestorTitles":[],"duration":4166,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound section:skills assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711021644,"status":"passed","title":"bound section:skills assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":4534,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711025810,"status":"passed","title":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":4281,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711030345,"status":"passed","title":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":3107,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"user edits made during server acceptance are retained instead of overwritten by its late saved response","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793711034626,"status":"passed","title":"user edits made during server acceptance are retained instead of overwritten by its late saved response"}],"endTime":1793711037750,"message":" ● Strict Mode groups a typing burst into one undo step and preserves redo through autosave\n\n expect(element).toHaveValue()\n\n Expected the element to have value:\n\n Received:\n D\n\n 102 | await screen.findByText('Saved');\n 103 | fireEvent.click(screen.getByRole('button', { name: 'Undo' }));\n > 104 | expect(headline).toHaveValue('');\n | ^\n 105 | expect(screen.getByRole('button', { name: 'Undo' })).toBeDisabled();\n 106 | fireEvent.click(screen.getByRole('button', { name: 'Redo' }));\n 107 | expect(headline).toHaveValue('Developer');\n\n at Object.toHaveValue (src/cv-builder-deep-link.test.tsx:104:20)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx","startTime":1793710896501,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":12,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"English and Bokmål expose the same UI message keys","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711038368,"status":"passed","title":"English and Bokmål expose the same UI message keys"},{"ancestorTitles":[],"duration":7,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål preserves every English substitution variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711038380,"status":"passed","title":"Bokmål preserves every English substitution variable"},{"ancestorTitles":[],"duration":4,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"supported UI catalogues contain no blank messages","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711038387,"status":"passed","title":"supported UI catalogues contain no blank messages"}],"endTime":1793711038392,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\translation-catalogue.test.ts","startTime":1793711037822,"status":"passed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-career-tests.log b/docs/ui-modernisation/evidence/career/frontend/a3-career-tests.log
new file mode 100644
index 00000000..32460eca
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-career-tests.log
@@ -0,0 +1,300 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/career-workspace-page.test.tsx src/career-editor.test.tsx src/career-import-review.test.tsx src/cv-builder-page.test.tsx src/cv-builder-deep-link.test.tsx src/cv-document-controls.test.tsx src/cover-letter-document.test.tsx src/translation-catalogue.test.ts --json --outputFile=../docs/ui-modernisation/a3-career-tests.json
+
+FAIL src/cv-builder-deep-link.test.tsx (141.249 s)
+ ● Console
+
+ console.error
+ An update to CvBuilderEditor inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 657 |
+ 658 |
+ > 659 | setMobilePane("edit")} sx={{ display: compactEditor && mobilePane !== "edit" ? "none" : "block", top: "var(--cv-pane-top)", minWidth: 0, "@media (min-width:1001px)": { position: "sticky", maxHeight: "calc(100dvh - var(--cv-pane-top) - 12px)", overflowY: "auto" }, scrollbarWidth: "thin" }}>
+ | ^
+ 660 |
+ 661 | {t("cvEditorEditingRegion")}
+ 662 |
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at setMobilePane (src/views/CvBuilderEditor.tsx:659:139)
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19143:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:217:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:354:8)
+
+ console.error
+ An update to ContentTab inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 1178 | expanded={expandedSections.has(row.key)}
+ 1179 | onToggle={() => toggleSection(row.key)}
+ > 1180 | onSectionFocus={() => setActiveSection(row.key)}
+ | ^
+ 1181 | toggleRef={(button) => { sectionButtons.current[row.key] = button; }}
+ 1182 | onMove={(d) => reorderSections(i, i + d, true)}
+ 1183 | onPatch={(p) => patchSection(row.key, p)}
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at setActiveSection (src/views/CvBuilderEditor.tsx:1180:37)
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19143:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:217:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:354:8)
+
+ console.error
+ An update to ForwardRef(ButtonBase) inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 352 | await openContentTab();
+ 353 | const move = screen.getByRole('button', { name: 'Move Experience section down' });
+ > 354 | move.focus();
+ | ^
+ 355 | fireEvent.click(move);
+ 356 | expect(move).toHaveFocus();
+ 357 | fireEvent.mouseDown(screen.getByRole('combobox', { name: 'Go to section' }));
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at node_modules/@mui/material/ButtonBase/ButtonBase.js:174:7
+ at node_modules/@mui/utils/useEventCallback/useEventCallback.js:24:19
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19166:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:233:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:354:8)
+
+ console.error
+ An update to ForwardRef(ButtonBase) inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 448 | renderAt(3);
+ 449 | const retry = await screen.findByRole('button', { name: 'Retry' });
+ > 450 | retry.focus(); fireEvent.click(retry);
+ | ^
+ 451 | await screen.findByDisplayValue('Backend CV');
+ 452 | await waitFor(() => expect(screen.getByRole('region', { name: 'CV editing controls' })).toHaveFocus());
+ 453 | expect(attempt).toBe(2);
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at node_modules/@mui/material/ButtonBase/ButtonBase.js:174:7
+ at node_modules/@mui/utils/useEventCallback/useEventCallback.js:24:19
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19166:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:233:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:450:9)
+
+ console.error
+ An update to ContentTab inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 1178 | expanded={expandedSections.has(row.key)}
+ 1179 | onToggle={() => toggleSection(row.key)}
+ > 1180 | onSectionFocus={() => setActiveSection(row.key)}
+ | ^
+ 1181 | toggleRef={(button) => { sectionButtons.current[row.key] = button; }}
+ 1182 | onMove={(d) => reorderSections(i, i + d, true)}
+ 1183 | onPatch={(p) => patchSection(row.key, p)}
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at setActiveSection (src/views/CvBuilderEditor.tsx:1180:37)
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19143:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:217:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:757:15)
+
+ console.error
+ An update to ForwardRef(ButtonBase) inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 755 |
+ 756 | const deleteEntry = screen.getByRole('button', { name: 'Delete custom entry 1' });
+ > 757 | deleteEntry.focus();
+ | ^
+ 758 | fireEvent.click(deleteEntry);
+ 759 | let dialog = await screen.findByRole('dialog', { name: 'Delete custom entry' });
+ 760 | fireEvent.click(within(dialog).getByRole('button', { name: 'Cancel' }));
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at node_modules/@mui/material/ButtonBase/ButtonBase.js:174:7
+ at node_modules/@mui/utils/useEventCallback/useEventCallback.js:24:19
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19166:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:233:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:757:15)
+
+ ● Strict Mode groups a typing burst into one undo step and preserves redo through autosave
+
+ expect(element).toHaveValue()
+
+ Expected the element to have value:
+
+ Received:
+ D
+
+ 102 | await screen.findByText('Saved');
+ 103 | fireEvent.click(screen.getByRole('button', { name: 'Undo' }));
+ > 104 | expect(headline).toHaveValue('');
+ | ^
+ 105 | expect(screen.getByRole('button', { name: 'Undo' })).toBeDisabled();
+ 106 | fireEvent.click(screen.getByRole('button', { name: 'Redo' }));
+ 107 | expect(headline).toHaveValue('Developer');
+
+ at Object.toHaveValue (src/cv-builder-deep-link.test.tsx:104:20)
+
+
+Test Suites: 1 failed, 7 passed, 8 total
+Tests: 1 failed, 152 passed, 153 total
+Snapshots: 0 total
+Time: 333.607 s
+Ran all test suites within paths "src/career-workspace-page.test.tsx", "src/career-editor.test.tsx", "src/career-import-review.test.tsx", "src/cv-builder-page.test.tsx", "src/cv-builder-deep-link.test.tsx", "src/cv-document-controls.test.tsx", "src/cover-letter-document.test.tsx", "src/translation-catalogue.test.ts".
+Test results written to: ..\docs\ui-modernisation\a3-career-tests.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-library-tests.json b/docs/ui-modernisation/evidence/career/frontend/a3-cv-library-tests.json
new file mode 100644
index 00000000..67d96b30
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-library-tests.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":3,"numPassedTests":28,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":3,"numTotalTests":28,"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":1793711280466,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":292,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"en library identifies templates by their human label and retains an unknown legacy identifier","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711286939,"status":"passed","title":"en library identifies templates by their human label and retains an unknown legacy identifier"},{"ancestorTitles":[],"duration":100,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"nb library identifies templates by their human label and retains an unknown legacy identifier","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711287232,"status":"passed","title":"nb library identifies templates by their human label and retains an unknown legacy identifier"},{"ancestorTitles":[],"duration":469,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"blank creation explicitly excludes all profile sections and contact even after template selection","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711287332,"status":"passed","title":"blank creation explicitly excludes all profile sections and contact even after template selection"},{"ancestorTitles":[],"duration":573,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile creation includes only deliberately selected available sections and contact","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711287801,"status":"passed","title":"profile creation includes only deliberately selected available sections and contact"},{"ancestorTitles":[],"duration":486,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"unavailable profile sections block profile creation and allow an explicit blank fallback","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711288374,"status":"passed","title":"unavailable profile sections block profile creation and allow an explicit blank fallback"},{"ancestorTitles":[],"duration":2,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"export validation decodes structured and blob errors without relabelling unknown failures","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711288861,"status":"passed","title":"export validation decodes structured and blob errors without relabelling unknown failures"},{"ancestorTitles":[],"duration":80,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the CV library has a section heading and announces its held initial read without showing an empty result","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711288863,"status":"passed","title":"the CV library has a section heading and announces its held initial read without showing an empty result"},{"ancestorTitles":[],"duration":159,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed CV list read has an explicit retry that clears the stale failure after recovery","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793711288943,"status":"passed","title":"a failed CV list read has an explicit retry that clears the stale failure after recovery"},{"ancestorTitles":[],"duration":379,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a live language change retains an open CV name and template draft without refetching library data","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711289102,"status":"passed","title":"a live language change retains an open CV name and template draft without refetching library data"},{"ancestorTitles":[],"duration":638,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"held CV creation locks the draft and gallery, then keeps a failed draft for an explicit retry","invocations":1,"location":null,"numPassingAsserts":17,"retryReasons":[],"startAt":1793711289483,"status":"passed","title":"held CV creation locks the draft and gallery, then keeps a failed draft for an explicit retry"},{"ancestorTitles":[],"duration":264,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a locked CV template remains identifiable and cannot change the creation request","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711290121,"status":"passed","title":"a locked CV template remains identifiable and cannot change the creation request"},{"ancestorTitles":[],"duration":326,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held duplicate blocks another action for the same CV and shows the persisted refreshed copy","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793711290385,"status":"passed","title":"a held duplicate blocks another action for the same CV and shows the persisted refreshed copy"},{"ancestorTitles":[],"duration":530,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rename reads the current revision and preserves its settings when saving the new name","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711290712,"status":"passed","title":"rename reads the current revision and preserves its settings when saving the new name"},{"ancestorTitles":[],"duration":501,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rename conflict keeps the original library entry and never retries the write automatically","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711291242,"status":"passed","title":"a rename conflict keeps the original library entry and never retries the write automatically"},{"ancestorTitles":[],"duration":544,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cancelling deletion returns focus to the surviving CV action control without removing the CV","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711291743,"status":"passed","title":"cancelling deletion returns focus to the surviving CV action control without removing the CV"},{"ancestorTitles":[],"duration":904,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed creation keeps its draft and translates its failure after closing and reopening in another language","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793711292288,"status":"passed","title":"a failed creation keeps its draft and translates its failure after closing and reopening in another language"},{"ancestorTitles":[],"duration":411,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"generic PDF failure follows the current language both after failure and when a held request fails","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793711293192,"status":"passed","title":"generic PDF failure follows the current language both after failure and when a held request fails"},{"ancestorTitles":[],"duration":573,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held deletion preserves focus moved to another surviving control before the response arrives","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711293603,"status":"passed","title":"a held deletion preserves focus moved to another surviving control before the response arrives"},{"ancestorTitles":[],"duration":218,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF status 503 shows an actionable message without retrying","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711294176,"status":"passed","title":"PDF status 503 shows an actionable message without retrying"},{"ancestorTitles":[],"duration":184,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF status 504 shows an actionable message without retrying","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711294394,"status":"passed","title":"PDF status 504 shows an actionable message without retrying"},{"ancestorTitles":[],"duration":59,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"lists existing CVs from the variants API","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711294578,"status":"passed","title":"lists existing CVs from the variants API"},{"ancestorTitles":[],"duration":300,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"shows the empty state and creates a CV then navigates to the editor","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711294637,"status":"passed","title":"shows the empty state and creates a CV then navigates to the editor"},{"ancestorTitles":[],"duration":163,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"CV dashboard and create flow render in Bokmål","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711294938,"status":"passed","title":"CV dashboard and create flow render in Bokmål"},{"ancestorTitles":[],"duration":745,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"CV deletion requires confirmation and supports cancellation","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711295101,"status":"passed","title":"CV deletion requires confirmation and supports cancellation"}],"endTime":1793711295848,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-page.test.tsx","startTime":1793711282102,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":147,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P7-11 templates] known metadata follows locale while custom metadata and selection objects stay verbatim","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711297437,"status":"passed","title":"[P7-11 templates] known metadata follows locale while custom metadata and selection objects stay verbatim"}],"endTime":1793711297585,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-template-gallery.test.tsx","startTime":1793711295872,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":[],"duration":12,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"English and Bokmål expose the same UI message keys","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711298078,"status":"passed","title":"English and Bokmål expose the same UI message keys"},{"ancestorTitles":[],"duration":7,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål preserves every English substitution variable","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711298091,"status":"passed","title":"Bokmål preserves every English substitution variable"},{"ancestorTitles":[],"duration":3,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"supported UI catalogues contain no blank messages","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711298098,"status":"passed","title":"supported UI catalogues contain no blank messages"}],"endTime":1793711298102,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\translation-catalogue.test.ts","startTime":1793711297602,"status":"passed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-library-tests.log b/docs/ui-modernisation/evidence/career/frontend/a3-cv-library-tests.log
new file mode 100644
index 00000000..0585ecc7
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-library-tests.log
@@ -0,0 +1,11 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/cv-builder-page.test.tsx src/cv-template-gallery.test.tsx src/translation-catalogue.test.ts --json --outputFile=../docs/ui-modernisation/a3-cv-library-tests.json
+
+
+Test Suites: 3 passed, 3 total
+Tests: 28 passed, 28 total
+Snapshots: 0 total
+Time: 17.642 s
+Ran all test suites within paths "src/cv-builder-page.test.tsx", "src/cv-template-gallery.test.tsx", "src/translation-catalogue.test.ts".
+Test results written to: ..\docs\ui-modernisation\a3-cv-library-tests.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-studio-tests.json b/docs/ui-modernisation/evidence/career/frontend/a3-cv-studio-tests.json
new file mode 100644
index 00000000..d7a4e827
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-studio-tests.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":1,"numPassedTests":59,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":59,"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":1793711227422,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":3065,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711233559,"status":"passed","title":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave"},{"ancestorTitles":[],"duration":1581,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a pause between typing bursts leaves a separate undo step","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711236625,"status":"passed","title":"a pause between typing bursts leaves a separate undo step"},{"ancestorTitles":[],"duration":547,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tablet width keeps both editing and preview available in the stacked document flow","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711238206,"status":"passed","title":"tablet width keeps both editing and preview available in the stacked document flow"},{"ancestorTitles":[],"duration":1713,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711238753,"status":"passed","title":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo"},{"ancestorTitles":[],"duration":984,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a revision conflict disables document history without silently writing an undo","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711240466,"status":"passed","title":"a revision conflict disables document history without silently writing an undo"},{"ancestorTitles":[],"duration":1387,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"switching documents hides the previous draft while loading and starts fresh history","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711241450,"status":"passed","title":"switching documents hides the previous draft while loading and starts fresh history"},{"ancestorTitles":[],"duration":833,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"explicit blank editing excludes master content and includes a profile section only after an Add action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711242837,"status":"passed","title":"explicit blank editing excludes master content and includes a profile section only after an Add action"},{"ancestorTitles":[],"duration":666,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a blank CV can deliberately add an additional Career Profile section","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711243670,"status":"passed","title":"a blank CV can deliberately add an additional Career Profile section"},{"ancestorTitles":[],"duration":1969,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a historical restore response from the previous document cannot change the newly opened CV","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711244337,"status":"passed","title":"a historical restore response from the previous document cannot change the newly opened CV"},{"ancestorTitles":[],"duration":293,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"content sections follow the editing-region heading without mutating CV settings","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711246306,"status":"passed","title":"content sections follow the editing-region heading without mutating CV settings"},{"ancestorTitles":[],"duration":750,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"settings history explains current Career Profile resolution without writing data","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711246599,"status":"passed","title":"settings history explains current Career Profile resolution without writing data"},{"ancestorTitles":[],"duration":1683,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711247349,"status":"passed","title":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable"},{"ancestorTitles":[],"duration":1469,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits during a held PDF response prevent an older document download","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711249032,"status":"passed","title":"edits during a held PDF response prevent an older document download"},{"ancestorTitles":[],"duration":967,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"moving a section to the first position announces its actual order and focuses its row","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711250501,"status":"passed","title":"moving a section to the first position announces its actual order and focuses its row"},{"ancestorTitles":[],"duration":5764,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section navigation opens and focuses omitted/custom sections without changing their data","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793711251469,"status":"passed","title":"section navigation opens and focuses omitted/custom sections without changing their data"},{"ancestorTitles":[],"duration":1944,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard move controls retain focus and persist the same section order shown by navigation","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711257233,"status":"passed","title":"keyboard move controls retain focus and persist the same section order shown by navigation"},{"ancestorTitles":[],"duration":2002,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"secondary duplicate action saves the current draft before creating the copy","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711259177,"status":"passed","title":"secondary duplicate action saves the current draft before creating the copy"},{"ancestorTitles":[],"duration":1535,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"pane navigation focuses the existing preview without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711261179,"status":"passed","title":"pane navigation focuses the existing preview without changing the pending draft"},{"ancestorTitles":[],"duration":631,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"deep link loads the exact variant named in the route","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711262714,"status":"passed","title":"deep link loads the exact variant named in the route"},{"ancestorTitles":[],"duration":28,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a variant that does not exist shows a safe error instead of an empty editor","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711263345,"status":"passed","title":"a variant that does not exist shows a safe error instead of an empty editor"},{"ancestorTitles":[],"duration":58,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"another user's variant is refused by the server and never rendered","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711263374,"status":"passed","title":"another user's variant is refused by the server and never rendered"},{"ancestorTitles":[],"duration":62,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a denied CV read has localized permission context without a write or retry","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711263432,"status":"passed","title":"a denied CV read has localized permission context without a write or retry"},{"ancestorTitles":[],"duration":739,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a temporary CV opening failure retries reads and restores focus to the editor without saving","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711263494,"status":"passed","title":"a temporary CV opening failure retries reads and restores focus to the editor without saving"},{"ancestorTitles":[],"duration":1246,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål history localizes known sources while preserving unknown metadata and versions","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793711264233,"status":"passed","title":"Bokmål history localizes known sources while preserving unknown metadata and versions"},{"ancestorTitles":[],"duration":952,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"invalid names are explained and are not silently autosaved","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711265479,"status":"passed","title":"invalid names are explained and are not silently autosaved"},{"ancestorTitles":[],"duration":2201,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed autosave is visible and can be retried with the latest data","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711266431,"status":"passed","title":"failed autosave is visible and can be retried with the latest data"},{"ancestorTitles":[],"duration":2433,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"session undo and redo restore content edits before autosave","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711268633,"status":"passed","title":"session undo and redo restore content edits before autosave"},{"ancestorTitles":[],"duration":2108,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"queued saves use acknowledged server versions without replacing newer local editing state","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711271066,"status":"passed","title":"queued saves use acknowledged server versions without replacing newer local editing state"},{"ancestorTitles":[],"duration":4109,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"revision conflict retains the draft and blocks later autosaves until explicit reload","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"startAt":1793711273174,"status":"passed","title":"revision conflict retains the draft and blocks later autosaves until explicit reload"},{"ancestorTitles":[],"duration":3007,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits made while a confirmed reload is in flight remain recoverable","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711277283,"status":"passed","title":"edits made while a confirmed reload is in flight remain recoverable"},{"ancestorTitles":[],"duration":3154,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring history uses the current version and never replaces edits made during the request","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711280291,"status":"passed","title":"restoring history uses the current version and never replaces edits made during the request"},{"ancestorTitles":[],"duration":2191,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Content is the primary studio panel and all advanced tabs retain their controls","invocations":1,"location":null,"numPassingAsserts":14,"retryReasons":[],"startAt":1793711283445,"status":"passed","title":"Content is the primary studio panel and all advanced tabs retain their controls"},{"ancestorTitles":[],"duration":3092,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"choosing a template restores its own structure instead of inheriting the previous template layout","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711285636,"status":"passed","title":"choosing a template restores its own structure instead of inheriting the previous template layout"},{"ancestorTitles":[],"duration":2127,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editor sections, design controls and document settings render in Bokmål","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711288728,"status":"passed","title":"editor sections, design controls and document settings render in Bokmål"},{"ancestorTitles":[],"duration":2473,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"internal navigation warns and can be cancelled before discarding a pending edit","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711290855,"status":"passed","title":"internal navigation warns and can be cancelled before discarding a pending edit"},{"ancestorTitles":[],"duration":12159,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"custom entries can be added, edited, reordered and deleted with confirmation","invocations":1,"location":null,"numPassingAsserts":16,"retryReasons":[],"startAt":1793711293328,"status":"passed","title":"custom entries can be added, edited, reordered and deleted with confirmation"},{"ancestorTitles":[],"duration":3975,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"startAt":1793711305487,"status":"passed","title":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV"},{"ancestorTitles":[],"duration":5165,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793711309462,"status":"passed","title":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo"},{"ancestorTitles":[],"duration":3677,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711314627,"status":"passed","title":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save"},{"ancestorTitles":[],"duration":2387,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711318304,"status":"passed","title":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation"},{"ancestorTitles":[],"duration":6666,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile-backed sections expand, reorder, hide and persist variant-only overrides","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711320691,"status":"passed","title":"profile-backed sections expand, reorder, hide and persist variant-only overrides"},{"ancestorTitles":[],"duration":1991,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"focusing a preview retry control keeps its pointer target stationary","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711327357,"status":"passed","title":"focusing a preview retry control keeps its pointer target stationary"},{"ancestorTitles":[],"duration":1952,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"preview failure is visible and retryable without leaving the editor","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711329348,"status":"passed","title":"preview failure is visible and retryable without leaving the editor"},{"ancestorTitles":[],"duration":860,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711331300,"status":"passed","title":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears"},{"ancestorTitles":[],"duration":1107,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711332160,"status":"passed","title":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled"},{"ancestorTitles":[],"duration":3692,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793711333267,"status":"passed","title":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document"},{"ancestorTitles":[],"duration":1174,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711336959,"status":"passed","title":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft"},{"ancestorTitles":[],"duration":2334,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":12,"retryReasons":[],"startAt":1793711338133,"status":"passed","title":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":2052,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793711340467,"status":"passed","title":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":1978,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711342519,"status":"passed","title":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied"},{"ancestorTitles":[],"duration":2082,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711344497,"status":"passed","title":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied"},{"ancestorTitles":[],"duration":2340,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"startAt":1793711346579,"status":"passed","title":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied"},{"ancestorTitles":[],"duration":7007,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable","invocations":1,"location":null,"numPassingAsserts":11,"retryReasons":[],"startAt":1793711348919,"status":"passed","title":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable"},{"ancestorTitles":[],"duration":3942,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content","invocations":1,"location":null,"numPassingAsserts":13,"retryReasons":[],"startAt":1793711355926,"status":"passed","title":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content"},{"ancestorTitles":[],"duration":5125,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"late document proposals cannot return after tab unmount or a source undo","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711359868,"status":"passed","title":"late document proposals cannot return after tab unmount or a source undo"},{"ancestorTitles":[],"duration":4729,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound section:skills assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711364993,"status":"passed","title":"bound section:skills assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":4844,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711369722,"status":"passed","title":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":4203,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711374566,"status":"passed","title":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":3063,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"user edits made during server acceptance are retained instead of overwritten by its late saved response","invocations":1,"location":null,"numPassingAsserts":9,"retryReasons":[],"startAt":1793711378769,"status":"passed","title":"user edits made during server acceptance are retained instead of overwritten by its late saved response"}],"endTime":1793711381835,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx","startTime":1793711228891,"status":"passed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-studio-tests.log b/docs/ui-modernisation/evidence/career/frontend/a3-cv-studio-tests.log
new file mode 100644
index 00000000..9243f4ad
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-studio-tests.log
@@ -0,0 +1,277 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/cv-builder-deep-link.test.tsx --json --outputFile=../docs/ui-modernisation/a3-cv-studio-tests.json
+
+ console.error
+ An update to CvBuilderEditor inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 657 |
+ 658 |
+ > 659 | setMobilePane("edit")} sx={{ display: compactEditor && mobilePane !== "edit" ? "none" : "block", top: "var(--cv-pane-top)", minWidth: 0, "@media (min-width:1001px)": { position: "sticky", maxHeight: "calc(100dvh - var(--cv-pane-top) - 12px)", overflowY: "auto" }, scrollbarWidth: "thin" }}>
+ | ^
+ 660 |
+ 661 | {t("cvEditorEditingRegion")}
+ 662 |
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at setMobilePane (src/views/CvBuilderEditor.tsx:659:139)
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19143:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:217:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:379:8)
+
+ console.error
+ An update to ContentTab inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 1178 | expanded={expandedSections.has(row.key)}
+ 1179 | onToggle={() => toggleSection(row.key)}
+ > 1180 | onSectionFocus={() => setActiveSection(row.key)}
+ | ^
+ 1181 | toggleRef={(button) => { sectionButtons.current[row.key] = button; }}
+ 1182 | onMove={(d) => reorderSections(i, i + d, true)}
+ 1183 | onPatch={(p) => patchSection(row.key, p)}
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at setActiveSection (src/views/CvBuilderEditor.tsx:1180:37)
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19143:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:217:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:379:8)
+
+ console.error
+ An update to ForwardRef(ButtonBase) inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 377 | await openContentTab();
+ 378 | const move = screen.getByRole('button', { name: 'Move Experience section down' });
+ > 379 | move.focus();
+ | ^
+ 380 | fireEvent.click(move);
+ 381 | expect(move).toHaveFocus();
+ 382 | fireEvent.mouseDown(screen.getByRole('combobox', { name: 'Go to section' }));
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at node_modules/@mui/material/ButtonBase/ButtonBase.js:174:7
+ at node_modules/@mui/utils/useEventCallback/useEventCallback.js:24:19
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19166:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:233:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:379:8)
+
+ console.error
+ An update to ForwardRef(ButtonBase) inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 473 | renderAt(3);
+ 474 | const retry = await screen.findByRole('button', { name: 'Retry' });
+ > 475 | retry.focus(); fireEvent.click(retry);
+ | ^
+ 476 | await screen.findByDisplayValue('Backend CV');
+ 477 | await waitFor(() => expect(screen.getByRole('region', { name: 'CV editing controls' })).toHaveFocus());
+ 478 | expect(attempt).toBe(2);
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at node_modules/@mui/material/ButtonBase/ButtonBase.js:174:7
+ at node_modules/@mui/utils/useEventCallback/useEventCallback.js:24:19
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19166:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:233:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:475:9)
+
+ console.error
+ An update to ContentTab inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 1178 | expanded={expandedSections.has(row.key)}
+ 1179 | onToggle={() => toggleSection(row.key)}
+ > 1180 | onSectionFocus={() => setActiveSection(row.key)}
+ | ^
+ 1181 | toggleRef={(button) => { sectionButtons.current[row.key] = button; }}
+ 1182 | onMove={(d) => reorderSections(i, i + d, true)}
+ 1183 | onPatch={(p) => patchSection(row.key, p)}
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at setActiveSection (src/views/CvBuilderEditor.tsx:1180:37)
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19143:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:217:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:782:15)
+
+ console.error
+ An update to ForwardRef(ButtonBase) inside a test was not wrapped in act(...).
+
+ When testing, code that causes React state updates should be wrapped into act(...):
+
+ act(() => {
+ /* fire events that update state */
+ });
+ /* assert on the output */
+
+ This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
+
+ 780 |
+ 781 | const deleteEntry = screen.getByRole('button', { name: 'Delete custom entry 1' });
+ > 782 | deleteEntry.focus();
+ | ^
+ 783 | fireEvent.click(deleteEntry);
+ 784 | let dialog = await screen.findByRole('dialog', { name: 'Delete custom entry' });
+ 785 | fireEvent.click(within(dialog).getByRole('button', { name: 'Cancel' }));
+
+ at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
+ at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
+ at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
+ at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
+ at node_modules/@mui/material/ButtonBase/ButtonBase.js:174:7
+ at node_modules/@mui/utils/useEventCallback/useEventCallback.js:24:19
+ at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
+ at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
+ at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19166:19)
+ at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
+ at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
+ at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
+ at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
+ at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
+ at HTMLDivElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
+ at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
+ at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
+ at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:233:9)
+ at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
+ at HTMLButtonElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:72:14)
+ at HTMLButtonElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
+ at Object.focus (src/cv-builder-deep-link.test.tsx:782:15)
+
+Test Suites: 1 passed, 1 total
+Tests: 59 passed, 59 total
+Snapshots: 0 total
+Time: 154.42 s
+Ran all test suites within paths "src/cv-builder-deep-link.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-cv-studio-tests.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-green.json b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-green.json
new file mode 100644
index 00000000..b48a3456
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-green.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":1,"numPassedTests":1,"numPendingTestSuites":0,"numPendingTests":57,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":58,"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":1793710584375,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710589575,"status":"pending","title":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave"},{"ancestorTitles":[],"duration":1050,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tablet width keeps both editing and preview available in the stacked document flow","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793710589575,"status":"passed","title":"tablet width keeps both editing and preview available in the stacked document flow"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a revision conflict disables document history without silently writing an undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"a revision conflict disables document history without silently writing an undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"switching documents hides the previous draft while loading and starts fresh history","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"switching documents hides the previous draft while loading and starts fresh history"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"explicit blank editing excludes master content and includes a profile section only after an Add action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"explicit blank editing excludes master content and includes a profile section only after an Add action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a blank CV can deliberately add an additional Career Profile section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"a blank CV can deliberately add an additional Career Profile section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a historical restore response from the previous document cannot change the newly opened CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"a historical restore response from the previous document cannot change the newly opened CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"content sections follow the editing-region heading without mutating CV settings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"content sections follow the editing-region heading without mutating CV settings"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"settings history explains current Career Profile resolution without writing data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"settings history explains current Career Profile resolution without writing data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits during a held PDF response prevent an older document download","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"edits during a held PDF response prevent an older document download"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"moving a section to the first position announces its actual order and focuses its row","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"moving a section to the first position announces its actual order and focuses its row"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section navigation opens and focuses omitted/custom sections without changing their data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"section navigation opens and focuses omitted/custom sections without changing their data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard move controls retain focus and persist the same section order shown by navigation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"keyboard move controls retain focus and persist the same section order shown by navigation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"secondary duplicate action saves the current draft before creating the copy","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"secondary duplicate action saves the current draft before creating the copy"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"pane navigation focuses the existing preview without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"pane navigation focuses the existing preview without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"deep link loads the exact variant named in the route","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"deep link loads the exact variant named in the route"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a variant that does not exist shows a safe error instead of an empty editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"a variant that does not exist shows a safe error instead of an empty editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"another user's variant is refused by the server and never rendered","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"another user's variant is refused by the server and never rendered"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a denied CV read has localized permission context without a write or retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"a denied CV read has localized permission context without a write or retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a temporary CV opening failure retries reads and restores focus to the editor without saving","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"a temporary CV opening failure retries reads and restores focus to the editor without saving"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål history localizes known sources while preserving unknown metadata and versions","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"Bokmål history localizes known sources while preserving unknown metadata and versions"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"invalid names are explained and are not silently autosaved","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"invalid names are explained and are not silently autosaved"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed autosave is visible and can be retried with the latest data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"failed autosave is visible and can be retried with the latest data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"session undo and redo restore content edits before autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"session undo and redo restore content edits before autosave"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"queued saves use acknowledged server versions without replacing newer local editing state","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"queued saves use acknowledged server versions without replacing newer local editing state"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"revision conflict retains the draft and blocks later autosaves until explicit reload","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590626,"status":"pending","title":"revision conflict retains the draft and blocks later autosaves until explicit reload"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits made while a confirmed reload is in flight remain recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"edits made while a confirmed reload is in flight remain recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring history uses the current version and never replaces edits made during the request","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"restoring history uses the current version and never replaces edits made during the request"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Content is the primary studio panel and all advanced tabs retain their controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"Content is the primary studio panel and all advanced tabs retain their controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"choosing a template restores its own structure instead of inheriting the previous template layout","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"choosing a template restores its own structure instead of inheriting the previous template layout"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editor sections, design controls and document settings render in Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"editor sections, design controls and document settings render in Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"internal navigation warns and can be cancelled before discarding a pending edit","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"internal navigation warns and can be cancelled before discarding a pending edit"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"custom entries can be added, edited, reordered and deleted with confirmation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"custom entries can be added, edited, reordered and deleted with confirmation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile-backed sections expand, reorder, hide and persist variant-only overrides","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"profile-backed sections expand, reorder, hide and persist variant-only overrides"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"focusing a preview retry control keeps its pointer target stationary","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"focusing a preview retry control keeps its pointer target stationary"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"preview failure is visible and retryable without leaving the editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"preview failure is visible and retryable without leaving the editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"late document proposals cannot return after tab unmount or a source undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"late document proposals cannot return after tab unmount or a source undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound section:skills assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"bound section:skills assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"user edits made during server acceptance are retained instead of overwritten by its late saved response","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710590627,"status":"pending","title":"user edits made during server acceptance are retained instead of overwritten by its late saved response"}],"endTime":1793710590629,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx","startTime":1793710585784,"status":"focused","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-green.log b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-green.log
new file mode 100644
index 00000000..b8a43851
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-green.log
@@ -0,0 +1,10 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/cv-builder-deep-link.test.tsx --testNamePattern=tablet width keeps both --json --outputFile=../docs/ui-modernisation/a3-cv-tablet-behavior-green.json
+
+Test Suites: 1 passed, 1 total
+Tests: 57 skipped, 1 passed, 58 total
+Snapshots: 0 total
+Time: 6.26 s, estimated 7 s
+Ran all test suites within paths "src/cv-builder-deep-link.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-cv-tablet-behavior-green.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-red.json b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-red.json
new file mode 100644
index 00000000..6153033f
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-red.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":0,"numPassedTests":0,"numPendingTestSuites":0,"numPendingTests":57,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":58,"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":1793710502355,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710508748,"status":"pending","title":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave"},{"ancestorTitles":[],"duration":1247,"failing":false,"failureDetails":[{"matcherResult":{"pass":true,"message":"expect(element).not.toBeInTheDocument()\n\nexpected document not to contain element, found instead"}}],"failureMessages":["Error: expect(element).not.toBeInTheDocument()\n\nexpected document not to contain element, found instead\n at Object.toBeInTheDocument (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx:120:64)"],"fullName":"tablet width keeps both editing and preview available in the stacked document flow","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710508748,"status":"failed","title":"tablet width keeps both editing and preview available in the stacked document flow"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a revision conflict disables document history without silently writing an undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"a revision conflict disables document history without silently writing an undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"switching documents hides the previous draft while loading and starts fresh history","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"switching documents hides the previous draft while loading and starts fresh history"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"explicit blank editing excludes master content and includes a profile section only after an Add action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"explicit blank editing excludes master content and includes a profile section only after an Add action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a blank CV can deliberately add an additional Career Profile section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"a blank CV can deliberately add an additional Career Profile section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a historical restore response from the previous document cannot change the newly opened CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"a historical restore response from the previous document cannot change the newly opened CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"content sections follow the editing-region heading without mutating CV settings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"content sections follow the editing-region heading without mutating CV settings"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"settings history explains current Career Profile resolution without writing data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"settings history explains current Career Profile resolution without writing data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits during a held PDF response prevent an older document download","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"edits during a held PDF response prevent an older document download"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"moving a section to the first position announces its actual order and focuses its row","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"moving a section to the first position announces its actual order and focuses its row"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section navigation opens and focuses omitted/custom sections without changing their data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"section navigation opens and focuses omitted/custom sections without changing their data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard move controls retain focus and persist the same section order shown by navigation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"keyboard move controls retain focus and persist the same section order shown by navigation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"secondary duplicate action saves the current draft before creating the copy","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"secondary duplicate action saves the current draft before creating the copy"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"pane navigation focuses the existing preview without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"pane navigation focuses the existing preview without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"deep link loads the exact variant named in the route","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"deep link loads the exact variant named in the route"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a variant that does not exist shows a safe error instead of an empty editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"a variant that does not exist shows a safe error instead of an empty editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"another user's variant is refused by the server and never rendered","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"another user's variant is refused by the server and never rendered"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a denied CV read has localized permission context without a write or retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"a denied CV read has localized permission context without a write or retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a temporary CV opening failure retries reads and restores focus to the editor without saving","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"a temporary CV opening failure retries reads and restores focus to the editor without saving"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål history localizes known sources while preserving unknown metadata and versions","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"Bokmål history localizes known sources while preserving unknown metadata and versions"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"invalid names are explained and are not silently autosaved","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"invalid names are explained and are not silently autosaved"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed autosave is visible and can be retried with the latest data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510030,"status":"pending","title":"failed autosave is visible and can be retried with the latest data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"session undo and redo restore content edits before autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"session undo and redo restore content edits before autosave"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"queued saves use acknowledged server versions without replacing newer local editing state","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"queued saves use acknowledged server versions without replacing newer local editing state"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"revision conflict retains the draft and blocks later autosaves until explicit reload","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"revision conflict retains the draft and blocks later autosaves until explicit reload"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits made while a confirmed reload is in flight remain recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"edits made while a confirmed reload is in flight remain recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring history uses the current version and never replaces edits made during the request","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"restoring history uses the current version and never replaces edits made during the request"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Content is the primary studio panel and all advanced tabs retain their controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"Content is the primary studio panel and all advanced tabs retain their controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"choosing a template restores its own structure instead of inheriting the previous template layout","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"choosing a template restores its own structure instead of inheriting the previous template layout"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editor sections, design controls and document settings render in Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"editor sections, design controls and document settings render in Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"internal navigation warns and can be cancelled before discarding a pending edit","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"internal navigation warns and can be cancelled before discarding a pending edit"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"custom entries can be added, edited, reordered and deleted with confirmation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"custom entries can be added, edited, reordered and deleted with confirmation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile-backed sections expand, reorder, hide and persist variant-only overrides","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"profile-backed sections expand, reorder, hide and persist variant-only overrides"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"focusing a preview retry control keeps its pointer target stationary","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"focusing a preview retry control keeps its pointer target stationary"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"preview failure is visible and retryable without leaving the editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"preview failure is visible and retryable without leaving the editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"late document proposals cannot return after tab unmount or a source undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"late document proposals cannot return after tab unmount or a source undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound section:skills assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"bound section:skills assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"user edits made during server acceptance are retained instead of overwritten by its late saved response","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710510031,"status":"pending","title":"user edits made during server acceptance are retained instead of overwritten by its late saved response"}],"endTime":1793710510047,"message":" ● tablet width keeps both editing and preview available in the stacked document flow\n\n expect(element).not.toBeInTheDocument()\n\n expected document not to contain element, found instead\n\n 118 | renderAt(3);\n 119 | await openContentTab();\n > 120 | expect(screen.queryByRole('button', { name: 'Edit' })).not.toBeInTheDocument();\n | ^\n 121 | expect(screen.getByRole('region', { name: 'CV editing controls' })).toBeVisible();\n 122 | expect(screen.getByRole('region', { name: 'Live preview' })).toBeVisible();\n 123 | expect(mockedApi.put).not.toHaveBeenCalled();\n\n at Object.toBeInTheDocument (src/cv-builder-deep-link.test.tsx:120:64)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx","startTime":1793710503783,"status":"failed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-red.log b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-red.log
new file mode 100644
index 00000000..761a7949
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-behavior-red.log
@@ -0,0 +1,27 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/cv-builder-deep-link.test.tsx --testNamePattern=tablet width keeps both --json --outputFile=../docs/ui-modernisation/a3-cv-tablet-behavior-red.json
+
+FAIL src/cv-builder-deep-link.test.tsx (6.264 s)
+ ● tablet width keeps both editing and preview available in the stacked document flow
+
+ expect(element).not.toBeInTheDocument()
+
+ expected document not to contain element, found instead
+
+ 118 | renderAt(3);
+ 119 | await openContentTab();
+ > 120 | expect(screen.queryByRole('button', { name: 'Edit' })).not.toBeInTheDocument();
+ | ^
+ 121 | expect(screen.getByRole('region', { name: 'CV editing controls' })).toBeVisible();
+ 122 | expect(screen.getByRole('region', { name: 'Live preview' })).toBeVisible();
+ 123 | expect(mockedApi.put).not.toHaveBeenCalled();
+
+ at Object.toBeInTheDocument (src/cv-builder-deep-link.test.tsx:120:64)
+
+Test Suites: 1 failed, 1 total
+Tests: 1 failed, 57 skipped, 58 total
+Snapshots: 0 total
+Time: 7.703 s
+Ran all test suites within paths "src/cv-builder-deep-link.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-cv-tablet-behavior-red.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-green.json b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-green.json
new file mode 100644
index 00000000..25940fb2
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-green.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":0,"numPassedTests":0,"numPendingTestSuites":0,"numPendingTests":57,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":58,"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":1793710463869,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471206,"status":"pending","title":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave"},{"ancestorTitles":[],"duration":2,"failing":false,"failureDetails":[{}],"failureMessages":["Error: Property `matchMedia` does not exist in the provided object\n at ModuleMocker.spyOn (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-mock\\build\\index.js:593:13)\n at Object.spyOn (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx:111:22)\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":"tablet width keeps both editing and preview available in the stacked document flow","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471206,"status":"failed","title":"tablet width keeps both editing and preview available in the stacked document flow"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a revision conflict disables document history without silently writing an undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"a revision conflict disables document history without silently writing an undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"switching documents hides the previous draft while loading and starts fresh history","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"switching documents hides the previous draft while loading and starts fresh history"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"explicit blank editing excludes master content and includes a profile section only after an Add action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"explicit blank editing excludes master content and includes a profile section only after an Add action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a blank CV can deliberately add an additional Career Profile section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"a blank CV can deliberately add an additional Career Profile section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a historical restore response from the previous document cannot change the newly opened CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"a historical restore response from the previous document cannot change the newly opened CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"content sections follow the editing-region heading without mutating CV settings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"content sections follow the editing-region heading without mutating CV settings"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"settings history explains current Career Profile resolution without writing data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"settings history explains current Career Profile resolution without writing data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits during a held PDF response prevent an older document download","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"edits during a held PDF response prevent an older document download"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"moving a section to the first position announces its actual order and focuses its row","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"moving a section to the first position announces its actual order and focuses its row"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section navigation opens and focuses omitted/custom sections without changing their data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"section navigation opens and focuses omitted/custom sections without changing their data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard move controls retain focus and persist the same section order shown by navigation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"keyboard move controls retain focus and persist the same section order shown by navigation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"secondary duplicate action saves the current draft before creating the copy","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"secondary duplicate action saves the current draft before creating the copy"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"pane navigation focuses the existing preview without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"pane navigation focuses the existing preview without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"deep link loads the exact variant named in the route","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"deep link loads the exact variant named in the route"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a variant that does not exist shows a safe error instead of an empty editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"a variant that does not exist shows a safe error instead of an empty editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"another user's variant is refused by the server and never rendered","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"another user's variant is refused by the server and never rendered"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a denied CV read has localized permission context without a write or retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"a denied CV read has localized permission context without a write or retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a temporary CV opening failure retries reads and restores focus to the editor without saving","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"a temporary CV opening failure retries reads and restores focus to the editor without saving"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål history localizes known sources while preserving unknown metadata and versions","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"Bokmål history localizes known sources while preserving unknown metadata and versions"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"invalid names are explained and are not silently autosaved","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"invalid names are explained and are not silently autosaved"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed autosave is visible and can be retried with the latest data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"failed autosave is visible and can be retried with the latest data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"session undo and redo restore content edits before autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"session undo and redo restore content edits before autosave"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"queued saves use acknowledged server versions without replacing newer local editing state","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"queued saves use acknowledged server versions without replacing newer local editing state"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"revision conflict retains the draft and blocks later autosaves until explicit reload","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"revision conflict retains the draft and blocks later autosaves until explicit reload"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits made while a confirmed reload is in flight remain recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471211,"status":"pending","title":"edits made while a confirmed reload is in flight remain recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring history uses the current version and never replaces edits made during the request","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"restoring history uses the current version and never replaces edits made during the request"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Content is the primary studio panel and all advanced tabs retain their controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"Content is the primary studio panel and all advanced tabs retain their controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"choosing a template restores its own structure instead of inheriting the previous template layout","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"choosing a template restores its own structure instead of inheriting the previous template layout"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editor sections, design controls and document settings render in Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"editor sections, design controls and document settings render in Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"internal navigation warns and can be cancelled before discarding a pending edit","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"internal navigation warns and can be cancelled before discarding a pending edit"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"custom entries can be added, edited, reordered and deleted with confirmation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"custom entries can be added, edited, reordered and deleted with confirmation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile-backed sections expand, reorder, hide and persist variant-only overrides","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"profile-backed sections expand, reorder, hide and persist variant-only overrides"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"focusing a preview retry control keeps its pointer target stationary","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"focusing a preview retry control keeps its pointer target stationary"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"preview failure is visible and retryable without leaving the editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"preview failure is visible and retryable without leaving the editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"late document proposals cannot return after tab unmount or a source undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"late document proposals cannot return after tab unmount or a source undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound section:skills assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"bound section:skills assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"user edits made during server acceptance are retained instead of overwritten by its late saved response","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710471212,"status":"pending","title":"user edits made during server acceptance are retained instead of overwritten by its late saved response"}],"endTime":1793710471229,"message":" ● tablet width keeps both editing and preview available in the stacked document flow\n\n Property `matchMedia` does not exist in the provided object\n\n 109 |\n 110 | test('tablet width keeps both editing and preview available in the stacked document flow', async () => {\n > 111 | const media = jest.spyOn(window, 'matchMedia').mockImplementation(query => ({\n | ^\n 112 | matches: /max-width:\\s*([\\d.]+)px/.test(query) && 768 <= Number(/max-width:\\s*([\\d.]+)px/.exec(query)![1]),\n 113 | media: query, onchange: null, addListener: jest.fn(), removeListener: jest.fn(), addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: () => true,\n 114 | }));\n\n at ModuleMocker.spyOn (node_modules/jest-mock/build/index.js:593:13)\n at Object.spyOn (src/cv-builder-deep-link.test.tsx:111:22)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx","startTime":1793710465604,"status":"failed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-green.log b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-green.log
new file mode 100644
index 00000000..56858ec7
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-green.log
@@ -0,0 +1,26 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/cv-builder-deep-link.test.tsx --testNamePattern=tablet width keeps both --json --outputFile=../docs/ui-modernisation/a3-cv-tablet-green.json
+
+FAIL src/cv-builder-deep-link.test.tsx (5.625 s)
+ ● tablet width keeps both editing and preview available in the stacked document flow
+
+ Property `matchMedia` does not exist in the provided object
+
+ 109 |
+ 110 | test('tablet width keeps both editing and preview available in the stacked document flow', async () => {
+ > 111 | const media = jest.spyOn(window, 'matchMedia').mockImplementation(query => ({
+ | ^
+ 112 | matches: /max-width:\s*([\d.]+)px/.test(query) && 768 <= Number(/max-width:\s*([\d.]+)px/.exec(query)![1]),
+ 113 | media: query, onchange: null, addListener: jest.fn(), removeListener: jest.fn(), addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: () => true,
+ 114 | }));
+
+ at ModuleMocker.spyOn (node_modules/jest-mock/build/index.js:593:13)
+ at Object.spyOn (src/cv-builder-deep-link.test.tsx:111:22)
+
+Test Suites: 1 failed, 1 total
+Tests: 1 failed, 57 skipped, 58 total
+Snapshots: 0 total
+Time: 7.376 s
+Ran all test suites within paths "src/cv-builder-deep-link.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-cv-tablet-green.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-red.json b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-red.json
new file mode 100644
index 00000000..ad964b98
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-red.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":0,"numPassedTests":0,"numPendingTestSuites":0,"numPendingTests":57,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":58,"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":1793710427804,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433623,"status":"pending","title":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave"},{"ancestorTitles":[],"duration":2,"failing":false,"failureDetails":[{}],"failureMessages":["Error: Property `matchMedia` does not exist in the provided object\n at ModuleMocker.spyOn (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\jest-mock\\build\\index.js:593:13)\n at Object.spyOn (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx:111:22)\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":"tablet width keeps both editing and preview available in the stacked document flow","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433623,"status":"failed","title":"tablet width keeps both editing and preview available in the stacked document flow"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a revision conflict disables document history without silently writing an undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"a revision conflict disables document history without silently writing an undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"switching documents hides the previous draft while loading and starts fresh history","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"switching documents hides the previous draft while loading and starts fresh history"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"explicit blank editing excludes master content and includes a profile section only after an Add action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"explicit blank editing excludes master content and includes a profile section only after an Add action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a blank CV can deliberately add an additional Career Profile section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"a blank CV can deliberately add an additional Career Profile section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a historical restore response from the previous document cannot change the newly opened CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"a historical restore response from the previous document cannot change the newly opened CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"content sections follow the editing-region heading without mutating CV settings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"content sections follow the editing-region heading without mutating CV settings"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"settings history explains current Career Profile resolution without writing data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"settings history explains current Career Profile resolution without writing data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits during a held PDF response prevent an older document download","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"edits during a held PDF response prevent an older document download"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"moving a section to the first position announces its actual order and focuses its row","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"moving a section to the first position announces its actual order and focuses its row"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section navigation opens and focuses omitted/custom sections without changing their data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"section navigation opens and focuses omitted/custom sections without changing their data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard move controls retain focus and persist the same section order shown by navigation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"keyboard move controls retain focus and persist the same section order shown by navigation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"secondary duplicate action saves the current draft before creating the copy","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"secondary duplicate action saves the current draft before creating the copy"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"pane navigation focuses the existing preview without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"pane navigation focuses the existing preview without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"deep link loads the exact variant named in the route","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"deep link loads the exact variant named in the route"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a variant that does not exist shows a safe error instead of an empty editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"a variant that does not exist shows a safe error instead of an empty editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"another user's variant is refused by the server and never rendered","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"another user's variant is refused by the server and never rendered"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a denied CV read has localized permission context without a write or retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"a denied CV read has localized permission context without a write or retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a temporary CV opening failure retries reads and restores focus to the editor without saving","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"a temporary CV opening failure retries reads and restores focus to the editor without saving"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål history localizes known sources while preserving unknown metadata and versions","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"Bokmål history localizes known sources while preserving unknown metadata and versions"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"invalid names are explained and are not silently autosaved","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"invalid names are explained and are not silently autosaved"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed autosave is visible and can be retried with the latest data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"failed autosave is visible and can be retried with the latest data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"session undo and redo restore content edits before autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"session undo and redo restore content edits before autosave"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"queued saves use acknowledged server versions without replacing newer local editing state","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"queued saves use acknowledged server versions without replacing newer local editing state"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"revision conflict retains the draft and blocks later autosaves until explicit reload","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"revision conflict retains the draft and blocks later autosaves until explicit reload"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits made while a confirmed reload is in flight remain recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"edits made while a confirmed reload is in flight remain recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring history uses the current version and never replaces edits made during the request","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"restoring history uses the current version and never replaces edits made during the request"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Content is the primary studio panel and all advanced tabs retain their controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"Content is the primary studio panel and all advanced tabs retain their controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"choosing a template restores its own structure instead of inheriting the previous template layout","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"choosing a template restores its own structure instead of inheriting the previous template layout"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editor sections, design controls and document settings render in Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"editor sections, design controls and document settings render in Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"internal navigation warns and can be cancelled before discarding a pending edit","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"internal navigation warns and can be cancelled before discarding a pending edit"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"custom entries can be added, edited, reordered and deleted with confirmation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"custom entries can be added, edited, reordered and deleted with confirmation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile-backed sections expand, reorder, hide and persist variant-only overrides","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"profile-backed sections expand, reorder, hide and persist variant-only overrides"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"focusing a preview retry control keeps its pointer target stationary","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"focusing a preview retry control keeps its pointer target stationary"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"preview failure is visible and retryable without leaving the editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"preview failure is visible and retryable without leaving the editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433643,"status":"pending","title":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"late document proposals cannot return after tab unmount or a source undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"late document proposals cannot return after tab unmount or a source undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound section:skills assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"bound section:skills assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"user edits made during server acceptance are retained instead of overwritten by its late saved response","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793710433644,"status":"pending","title":"user edits made during server acceptance are retained instead of overwritten by its late saved response"}],"endTime":1793710433661,"message":" ● tablet width keeps both editing and preview available in the stacked document flow\n\n Property `matchMedia` does not exist in the provided object\n\n 109 |\n 110 | test('tablet width keeps both editing and preview available in the stacked document flow', async () => {\n > 111 | const media = jest.spyOn(window, 'matchMedia').mockImplementation(query => ({\n | ^\n 112 | matches: /max-width:\\s*([\\d.]+)px/.test(query) && 768 <= Number(/max-width:\\s*([\\d.]+)px/.exec(query)![1]),\n 113 | media: query, onchange: null, addListener: jest.fn(), removeListener: jest.fn(), addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: () => true,\n 114 | }));\n\n at ModuleMocker.spyOn (node_modules/jest-mock/build/index.js:593:13)\n at Object.spyOn (src/cv-builder-deep-link.test.tsx:111:22)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx","startTime":1793710429231,"status":"failed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-red.log b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-red.log
new file mode 100644
index 00000000..b76a967a
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-tablet-red.log
@@ -0,0 +1,26 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/cv-builder-deep-link.test.tsx --testNamePattern=tablet width keeps both --json --outputFile=../docs/ui-modernisation/a3-cv-tablet-red.json
+
+FAIL src/cv-builder-deep-link.test.tsx
+ ● tablet width keeps both editing and preview available in the stacked document flow
+
+ Property `matchMedia` does not exist in the provided object
+
+ 109 |
+ 110 | test('tablet width keeps both editing and preview available in the stacked document flow', async () => {
+ > 111 | const media = jest.spyOn(window, 'matchMedia').mockImplementation(query => ({
+ | ^
+ 112 | matches: /max-width:\s*([\d.]+)px/.test(query) && 768 <= Number(/max-width:\s*([\d.]+)px/.exec(query)![1]),
+ 113 | media: query, onchange: null, addListener: jest.fn(), removeListener: jest.fn(), addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: () => true,
+ 114 | }));
+
+ at ModuleMocker.spyOn (node_modules/jest-mock/build/index.js:593:13)
+ at Object.spyOn (src/cv-builder-deep-link.test.tsx:111:22)
+
+Test Suites: 1 failed, 1 total
+Tests: 1 failed, 57 skipped, 58 total
+Snapshots: 0 total
+Time: 5.869 s, estimated 150 s
+Ran all test suites within paths "src/cv-builder-deep-link.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-cv-tablet-red.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-template-label-red.json b/docs/ui-modernisation/evidence/career/frontend/a3-cv-template-label-red.json
new file mode 100644
index 00000000..ff9325b9
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-template-label-red.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":1,"numFailedTests":2,"numPassedTestSuites":0,"numPassedTests":0,"numPendingTestSuites":0,"numPendingTests":22,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":24,"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":1793711255511,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":185,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["TestingLibraryElementError: Unable to find an element with the text: Modern. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mUpdated 12/10/2026 · version 2\u001b[0m\n \u001b[0m · Frontend Engineer at Northstar\u001b[0m\n \u001b[36m\u001b[39m\n\u001b[36m
\u001b[39m\n at Object.getElementError (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\config.js:37:19)\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:76:38\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:52:17\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:95:19\n at getByText (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-page.test.tsx:77:23)"],"fullName":"en library identifies templates by their human label and retains an unknown legacy identifier","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262371,"status":"failed","title":"en library identifies templates by their human label and retains an unknown legacy identifier"},{"ancestorTitles":[],"duration":61,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["TestingLibraryElementError: Unable to find an element with the text: Moderne. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m
\u001b[39m\n at Object.getElementError (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\config.js:37:19)\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:76:38\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:52:17\n at C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\node_modules\\@testing-library\\dom\\dist\\query-helpers.js:95:19\n at getByText (C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-page.test.tsx:77:23)"],"fullName":"nb library identifies templates by their human label and retains an unknown legacy identifier","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262609,"status":"failed","title":"nb library identifies templates by their human label and retains an unknown legacy identifier"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"blank creation explicitly excludes all profile sections and contact even after template selection","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"blank creation explicitly excludes all profile sections and contact even after template selection"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile creation includes only deliberately selected available sections and contact","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"profile creation includes only deliberately selected available sections and contact"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"unavailable profile sections block profile creation and allow an explicit blank fallback","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"unavailable profile sections block profile creation and allow an explicit blank fallback"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"export validation decodes structured and blob errors without relabelling unknown failures","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"export validation decodes structured and blob errors without relabelling unknown failures"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the CV library has a section heading and announces its held initial read without showing an empty result","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"the CV library has a section heading and announces its held initial read without showing an empty result"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed CV list read has an explicit retry that clears the stale failure after recovery","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"a failed CV list read has an explicit retry that clears the stale failure after recovery"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a live language change retains an open CV name and template draft without refetching library data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"a live language change retains an open CV name and template draft without refetching library data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"held CV creation locks the draft and gallery, then keeps a failed draft for an explicit retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"held CV creation locks the draft and gallery, then keeps a failed draft for an explicit retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a locked CV template remains identifiable and cannot change the creation request","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"a locked CV template remains identifiable and cannot change the creation request"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held duplicate blocks another action for the same CV and shows the persisted refreshed copy","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"a held duplicate blocks another action for the same CV and shows the persisted refreshed copy"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"rename reads the current revision and preserves its settings when saving the new name","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"rename reads the current revision and preserves its settings when saving the new name"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a rename conflict keeps the original library entry and never retries the write automatically","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"a rename conflict keeps the original library entry and never retries the write automatically"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cancelling deletion returns focus to the surviving CV action control without removing the CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"cancelling deletion returns focus to the surviving CV action control without removing the CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed creation keeps its draft and translates its failure after closing and reopening in another language","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"a failed creation keeps its draft and translates its failure after closing and reopening in another language"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"generic PDF failure follows the current language both after failure and when a held request fails","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"generic PDF failure follows the current language both after failure and when a held request fails"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a held deletion preserves focus moved to another surviving control before the response arrives","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"a held deletion preserves focus moved to another surviving control before the response arrives"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF status 503 shows an actionable message without retrying","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"PDF status 503 shows an actionable message without retrying"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF status 504 shows an actionable message without retrying","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"PDF status 504 shows an actionable message without retrying"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"lists existing CVs from the variants API","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"lists existing CVs from the variants API"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"shows the empty state and creates a CV then navigates to the editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"shows the empty state and creates a CV then navigates to the editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"CV dashboard and create flow render in Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"CV dashboard and create flow render in Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"CV deletion requires confirmation and supports cancellation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711262671,"status":"pending","title":"CV deletion requires confirmation and supports cancellation"}],"endTime":1793711262694,"message":" ● en library identifies templates by their human label and retains an unknown legacy identifier\n\n TestingLibraryElementError: Unable to find an element with the text: Modern. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\n Ignored nodes: comments, script, style\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mUpdated 12/10/2026 · version 2\u001b[0m\n \u001b[0m · Frontend Engineer at Northstar\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n\n 75 | renderPage();\n 76 | const card = (await screen.findByText(existingCv.name)).closest('[role=\"link\"]') as HTMLElement;\n > 77 | expect(within(card).getByText(language === 'nb' ? translations.nb.cvTemplateModernName : 'Modern')).toBeVisible();\n | ^\n 78 | const legacy = screen.getByText('Legacy CV').closest('[role=\"link\"]') as HTMLElement;\n 79 | expect(within(legacy).getByText('legacy-template')).toBeVisible();\n 80 | expect(mockedApi.put).not.toHaveBeenCalled();\n\n at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)\n at node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at node_modules/@testing-library/dom/dist/query-helpers.js:95:19\n at getByText (src/cv-builder-page.test.tsx:77:23)\n\n ● nb library identifies templates by their human label and retains an unknown legacy identifier\n\n TestingLibraryElementError: Unable to find an element with the text: Moderne. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\n Ignored nodes: comments, script, style\n \u001b[36m
\u001b[39m\n\n 75 | renderPage();\n 76 | const card = (await screen.findByText(existingCv.name)).closest('[role=\"link\"]') as HTMLElement;\n > 77 | expect(within(card).getByText(language === 'nb' ? translations.nb.cvTemplateModernName : 'Modern')).toBeVisible();\n | ^\n 78 | const legacy = screen.getByText('Legacy CV').closest('[role=\"link\"]') as HTMLElement;\n 79 | expect(within(legacy).getByText('legacy-template')).toBeVisible();\n 80 | expect(mockedApi.put).not.toHaveBeenCalled();\n\n at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)\n at node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at node_modules/@testing-library/dom/dist/query-helpers.js:95:19\n at getByText (src/cv-builder-page.test.tsx:77:23)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-page.test.tsx","startTime":1793711257327,"status":"failed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-template-label-red.log b/docs/ui-modernisation/evidence/career/frontend/a3-cv-template-label-red.log
new file mode 100644
index 00000000..637b3583
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-template-label-red.log
@@ -0,0 +1,239 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/cv-builder-page.test.tsx --testNamePattern=library identifies templates --json --outputFile=../docs/ui-modernisation/a3-cv-template-label-red.json
+
+FAIL src/cv-builder-page.test.tsx (5.367 s)
+ ● en library identifies templates by their human label and retains an unknown legacy identifier
+
+ TestingLibraryElementError: Unable to find an element with the text: Modern. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
+
+ Ignored nodes: comments, script, style
+
+
+
+
+
+
+ Frontend CV
+
+
+
+
+
+
+ modern
+
+
+
+
+ EN
+
+
+
+
+
+ Public
+
+
+
+
+ Updated 12/10/2026 · version 2
+ · Frontend Engineer at Northstar
+
+
+
+ 75 | renderPage();
+ 76 | const card = (await screen.findByText(existingCv.name)).closest('[role="link"]') as HTMLElement;
+ > 77 | expect(within(card).getByText(language === 'nb' ? translations.nb.cvTemplateModernName : 'Modern')).toBeVisible();
+ | ^
+ 78 | const legacy = screen.getByText('Legacy CV').closest('[role="link"]') as HTMLElement;
+ 79 | expect(within(legacy).getByText('legacy-template')).toBeVisible();
+ 80 | expect(mockedApi.put).not.toHaveBeenCalled();
+
+ at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)
+ at node_modules/@testing-library/dom/dist/query-helpers.js:76:38
+ at node_modules/@testing-library/dom/dist/query-helpers.js:52:17
+ at node_modules/@testing-library/dom/dist/query-helpers.js:95:19
+ at getByText (src/cv-builder-page.test.tsx:77:23)
+
+ ● nb library identifies templates by their human label and retains an unknown legacy identifier
+
+ TestingLibraryElementError: Unable to find an element with the text: Moderne. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
+
+ Ignored nodes: comments, script, style
+
+
+ 75 | renderPage();
+ 76 | const card = (await screen.findByText(existingCv.name)).closest('[role="link"]') as HTMLElement;
+ > 77 | expect(within(card).getByText(language === 'nb' ? translations.nb.cvTemplateModernName : 'Modern')).toBeVisible();
+ | ^
+ 78 | const legacy = screen.getByText('Legacy CV').closest('[role="link"]') as HTMLElement;
+ 79 | expect(within(legacy).getByText('legacy-template')).toBeVisible();
+ 80 | expect(mockedApi.put).not.toHaveBeenCalled();
+
+ at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)
+ at node_modules/@testing-library/dom/dist/query-helpers.js:76:38
+ at node_modules/@testing-library/dom/dist/query-helpers.js:52:17
+ at node_modules/@testing-library/dom/dist/query-helpers.js:95:19
+ at getByText (src/cv-builder-page.test.tsx:77:23)
+
+Test Suites: 1 failed, 1 total
+Tests: 2 failed, 22 skipped, 24 total
+Snapshots: 0 total
+Time: 7.193 s, estimated 13 s
+Ran all test suites within paths "src/cv-builder-page.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-cv-template-label-red.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-undo-diagnostic.json b/docs/ui-modernisation/evidence/career/frontend/a3-cv-undo-diagnostic.json
new file mode 100644
index 00000000..40651cc6
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-undo-diagnostic.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":1,"numPassedTests":1,"numPendingTestSuites":0,"numPendingTests":57,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":58,"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":1793711149607,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":3023,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711155130,"status":"passed","title":"Strict Mode groups a typing burst into one undo step and preserves redo through autosave"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tablet width keeps both editing and preview available in the stacked document flow","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158154,"status":"pending","title":"tablet width keeps both editing and preview available in the stacked document flow"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158154,"status":"pending","title":"document shortcuts undo and redo renaming, preserve native input undo and discard branched redo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a revision conflict disables document history without silently writing an undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158154,"status":"pending","title":"a revision conflict disables document history without silently writing an undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"switching documents hides the previous draft while loading and starts fresh history","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158154,"status":"pending","title":"switching documents hides the previous draft while loading and starts fresh history"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"explicit blank editing excludes master content and includes a profile section only after an Add action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158154,"status":"pending","title":"explicit blank editing excludes master content and includes a profile section only after an Add action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a blank CV can deliberately add an additional Career Profile section","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158154,"status":"pending","title":"a blank CV can deliberately add an additional Career Profile section"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a historical restore response from the previous document cannot change the newly opened CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158154,"status":"pending","title":"a historical restore response from the previous document cannot change the newly opened CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"content sections follow the editing-region heading without mutating CV settings","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158154,"status":"pending","title":"content sections follow the editing-region heading without mutating CV settings"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"settings history explains current Career Profile resolution without writing data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"settings history explains current Career Profile resolution without writing data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"PDF export locks immediately, rejects a newer unsaved draft, and keeps that draft recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits during a held PDF response prevent an older document download","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"edits during a held PDF response prevent an older document download"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"moving a section to the first position announces its actual order and focuses its row","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"moving a section to the first position announces its actual order and focuses its row"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"section navigation opens and focuses omitted/custom sections without changing their data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"section navigation opens and focuses omitted/custom sections without changing their data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyboard move controls retain focus and persist the same section order shown by navigation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"keyboard move controls retain focus and persist the same section order shown by navigation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"secondary duplicate action saves the current draft before creating the copy","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"secondary duplicate action saves the current draft before creating the copy"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"pane navigation focuses the existing preview without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"pane navigation focuses the existing preview without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"deep link loads the exact variant named in the route","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"deep link loads the exact variant named in the route"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a variant that does not exist shows a safe error instead of an empty editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"a variant that does not exist shows a safe error instead of an empty editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"another user's variant is refused by the server and never rendered","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"another user's variant is refused by the server and never rendered"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a denied CV read has localized permission context without a write or retry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"a denied CV read has localized permission context without a write or retry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a temporary CV opening failure retries reads and restores focus to the editor without saving","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"a temporary CV opening failure retries reads and restores focus to the editor without saving"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Bokmål history localizes known sources while preserving unknown metadata and versions","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"Bokmål history localizes known sources while preserving unknown metadata and versions"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"invalid names are explained and are not silently autosaved","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"invalid names are explained and are not silently autosaved"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"failed autosave is visible and can be retried with the latest data","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"failed autosave is visible and can be retried with the latest data"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"session undo and redo restore content edits before autosave","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"session undo and redo restore content edits before autosave"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"queued saves use acknowledged server versions without replacing newer local editing state","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"queued saves use acknowledged server versions without replacing newer local editing state"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"revision conflict retains the draft and blocks later autosaves until explicit reload","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"revision conflict retains the draft and blocks later autosaves until explicit reload"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"edits made while a confirmed reload is in flight remain recoverable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"edits made while a confirmed reload is in flight remain recoverable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring history uses the current version and never replaces edits made during the request","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"restoring history uses the current version and never replaces edits made during the request"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"Content is the primary studio panel and all advanced tabs retain their controls","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"Content is the primary studio panel and all advanced tabs retain their controls"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"choosing a template restores its own structure instead of inheriting the previous template layout","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"choosing a template restores its own structure instead of inheriting the previous template layout"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editor sections, design controls and document settings render in Bokmål","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"editor sections, design controls and document settings render in Bokmål"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"internal navigation warns and can be cancelled before discarding a pending edit","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"internal navigation warns and can be cancelled before discarding a pending edit"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"custom entries can be added, edited, reordered and deleted with confirmation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"custom entries can be added, edited, reordered and deleted with confirmation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[P5-10 PRES-C01 C07] source-backed entry edits identify their scope and save only this CV"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[P5-10 PRES-C07 C10 E08] omitted entries remain editable and retain their draft after a failed save"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[P5-10 PRES-C01 C07] section content reset inherits source without changing omission or presentation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"profile-backed sections expand, reorder, hide and persist variant-only overrides","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"profile-backed sections expand, reorder, hide and persist variant-only overrides"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"focusing a preview retry control keeps its pointer target stationary","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"focusing a preview retry control keeps its pointer target stationary"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"preview failure is visible and retryable without leaving the editor","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"preview failure is visible and retryable without leaving the editor"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[P5-11 PRES-C06 E08] automatic fit attaches when the asynchronously loaded preview pane appears"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[P5-11 PRES-C06 C12] page count is announced only after the renderer has settled"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[P5-11 PRES-C06 E09] overlapping preview successes and failures cannot replace the newest document"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Apply changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[PRES-C11 PRES-C07] whole-document AI Reject changes only an explicitly accepted CV override"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158155,"status":"pending","title":"[PRES-C11] unsafe whole-document response (invalid JSON) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"[PRES-C11] unsafe whole-document response (missing original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"[PRES-C11] unsafe whole-document response (duplicate original ID) cannot be applied"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"bound document generation saves the pending draft, reviews server Original, and accepted AI remains undoable"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"a newer draft is flushed before stale proposal acceptance fails without rebasing or changing content"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"late document proposals cannot return after tab unmount or a source undo","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"late document proposals cannot return after tab unmount or a source undo"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound section:skills assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"bound section:skills assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"bound custom:sample assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"bound entry:experience:job-1 assistant sends explicit scope and edited wording to server acceptance"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"user edits made during server acceptance are retained instead of overwritten by its late saved response","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711158156,"status":"pending","title":"user edits made during server acceptance are retained instead of overwritten by its late saved response"}],"endTime":1793711158159,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\cv-builder-deep-link.test.tsx","startTime":1793711151038,"status":"focused","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-cv-undo-diagnostic.log b/docs/ui-modernisation/evidence/career/frontend/a3-cv-undo-diagnostic.log
new file mode 100644
index 00000000..0a4bf5bd
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-cv-undo-diagnostic.log
@@ -0,0 +1,10 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/cv-builder-deep-link.test.tsx --testNamePattern=Strict Mode groups a typing burst --json --outputFile=../docs/ui-modernisation/a3-cv-undo-diagnostic.json
+
+Test Suites: 1 passed, 1 total
+Tests: 57 skipped, 1 passed, 58 total
+Snapshots: 0 total
+Time: 8.562 s, estimated 142 s
+Ran all test suites within paths "src/cv-builder-deep-link.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-cv-undo-diagnostic.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-letter-tablet-red.json b/docs/ui-modernisation/evidence/career/frontend/a3-letter-tablet-red.json
new file mode 100644
index 00000000..191de56e
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-letter-tablet-red.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":0,"numPassedTests":2,"numPendingTestSuites":0,"numPendingTests":52,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":55,"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":1793711359388,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366036,"status":"pending","title":"[P7-11 tailoring] generated metadata and known history enums follow locale while evidence, unknown metadata and dirty prose stay verbatim"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"document package history is read-only and separates captured notes from answers","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"document package history is read-only and separates captured notes from answers"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cv section shows the attached variant and the ones available to attach","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"cv section shows the attached variant and the ones available to attach"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"attaching a different variant only re-points the application","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"attaching a different variant only re-points the application"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cv section points at the builder when there are no variants","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"cv section points at the builder when there are no variants"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tailoring renders suggestions grouped by kind","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"tailoring renders suggestions grouped by kind"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tailoring asks for a career profile when there is none","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"tailoring asks for a career profile when there is none"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"submitted package capture appends an immutable history entry","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"submitted package capture appends an immutable history entry"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cover letter loads the current text and its history","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"cover letter loads the current text and its history"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editing marks the draft dirty and saving sends the new text","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"editing marks the draft dirty and saving sends the new text"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"discarding returns to the saved text","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"discarding returns to the saved text"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring an old version calls the restore endpoint","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"restoring an old version calls the restore endpoint"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"an empty cover letter offers the template and an empty history","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"an empty cover letter offers the template and an empty history"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"the empty cover-letter template and rich-text controls follow Bokmål UI language","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"the empty cover-letter template and rich-text controls follow Bokmål UI language"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"AI letter results are discarded when the source changes during generation","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"AI letter results are discarded when the source changes during generation"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Improve writing uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter Improve writing uses the existing reviewed action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Suggest content uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter Suggest content uses the existing reviewed action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Grammar check uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter Grammar check uses the existing reviewed action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Shorter uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter Shorter uses the existing reviewed action"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cancelling letter generation ignores its late response","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"cancelling letter generation ignores its late response"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"AI cover letter suggestions use the linked CV and require explicit apply","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"AI cover letter suggestions use the linked CV and require explicit apply"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter AI revalidates its recorded source before applying and refuses a cross-tab source conflict"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI language follows the saved document and updates the same local language draft","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter AI language follows the saved document and updates the same local language draft"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local edit","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter AI ignores a late source validation after local edit"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local cancel","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter AI ignores a late source validation after local cancel"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local job change","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"letter AI ignores a late source validation after local job change"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"a held letter Save prevents an in-flight AI validation from replacing the submitted snapshot"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"[PRES-W06] rejecting an AI cover letter preserves the saved draft without a write","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"[PRES-W06] rejecting an AI cover letter preserves the saved draft without a write"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed load surfaces an error","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"a failed load surfaces an error"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application answer and recruiter drafts save from the dedicated workspace","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"application answer and recruiter drafts save from the dedicated workspace"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application package drafts can be cleared without deleting ordinary notes","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"application package drafts can be cleared without deleting ordinary notes"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"failed cover-letter saving retains editable dirty text and original Save recovery across a live locale change"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"failed application-answer saving keeps both dirty drafts editable and retries only the original save payload"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"failed CV attachment leaves the current association and selector available for the original explicit action"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"dirty version restore cancels without a write and confirmed held restore appends history exactly once"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"held letter Save submits one snapshot and prevents an AI Apply from replacing its pending draft"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"held AI generation locks its controls and preserves captured action attribution after a later action selection"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"capture, detail and download failures keep owned frozen history and recover only through their original explicit actions"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"all five asset read owners expose GET-only recovery without false empty history or locale refetch"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"keyed job changes stop a late CV copy from attaching and never reuse another job's saved-copy recovery"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"keyed job changes keep job B's answer drafts and callbacks independent of job A's late save"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a parent refresh cannot attach a newer revision to dirty application drafts","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"a parent refresh cannot attach a newer revision to dirty application drafts"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cover-letter rejection (409) retains draft and source revision without a fresh read","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"cover-letter rejection (409) retains draft and source revision without a fresh read"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cover-letter rejection (0) retains draft and source revision without a fresh read","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366037,"status":"pending","title":"cover-letter rejection (0) retains draft and source revision without a fresh read"},{"ancestorTitles":[],"duration":null,"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":0,"retryReasons":[],"startAt":1793711366038,"status":"pending","title":"letter text preview shows unsaved formatting, hides the inactive narrow pane and never saves on switching"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter text preview renders unsafe Markdown as inert text","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366038,"status":"pending","title":"letter text preview renders unsafe Markdown as inert text"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter preview retains the draft after cancelled restore and failed save","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366038,"status":"pending","title":"letter preview retains the draft after cancelled restore and failed save"},{"ancestorTitles":[],"duration":null,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"keyed letter job changes discard the old preview and ignore its late save","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"startAt":1793711366038,"status":"pending","title":"keyed letter job changes discard the old preview and ignore its late save"},{"ancestorTitles":[],"duration":1052,"failing":false,"failureDetails":[{"name":"TestingLibraryElementError"}],"failureMessages":["TestingLibraryElementError: Unable to find an accessible element with the role \"region\" and name \"Letter text preview\"\n\nHere are the accessible roles:\n\n region:\n\n Name \"Cover Letter\":\n \u001b[36m\u001b[39m\n\n Name \"AI writing assistant\":\n \u001b[36m\u001b[39m\n\n Name \"Version history\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n banner:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n heading:\n\n Name \"Cover Letter\":\n \u001b[36m\u001b[39m\n\n Name \"AI writing assistant\":\n \u001b[36m\u001b[39m\n\n Name \"Version history\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n group:\n\n Name \"Cover Letter\":\n \u001b[36m\u001b[39m\n\n Name \"AI writing assistant\":\n \u001b[36m\u001b[39m\n\n Name \"Version history\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n status:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n tablist:\n\n Name \"Letter workspace\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n tab:\n\n Name \"Write\":\n \u001b[36m\u001b[39m\n\n Name \"Preview\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n tabpanel:\n\n Name \"Write\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"Bold\":\n \u001b[36m\u001b[39m\n\n Name \"Italic\":\n \u001b[36m\u001b[39m\n\n Name \"Underline\":\n \u001b[36m\u001b[39m\n\n Name \"Link\":\n \u001b[36m\u001b[39m\n\n Name \"Improve writing\":\n \u001b[36m\u001b[39m\n\n Name \"Suggest content\":\n \u001b[36m\u001b[39m\n\n Name \"Grammar check\":\n \u001b[36m\u001b[39m\n\n Name \"Shorter\":\n \u001b[36m\u001b[39m\n\n Name \"Save\":\n \u001b[36m\u001b[39m\n\n Name \"Discard changes\":\n \u001b[36m\u001b[39m\n\n Name \"Start from template\":\n \u001b[36m\u001b[39m\n\n Name \"Generate\":\n \u001b[36m\u001b[39m\n\n Name \"Restore version 1\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n textbox:\n\n Name \"Cover letter\":\n \u001b[36m\u001b[39m\n\n Name \"Additional instructions\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n alert:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n combobox:\n\n Name \"Action\":\n \u001b[36m\u001b[39m\n\n Name \"Tone\":\n \u001b[36m\u001b[39m\n\n Name \"Document language\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\n Name \"AI writing assistant\":\n \u001b[36m\u001b[39m\n\n Name \"Version history\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n banner:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n heading:\n\n Name \"Cover Letter\":\n \u001b[36m\u001b[39m\n\n Name \"AI writing assistant\":\n \u001b[36m\u001b[39m\n\n Name \"Version history\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n group:\n\n Name \"Cover Letter\":\n \u001b[36m\u001b[39m\n\n Name \"AI writing assistant\":\n \u001b[36m\u001b[39m\n\n Name \"Version history\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n status:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n tablist:\n\n Name \"Letter workspace\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n tab:\n\n Name \"Write\":\n \u001b[36m\u001b[39m\n\n Name \"Preview\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n tabpanel:\n\n Name \"Write\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"Bold\":\n \u001b[36m\u001b[39m\n\n Name \"Italic\":\n \u001b[36m\u001b[39m\n\n Name \"Underline\":\n \u001b[36m\u001b[39m\n\n Name \"Link\":\n \u001b[36m\u001b[39m\n\n Name \"Improve writing\":\n \u001b[36m\u001b[39m\n\n Name \"Suggest content\":\n \u001b[36m\u001b[39m\n\n Name \"Grammar check\":\n \u001b[36m\u001b[39m\n\n Name \"Shorter\":\n \u001b[36m\u001b[39m\n\n Name \"Save\":\n \u001b[36m\u001b[39m\n\n Name \"Discard changes\":\n \u001b[36m\u001b[39m\n\n Name \"Start from template\":\n \u001b[36m\u001b[39m\n\n Name \"Generate\":\n \u001b[36m\u001b[39m\n\n Name \"Restore version 1\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n textbox:\n\n Name \"Cover letter\":\n \u001b[36m\u001b[39m\n\n Name \"Additional instructions\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n alert:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n combobox:\n\n Name \"Action\":\n \u001b[36m\u001b[39m\n\n Name \"Tone\":\n \u001b[36m\u001b[39m\n\n Name \"Document language\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\n Ignored nodes: comments, script, style\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m 979 | expect(screen.getByRole(\"region\", { name: copy(\"assetsLetterTextPreview\") })).toHaveTextContent(\"Live desktop draft\");\n | ^\n 980 | expect(editor).toBeVisible();\n 981 | expect(screen.getAllByRole(\"textbox\", { name: copy(\"jobDetailsCoverLetter\") })).toHaveLength(1);\n 982 | expect(screen.queryByRole(\"tablist\", { name: copy(\"assetsLetterWorkspace\") })).not.toBeInTheDocument();\n\n at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)\n at node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at node_modules/@testing-library/dom/dist/query-helpers.js:95:19\n at getByRole (src/application-assets.test.tsx:979:19)\n","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-assets.test.tsx","startTime":1793711361049,"status":"failed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-letter-tablet-red.log b/docs/ui-modernisation/evidence/career/frontend/a3-letter-tablet-red.log
new file mode 100644
index 00000000..4b0ca795
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-letter-tablet-red.log
@@ -0,0 +1,515 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/application-assets.test.tsx --testNamePattern=letter workspace at --json --outputFile=../docs/ui-modernisation/a3-letter-tablet-red.json
+
+FAIL src/application-assets.test.tsx (6.949 s)
+ ● letter workspace at 768px keeps one editor and its preview available without writing
+
+ TestingLibraryElementError: Unable to find an accessible element with the role "region" and name "Letter text preview"
+
+ Here are the accessible roles:
+
+ region:
+
+ Name "Cover Letter":
+
+
+ Name "AI writing assistant":
+
+
+ Name "Version history":
+
+
+ --------------------------------------------------
+ banner:
+
+ Name "":
+
+
+ Name "":
+
+
+ Name "":
+
+
+ --------------------------------------------------
+ heading:
+
+ Name "Cover Letter":
+
+
+ Name "AI writing assistant":
+
+
+ Name "Version history":
+
+
+ --------------------------------------------------
+ paragraph:
+
+ Name "":
+
+
+ Name "":
+
+
+ Name "":
+
+
+ Name "":
+
+
+ --------------------------------------------------
+ group:
+
+ Name "Cover Letter":
+
+
+ Name "AI writing assistant":
+
+
+ Name "Version history":
+
+
+ --------------------------------------------------
+ status:
+
+ Name "":
+
+
+ Name "":
+
+
+ Name "":
+
+
+ --------------------------------------------------
+ tablist:
+
+ Name "Letter workspace":
+
+
+ --------------------------------------------------
+ tab:
+
+ Name "Write":
+
+
+ Name "Preview":
+
+
+ --------------------------------------------------
+ tabpanel:
+
+ Name "Write":
+
+
+ --------------------------------------------------
+ button:
+
+ Name "Bold":
+
+
+ Name "Italic":
+
+
+ Name "Underline":
+
+
+ Name "Link":
+
+
+ Name "Improve writing":
+
+
+ Name "Suggest content":
+
+
+ Name "Grammar check":
+
+
+ Name "Shorter":
+
+
+ Name "Save":
+
+
+ Name "Discard changes":
+
+
+ Name "Start from template":
+
+
+ Name "Generate":
+
+
+ Name "Restore version 1":
+
+
+ --------------------------------------------------
+ textbox:
+
+ Name "Cover letter":
+
+
+ Name "Additional instructions":
+
+
+ --------------------------------------------------
+ alert:
+
+ Name "":
+
+
+ --------------------------------------------------
+ combobox:
+
+ Name "Action":
+
+
+ Name "Tone":
+
+
+ Name "Document language":
+
+
+ --------------------------------------------------
+
+ Ignored nodes: comments, script, style
+
+
+
+
+
+
+
+ Cover Letter
+
+
+ Every save creates a version, so manually edited text is never overwritten without review.
+
+
+
+
+
+
+ Content loaded.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 979 | expect(screen.getByRole("region", { name: copy("assetsLetterTextPreview") })).toHaveTextContent("Live desktop draft");
+ | ^
+ 980 | expect(editor).toBeVisible();
+ 981 | expect(screen.getAllByRole("textbox", { name: copy("jobDetailsCoverLetter") })).toHaveLength(1);
+ 982 | expect(screen.queryByRole("tablist", { name: copy("assetsLetterWorkspace") })).not.toBeInTheDocument();
+
+ at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)
+ at node_modules/@testing-library/dom/dist/query-helpers.js:76:38
+ at node_modules/@testing-library/dom/dist/query-helpers.js:52:17
+ at node_modules/@testing-library/dom/dist/query-helpers.js:95:19
+ at getByRole (src/application-assets.test.tsx:979:19)
+
+Test Suites: 1 failed, 1 total
+Tests: 1 failed, 52 skipped, 2 passed, 55 total
+Snapshots: 0 total
+Time: 8.628 s, estimated 26 s
+Ran all test suites within paths "src/application-assets.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-letter-tablet-red.json
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-letter-workflow-tests.json b/docs/ui-modernisation/evidence/career/frontend/a3-letter-workflow-tests.json
new file mode 100644
index 00000000..2827f70e
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-letter-workflow-tests.json
@@ -0,0 +1 @@
+{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":1,"numPassedTests":55,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":55,"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":1793711405645,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":[],"duration":964,"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":1793711411605,"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":158,"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":1793711412570,"status":"passed","title":"document package history is read-only and separates captured notes from answers"},{"ancestorTitles":[],"duration":104,"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":1793711412728,"status":"passed","title":"cv section shows the attached variant and the ones available to attach"},{"ancestorTitles":[],"duration":226,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"attaching a different variant only re-points the application","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711412833,"status":"passed","title":"attaching a different variant only re-points the application"},{"ancestorTitles":[],"duration":62,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cv section points at the builder when there are no variants","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711413059,"status":"passed","title":"cv section points at the builder when there are no variants"},{"ancestorTitles":[],"duration":78,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tailoring renders suggestions grouped by kind","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711413122,"status":"passed","title":"tailoring renders suggestions grouped by kind"},{"ancestorTitles":[],"duration":76,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"tailoring asks for a career profile when there is none","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711413200,"status":"passed","title":"tailoring asks for a career profile when there is none"},{"ancestorTitles":[],"duration":141,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"submitted package capture appends an immutable history entry","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711413276,"status":"passed","title":"submitted package capture appends an immutable history entry"},{"ancestorTitles":[],"duration":258,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cover letter loads the current text and its history","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711413417,"status":"passed","title":"cover letter loads the current text and its history"},{"ancestorTitles":[],"duration":535,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"editing marks the draft dirty and saving sends the new text","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711413676,"status":"passed","title":"editing marks the draft dirty and saving sends the new text"},{"ancestorTitles":[],"duration":573,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"discarding returns to the saved text","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711414212,"status":"passed","title":"discarding returns to the saved text"},{"ancestorTitles":[],"duration":436,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"restoring an old version calls the restore endpoint","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711414785,"status":"passed","title":"restoring an old version calls the restore endpoint"},{"ancestorTitles":[],"duration":337,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"an empty cover letter offers the template and an empty history","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711415222,"status":"passed","title":"an empty cover letter offers the template and an empty history"},{"ancestorTitles":[],"duration":343,"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":1793711415559,"status":"passed","title":"the empty cover-letter template and rich-text controls follow Bokmål UI language"},{"ancestorTitles":[],"duration":497,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"AI letter results are discarded when the source changes during generation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711415902,"status":"passed","title":"AI letter results are discarded when the source changes during generation"},{"ancestorTitles":[],"duration":438,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Improve writing uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711416399,"status":"passed","title":"letter Improve writing uses the existing reviewed action"},{"ancestorTitles":[],"duration":385,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Suggest content uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711416838,"status":"passed","title":"letter Suggest content uses the existing reviewed action"},{"ancestorTitles":[],"duration":363,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Grammar check uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711417223,"status":"passed","title":"letter Grammar check uses the existing reviewed action"},{"ancestorTitles":[],"duration":369,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter Shorter uses the existing reviewed action","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"startAt":1793711417586,"status":"passed","title":"letter Shorter uses the existing reviewed action"},{"ancestorTitles":[],"duration":361,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"cancelling letter generation ignores its late response","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"startAt":1793711417955,"status":"passed","title":"cancelling letter generation ignores its late response"},{"ancestorTitles":[],"duration":846,"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":1793711418316,"status":"passed","title":"AI cover letter suggestions use the linked CV and require explicit apply"},{"ancestorTitles":[],"duration":612,"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":1793711419162,"status":"passed","title":"letter AI revalidates its recorded source before applying and refuses a cross-tab source conflict"},{"ancestorTitles":[],"duration":953,"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":1793711419774,"status":"passed","title":"letter AI language follows the saved document and updates the same local language draft"},{"ancestorTitles":[],"duration":774,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local edit","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711420727,"status":"passed","title":"letter AI ignores a late source validation after local edit"},{"ancestorTitles":[],"duration":708,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local cancel","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711421501,"status":"passed","title":"letter AI ignores a late source validation after local cancel"},{"ancestorTitles":[],"duration":935,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter AI ignores a late source validation after local job change","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711422209,"status":"passed","title":"letter AI ignores a late source validation after local job change"},{"ancestorTitles":[],"duration":1024,"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":1793711423144,"status":"passed","title":"a held letter Save prevents an in-flight AI validation from replacing the submitted snapshot"},{"ancestorTitles":[],"duration":539,"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":1793711424168,"status":"passed","title":"[PRES-W06] rejecting an AI cover letter preserves the saved draft without a write"},{"ancestorTitles":[],"duration":55,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"a failed load surfaces an error","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711424707,"status":"passed","title":"a failed load surfaces an error"},{"ancestorTitles":[],"duration":221,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application answer and recruiter drafts save from the dedicated workspace","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711424762,"status":"passed","title":"application answer and recruiter drafts save from the dedicated workspace"},{"ancestorTitles":[],"duration":356,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"application package drafts can be cleared without deleting ordinary notes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"startAt":1793711424983,"status":"passed","title":"application package drafts can be cleared without deleting ordinary notes"},{"ancestorTitles":[],"duration":1063,"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":1793711425339,"status":"passed","title":"failed cover-letter saving retains editable dirty text and original Save recovery across a live locale change"},{"ancestorTitles":[],"duration":601,"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":1793711426402,"status":"passed","title":"failed application-answer saving keeps both dirty drafts editable and retries only the original save payload"},{"ancestorTitles":[],"duration":449,"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":1793711427003,"status":"passed","title":"failed CV attachment leaves the current association and selector available for the original explicit action"},{"ancestorTitles":[],"duration":1329,"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":1793711427453,"status":"passed","title":"dirty version restore cancels without a write and confirmed held restore appends history exactly once"},{"ancestorTitles":[],"duration":990,"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":1793711428783,"status":"passed","title":"held letter Save submits one snapshot and prevents an AI Apply from replacing its pending draft"},{"ancestorTitles":[],"duration":1399,"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":1793711429773,"status":"passed","title":"held AI generation locks its controls and preserves captured action attribution after a later action selection"},{"ancestorTitles":[],"duration":945,"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":1793711431172,"status":"passed","title":"capture, detail and download failures keep owned frozen history and recover only through their original explicit actions"},{"ancestorTitles":[],"duration":1008,"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":1793711432117,"status":"passed","title":"all five asset read owners expose GET-only recovery without false empty history or locale refetch"},{"ancestorTitles":[],"duration":550,"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":1793711433125,"status":"passed","title":"keyed job changes stop a late CV copy from attaching and never reuse another job's saved-copy recovery"},{"ancestorTitles":[],"duration":860,"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":1793711433675,"status":"passed","title":"keyed job changes keep job B's answer drafts and callbacks independent of job A's late save"},{"ancestorTitles":[],"duration":499,"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":1793711434536,"status":"passed","title":"a parent refresh cannot attach a newer revision to dirty application drafts"},{"ancestorTitles":[],"duration":674,"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":1793711435035,"status":"passed","title":"cover-letter rejection (409) retains draft and source revision without a fresh read"},{"ancestorTitles":[],"duration":748,"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":1793711435710,"status":"passed","title":"cover-letter rejection (0) retains draft and source revision without a fresh read"},{"ancestorTitles":[],"duration":722,"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":1793711436458,"status":"passed","title":"letter text preview shows unsaved formatting, hides the inactive narrow pane and never saves on switching"},{"ancestorTitles":[],"duration":553,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter text preview renders unsafe Markdown as inert text","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"startAt":1793711437181,"status":"passed","title":"letter text preview renders unsafe Markdown as inert text"},{"ancestorTitles":[],"duration":1425,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter preview retains the draft after cancelled restore and failed save","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"startAt":1793711437734,"status":"passed","title":"letter preview retains the draft after cancelled restore and failed save"},{"ancestorTitles":[],"duration":1387,"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":1793711439159,"status":"passed","title":"keyed letter job changes discard the old preview and ignore its late save"},{"ancestorTitles":[],"duration":436,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter workspace at 768px keeps one editor and its preview available without writing","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711440547,"status":"passed","title":"letter workspace at 768px keeps one editor and its preview available without writing"},{"ancestorTitles":[],"duration":454,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter workspace at 1000px keeps one editor and its preview available without writing","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711440984,"status":"passed","title":"letter workspace at 1000px keeps one editor and its preview available without writing"},{"ancestorTitles":[],"duration":447,"failing":false,"failureDetails":[],"failureMessages":[],"fullName":"letter workspace at 1440px keeps one editor and its preview available without writing","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"startAt":1793711441438,"status":"passed","title":"letter workspace at 1440px keeps one editor and its preview available without writing"},{"ancestorTitles":[],"duration":826,"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":1793711441885,"status":"passed","title":"letter preview controls follow Bokmål without translating or saving the local draft"},{"ancestorTitles":[],"duration":1854,"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":1793711442711,"status":"passed","title":"document settings are dirty local drafts until explicit Save, and Discard restores saved details"},{"ancestorTitles":[],"duration":1405,"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":1793711444565,"status":"passed","title":"letter PDF awaits durable settings and blocks duplicate exports; failed save never exports"},{"ancestorTitles":[],"duration":3793,"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":1793711445970,"status":"passed","title":"letter document preview ignores stale responses, keeps last good HTML on failure and retries without saving"}],"endTime":1793711449766,"message":"","name":"C:\\Users\\Connor\\.codex\\worktrees\\direct-roadmap-integration\\Job tracker\\job-tracker-ui\\src\\application-assets.test.tsx","startTime":1793711407135,"status":"passed","summary":""}],"wasInterrupted":false}
diff --git a/docs/ui-modernisation/evidence/career/frontend/a3-letter-workflow-tests.log b/docs/ui-modernisation/evidence/career/frontend/a3-letter-workflow-tests.log
new file mode 100644
index 00000000..d6f6580a
--- /dev/null
+++ b/docs/ui-modernisation/evidence/career/frontend/a3-letter-workflow-tests.log
@@ -0,0 +1,10 @@
+
+> job-tracker-ui@0.1.0 test
+> jest --runInBand --watch=false --runTestsByPath src/application-assets.test.tsx --json --outputFile=../docs/ui-modernisation/a3-letter-workflow-tests.json
+
+Test Suites: 1 passed, 1 total
+Tests: 55 passed, 55 total
+Snapshots: 0 total
+Time: 44.128 s
+Ran all test suites within paths "src/application-assets.test.tsx".
+Test results written to: ..\docs\ui-modernisation\a3-letter-workflow-tests.json
diff --git a/job-tracker-ui/scripts/verify-a3-career.mjs b/job-tracker-ui/scripts/verify-a3-career.mjs
new file mode 100644
index 00000000..58f1a493
--- /dev/null
+++ b/job-tracker-ui/scripts/verify-a3-career.mjs
@@ -0,0 +1,130 @@
+// Actual exported React UI; synthetic API/render responses, no backend, model or provider access.
+import { chromium, expect } from '@playwright/test';
+import AxeBuilder from '@axe-core/playwright';
+import ts from 'typescript';
+import assert from 'node:assert/strict';
+import fs from 'node:fs';
+import path from 'node:path';
+const compiled = ts.transpileModule(fs.readFileSync(new URL('../src/i18n/translations.ts', import.meta.url), 'utf8'), { compilerOptions: { module: ts.ModuleKind.ESNext } }).outputText;
+const { translations } = await import(`data:text/javascript;base64,${Buffer.from(compiled).toString('base64')}`);
+const out = path.resolve(import.meta.dirname, '../../docs/ui-modernisation/evidence/career/browser');
+fs.mkdirSync(out, { recursive: true });
+const report = { screens: [], journeys: [], errors: [], unexpectedWrites: [], mockedWrites: [], renderReads: 0, unavailableReads: [], blockedExternal: [] };
+const browser = await chromium.launch();
+try {
+ const configurations = process.env.A3_BOUNDARY ? [320, 390, 768, 1000, 1001, 1440].map(width => [width, 'en', 'light']) : process.env.A3_PILOT ? [[320, 'en', 'light']] : [320, 390, 768, 1440].flatMap(width => ['en', 'nb'].flatMap(language => ['light', 'dark'].map(mode => [width, language, mode])));
+ for (const [width, language, mode] of configurations) {
+ console.log(`Checking ${width}/${language}/${mode}`);
+ const t = key => { assert.ok(translations[language][key], key); return translations[language][key]; };
+ 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 });
+ let career = { revision: 7, cvText: 'Retained raw source', profile: {
+ version: '1', metadata: { profileVersion: 4, fields: {} }, contact: { fullName: 'Alex Sample', email: 'alex@example.test' }, summary: ['Recorded teacher summary'], skills: ['Teaching'], languages: [{ name: 'Norwegian', level: 'A2' }],
+ projects: [{ id: 'project-one', name: 'Community project', role: 'Coordinator', start: '2024', end: '2025', bullets: ['Recorded outcome'], skills: ['Teaching'] }],
+ certifications: [{ id: 'cert-one', name: 'First aid', issuer: 'Recorded issuer', date: '2024', details: ['Recorded detail'] }],
+ jobs: [], education: [], interests: [], awards: [], publications: [], organisations: [], references: [], otherSections: [], sections: [],
+ }, completeness: { percent: 70, missing: ['Experience', 'Education'], sections: ['personal', 'summary', 'experience', 'education', 'skills', 'projects', 'languages'].map(key => ({ key, label: key, complete: !['experience', 'education'].includes(key), count: 1 })) } };
+ let variant = { id: 3, name: 'Teacher CV', version: 4, settings: { themeId: 'modern', showPhoto: false, showPageNumbers: false, showIcons: true, sections: [], overrides: {}, customSections: [] }, isPublic: false, publicSlug: 'synthetic', jobApplicationId: null, updatedAtUtc: '2026-11-03T10:00:00Z' };
+ let letter = { revision: 7, text: 'Dear team\n\nRecorded teaching experience.', currentVersion: 2, versions: [{ version: 2, source: 'manual', length: 45, createdAtUtc: '2026-11-03T10:00:00Z', isCurrent: true }], aiSuggestionCount: 0 };
+ const theme = { id: 'modern', name: 'Modern', category: 'Professional', description: 'Synthetic template', layout: 'header-band', accent: '#3157d5', photoShape: 'none', supportsIcons: false, atsFriendly: true, requiresPro: false, available: true, swatches: ['#3157d5'] };
+ await page.route('**/*', route => {
+ const req = route.request(), url = new URL(req.url()), p = url.pathname;
+ if (!['localhost', '127.0.0.1'].includes(url.hostname)) { report.blockedExternal.push(url.origin); return route.abort(); }
+ if (!p.startsWith('/api/')) return route.continue();
+ const answer = data => route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify(data) });
+ const note = action => report.mockedWrites.push({ width, language, mode, action });
+ if (req.method() === 'PUT' && p === '/api/career/profile') {
+ const body = req.postDataJSON(); assert.equal(body.expectedVersion, career.revision); assert.equal(body.cvText, career.cvText);
+ assert.equal(body.profile.projects[0].id, 'project-one'); assert.equal(body.profile.projects[0].name, 'Updated community project');
+ assert.deepEqual(body.profile.certifications, career.profile.certifications); assert.deepEqual(body.profile.metadata, career.profile.metadata);
+ career = { ...career, profile: body.profile, revision: career.revision + 1 }; note('canonicalProjectSave'); return answer(career);
+ }
+ if (req.method() === 'PUT' && p === '/api/cv/variants/3') {
+ const body = req.postDataJSON(); assert.equal(body.expectedVersion, variant.version); assert.deepEqual(body.settings, variant.settings);
+ variant = { ...variant, name: body.name, version: variant.version + 1 }; note('variantRename'); return answer(variant);
+ }
+ if (req.method() === 'PUT' && p === '/api/jobapplications/42/cover-letter') {
+ const body = req.postDataJSON(); assert.equal(body.expectedVersion, letter.revision); assert.equal(body.source, 'manual'); assert.equal(body.text, 'Dear team\n\nUpdated teaching experience.');
+ letter = { ...letter, text: body.text, revision: letter.revision + 1, currentVersion: 3 }; note('manualLetterSave'); return answer(letter);
+ }
+ if (req.method() === 'POST' && p === '/api/cv/preview') {
+ report.renderReads++; return answer({ themeId: 'modern', html: 'Controlled CV preview