diff --git a/docs/redesign/phase-7/COMMITS.md b/docs/redesign/phase-7/COMMITS.md
index 93cc7fd..3ccf756 100644
--- a/docs/redesign/phase-7/COMMITS.md
+++ b/docs/redesign/phase-7/COMMITS.md
@@ -20,6 +20,12 @@ Entry is the completed Phase6 successor receipt `b5319981ad3d1bd635daff861453d23
| P7-03 structured-editor presentation | `f7f6b774b912649116621de027474e9cfed33bec` | [Final report](p7-03/README.md#final-structured-editor-result), [immutable finite evidence](p7-03/evidence/editor-results.json): affected54/4 (+8/+1 suite), editor11/source-ID2/Career14/ordinary preservation2, fresh types/lint/build pass on W4fUO7_GUC0Qh5FuL3qVL; all13 final PNGs actually reviewed. Editor13 scans0violations/377 incompletes and separate Career22 scans0/99 retained with M09/M11/manual gates. Expanded raw/dirty-locale/pending/failure/readback proof passes; meaningful RED and coverage-limited historical captures remain. Implemented editor CONDITIONAL GO; final staged hygiene PASS (four commands0,10docs384links0errors,57groups32routes retained), normal development push directly verified2026-10-12 11:33:47.348560UTC: localHEAD=origin=live f7f6b774, local/origin/live main27657f3 unchanged and worktree clean at observation. Actual receipt appended by successor. Import/history and whole P7-03 unfinished; full626/91/browser227/backend1,034 derived only;57/32 unchanged/main NO-GO |
+| P7-03 editor receipt successor | `ec23b650f74ea71c51ea872c19a43983d62955e2` | Appends the actual f7f6b774 editor push receipt without changing measured source/test/build/runtime bytes. Normal metadata push directly verified2026-10-12 11:36:15.404136UTC: localHEAD=origin=live ec23b650, local/origin/live main27657f3 unchanged and worktree clean at observation. [Import/history entry](p7-03/evidence/import-history-entry.json) preserves this receipt and four exact committed Git-blob baselines; W4/75-file editor export inherited. Import/history implementation/verification remains PENDING; whole P7-03 unfinished |
+
Hashes and remote receipts are appended by a successor to avoid self-referential commit hashes. Each row records actual commands/results, source scope, remaining conditions, normal push and immediate direct remote identity; partial or blocked evidence is recorded without inventing success. Subsequent receipt metadata is a separately reviewable documentation unit, with its own hash reported after push rather than an endless receipt chain.
Execute the exact approved P7-00…P7-12 plus optional P7-06F from [the handoff](../phase-6/p6-05/PHASE7_HANDOFF.md). Commit boundaries follow owned workflow/consumer scope and preserve concurrent work. No Phase8 dashboard customization, P5-13 qualification/activation or gated production/lifecycle action is implied.
+
+### P7-03 import/history pending commit gate
+
+[Final results](p7-03/evidence/import-history-results.json): fresh76/6 affected,35 ordinary native (6new),98 unchanged-binary backend,24 guarded seeder, app/browser types/lint/build PASS;33 actual final image reviews with every incomplete retained. Source/export snapshots and failed attempts are preserved. Runtime/design implemented scope CONDITIONAL GO, final staged hygiene and normal development commit/push pending; actual hash/remote receipt follow after observation. Main remains27657f3/NO-GO,57groups/32routes unchanged.
diff --git a/docs/redesign/phase-7/DEBT.md b/docs/redesign/phase-7/DEBT.md
index 7d54d13..b5860c9 100644
--- a/docs/redesign/phase-7/DEBT.md
+++ b/docs/redesign/phase-7/DEBT.md
@@ -28,7 +28,7 @@ Production remains **NO-GO**, main unchanged. Independent bounded development ca
| RD18 | Board/CV physical selection/drag/drop/cancel/browser variants NOT VERIFIED | Applicable M03/M06/M12 physical evidence and named keyboard alternatives; no invented cross-section feature |
| RD19 | `followMode` producers/query metadata retained; reviewed consumer remains DEFERRED | P7-06F requires explicit mode→draft/review action/fallback before implementation; no auto-send/resend |
| RD20 | P5-05 optional read-only quick preview remains DEFERRED; unsupported NEW/OD and Phase8 scope remain reserved | No second full editor or early Dashboard order/resize/reset/cross-device widget framework |
-| RD21 | Canonical profile/job stale-save and creation-intent idempotency remain OPEN, separate from verified CV revision | Resolve or explicitly bound concurrency before save/history expansion. Separate P7-03 entry: reproduce/repair optional stable source-ID preservation, then dirty-locale and held-PUT/pending-write ownership/recovery proof before structured presentation |
+| RD21 | Canonical profile/job stale-save and creation-intent idempotency remain OPEN, separate from verified CV revision | Forward-ID compatibility and structured dirty-locale/held-PUT guards have bounded proof; stale200/last-writer and absent backend expected-version protection remain. Import/history candidate local mutexes do not fix cross-tab/server concurrency. Acceptance may commit canonical data before later Identity failure; retain partial-write/recovery qualification |
| RD22 | F20 enabled-worker outage recovery/durability remains OPEN | Inspect intended gates; recovery/no-loss/no-duplicate proof before new enabled producers; no worker activation |
| RD23 | F21 calendar offset/DST/date-only semantics remain OPEN | P7-05/06 retains existing links; dedicated contract/provider proof before semantic changes or scheduling claims |
| RD24 | Billing/deletion/retention/tombstone/provider-cleanup policy/configuration UNVERIFIED | P7-09 presentation only; no checkout/deletion/restore activation or guessed policy |
@@ -109,8 +109,16 @@ RD21 now has actual stale200/last-writer/append-restore/raw-current/owner-denial
[Final editor evidence](p7-03/evidence/editor-results.json) adds bounded dirty-locale/no-refetch, held structured/raw editing locks, localized generic fallback and durable server-detail retry proof: affected54/4, ordinary editor11 plus applicable source-ID2/Career14/preservation2, fresh types/lint/build PASS; all13 final PNGs actually reviewed. Root-overflow is0 for the finite samples. Editor13 scans retain0violations/377 incompletes (362overlap,13short badge,1obscured actual400 context,1hidden import-select portal); separate Career22 scans retain0/99 including3hidden evidence-select portals. M09/M11 and capture-context focus, humanAT/touch/zoom/provider/output requirements remain open. Expanded raw-helper RED and earlier collapsed-panel coverage gap are preserved; original first-build export loss remains explicit. Implemented editor CONDITIONAL GO with final staged hygiene PASS and normal pushf7f6b774 directly verified2026-10-12 11:33:47UTC, localHEAD=origin=live/clean/main unchanged. No RD21 concurrency repair, automatic orphan remap, full regression, import/history closure or production GO is inferred; all57/32 statuses and C11/Phase8 gates remain.
+Import/history enters at clean, pushed metadataec23b650 (11:36:15UTC); [entry evidence](p7-03/evidence/import-history-entry.json) retains committed baselines and inherited W4 export. The [current candidate](p7-03/README.md#importhistory-candidate-implementation-and-pending-final-validation) implements scoped history/diff error recovery, local pending-write guards, stale comparison invalidation, retained review choices and stable focus. Earlier affected76/6 passed before the latest focus/inline-Alert changes; final unit/native/build/visual/axe/hygiene/push acceptance remains pending. Initial +20/646 expectations are historical, superseded by22 new cases/2 suites and derived648/93; prospective ordinary233 adds6 cases, with no new full-suite execution claim.
+
+Native W4 baseline0/6 and attempt1 1/5 retain an invalid missing-level French fixture; neither establishes valid Low French product RED. Attempts2/3 each retain4PASS/2FAIL; attempt4 retains5PASS/1FAIL after explicit reload fixes language setup. Its actual remaining NB320 `scrollable-region-focusable` target is the pending-ready inline success Alert message, not the initial Pro-notice attribution. The latest owner-local Career Alert wrapping/overflow correction awaits final affected validation; no global theme/framework change or completed reader qualification follows. Corrected stored Low Contact verifies actual HTTP reachability, explicit selection and unchanged account email; it qualifies no extraction/model/provider. Controlled comparison labels are localized, imported facts remain verbatim, and server summaries/truncation plus un-compared custom/parsed sections/metadata are disclosed. Backend expected-version protection remains absent and canonical acceptance can precede later Identity failure. Keep RD21/M09/M11, previous manual/provider/output/production gates and old orphan recovery open; no lifecycle/schema/renderer/model or Phase8 expansion follows.
+
The early Phase6 runner retained exact failure commands/reports/logs but reused result folders, so not all old screenshots/traces/error-context paths remain resolvable. Later runs archive the whole previous output; current successful attachments have exact provenance. Preserve that limit rather than claiming complete old failure-trace retention. Native Windows Chromium/local SQLite/synthetic fixtures and finite PDF oracles do not establish deployed Linux, human semantics, physical devices, real provider quality or production load.
API transferSize0 is unavailable cross-origin timing information, not zero network bytes. CDP document/node/heap snapshots can retain earlier navigation/CV iframe documents and do not prove leak/growth. The existing measured Board/Dashboard candidates require baseline/comparative evidence before a repair or capacity claim.
Production remains NO-GO until RD01–05/RD27 plus effective schema/configuration/secrets/provider/F19, complete off-host recovery and isolated Linux rollback/deployed smoke requirements have operator evidence and a separate release decision. The workflow deploys on main push; the owner explicitly keeps main unchanged during this mission. No destructive/provider/production action is authorised by this debt table.
+
+### P7-03 Import/history conditional disposition
+
+[Final import/history evidence](p7-03/evidence/import-history-results.json) records fresh affected76/6, ordinary native35 (6new), unchanged-binary backend98, seeder24, app/browser types/lint/build PASS on _ZuuD2E8lPzbPiP8Dve7Q/75-file export. Actual source/history, select/deselect/accept/discard/replay, account-email separation, tenant/anonymous denial, dirty recovery and sibling/override/frozen readback pass. Named scoped feedback, pre-pending focus and owner-local narrow Alert wrapping are corrected. All17 new images plus16 representative regression images are inspected;54 retained total. Import17 scans0/302, editor13 scans0/377 and Career22 scans0/99 remain fully qualified; M09/M11 overlap/portal/foreground contexts and reader/device requirements stay open. Runtime/design implemented P7-03 CONDITIONAL GO; final hygiene/push pending. All57 statuses/32 routes unchanged. RD21/backend concurrency and partial-write recovery, old orphan records, provider/output/human gates remain; no schema/model/PDF activation or production GO. New22/2 yields648/93 and native+6 yields233 only as derived totals; full573/89/backend1,033/sidecar49 remain inherited pending P7-12.
diff --git a/docs/redesign/phase-7/PRESERVATION.md b/docs/redesign/phase-7/PRESERVATION.md
index 6b6cea0..1ce7aab 100644
--- a/docs/redesign/phase-7/PRESERVATION.md
+++ b/docs/redesign/phase-7/PRESERVATION.md
@@ -121,6 +121,14 @@ Stable job/education/certification/project IDs dropped by the existing normalize
[Final editor evidence](p7-03/evidence/editor-results.json) records affected54/4 and native editor11/source-ID2/Career14/preservation2 PASS, with fresh types/lint/build and13 actual final image reviews. C01/C02/E08/E09 retain canonical fields, contextual actions, structured/raw dirty-locale drafts, held-save locks/snapshot ownership, recoverable500/actual400 feedback, keyboard/labels and finite320–1920 reflow. C07/W07 retain matching source IDs, sibling overrides and ordinary frozen P2-D01/mobile-override readback. No schema, authorization, data-saving, document-renderer or model qualification change occurs. Editor13 all-enabled scans0/377 and separate Career22 scans0/99 retain every incomplete category and M09/M11 contextual/reader qualification; source-ID/preservation have0axe scans. Implemented editor CONDITIONAL GO, final staged hygiene PASS and normal pushf7f6b774 directly verified2026-10-12 11:33:47UTC, localHEAD=origin=live/clean/main unchanged; import/history and whole P7-03 unfinished. All57 rows remain56 PARTIAL/C11 DEFERRED and32 routes retained; no wholesale PASS follows.
+The [import/history entry](p7-03/evidence/import-history-entry.json) is identity evidence at pushed metadataec23b650, with four exact committed baselines and inherited W4 export; it adds no runtime PASS. C01–C04/E08/E09 and C07/W07 require explicit low-confidence review, dirty/pending/restore/error recovery and canonical/sibling/frozen readback before the second slice is accepted. Existing57 statuses/32 routes, RD21 and manual/deferred/production gates remain unchanged.
+
+### P7-03 import/history candidate; acceptance pending
+
+The [candidate record](p7-03/README.md#importhistory-candidate-implementation-and-pending-final-validation) covers C01/C02/C03/E08/E09 history loading/error/empty states, retained rows and scoped retry; dirty/pending Restore guards; generation-scoped comparisons and invalidated earlier choices; explicit Accept/Discard and string-ID operation guards; durable errors and stable focus. Imported facts remain verbatim, with localized controlled/synthetic labels and visible partial-comparison scope. Existing source/save/history owners, append-only restore/CURRENT raw semantics and C07/W07 selected/sibling/frozen boundaries remain the preservation targets; no backend/schema/renderer or model qualification change is claimed.
+
+Earlier affected76/6 passed before the latest focus/inline-Alert correction; final units/native/build/visual/axe/hygiene/push acceptance is pending. Native W4 baseline0/6 and attempt1 1/5 used an invalid missing-level French premise, so they are not valid Low French product RED. Attempts2/3 retain4PASS/2FAIL. Attempt4 retains5PASS/1FAIL after language setup recovery; its actual remaining NB320 target is the pending-ready inline success Alert message, not the initial Pro-notice attribution. The subsequent owner-local Alert correction covers the existing Career container; its final affected gates remain pending. Corrected Low Contact receives real-HTTP reachability/selection/account-email checks before acceptance. New22 units/2 suites yield only derived648/93;6 prospective ordinary native cases yield233. All57 rows remain56 PARTIAL/C11 DEFERRED and32 routes retained. RD21 expected-version/partial-write risk and all human/provider/output/production qualifications stay open.
+
[INVENTORY.md](p7-00/INVENTORY.md#current-route-coverage) reconciles exactly32 current App patterns against [route acceptance](../phase-5/p5-15/ROUTE_ACCEPTANCE.md); all whole-route groups remain PARTIAL. Preserve Board/Application/mail aliases and actual query/hash/state behavior, section/sub precedence, safe internal from, numeric navigation-helper output, capture consumption, focusJobId and provider/token destinations. No Documents/Notifications/aggregate Admin/new Career destination is inferred without contract/content evidence.
P2-D01 remains the ordinary passing [frozen-workspace test](../../../job-tracker-ui/e2e/redesign-preservation.spec.ts#L73), retaining native capture/readback/archive bytes/canonical/sibling proof. No skip, expected-failure marker or relaxed oracle may replace it. Preserve server roles/account/tenant/owned-resource denial; canonical Career versus CV overrides; revision/conflict/recoverable drafts; private/public PDF admission/revocation; unchanged physical pagination; immutable packages; existing grounding/proposal/stale guards and Production C11 withholding.
@@ -128,3 +136,7 @@ P2-D01 remains the ordinary passing [frozen-workspace test](../../../job-tracker
[DEBT.md](DEBT.md) carries actual M01–M12 reader/device/contextual requirements, M13 deferred AI-return restriction, retained319 mixed-scope axe snapshots and all reliability/provider/output/release dependencies. Scoped company/language feedback repairs do not close unknown server causes or whole manual acceptance.
Complete affected migration acceptance requires applicable evidence or an explicit conditional disposition. Production stays **NO-GO** until its independent operational gates and release decision pass; no main push, destructive operation or unsupported activation follows from this matrix.
+
+### P7-03 Import/history reconciliation
+
+[Final import/history evidence](p7-03/evidence/import-history-results.json) records fresh affected76/6, ordinary native35 (6new), unchanged-binary backend98, seeder24, app/browser types/lint/build PASS on _ZuuD2E8lPzbPiP8Dve7Q/75-file export. Actual source/history, select/deselect/accept/discard/replay, account-email separation, tenant/anonymous denial, dirty recovery and sibling/override/frozen readback pass. Named scoped feedback, pre-pending focus and owner-local narrow Alert wrapping are corrected. All17 new images plus16 representative regression images are inspected;54 retained total. Import17 scans0/302, editor13 scans0/377 and Career22 scans0/99 remain fully qualified; M09/M11 overlap/portal/foreground contexts and reader/device requirements stay open. Runtime/design implemented P7-03 CONDITIONAL GO; final hygiene/push pending. All57 statuses/32 routes unchanged. RD21/backend concurrency and partial-write recovery, old orphan records, provider/output/human gates remain; no schema/model/PDF activation or production GO. New22/2 yields648/93 and native+6 yields233 only as derived totals; full573/89/backend1,033/sidecar49 remain inherited pending P7-12.
diff --git a/docs/redesign/phase-7/README.md b/docs/redesign/phase-7/README.md
index c8040e4..61859d0 100644
--- a/docs/redesign/phase-7/README.md
+++ b/docs/redesign/phase-7/README.md
@@ -11,7 +11,7 @@ The entry commit is `b5319981ad3d1bd635daff861453d23c0de5320b` on `codex/ui-rede
| [P7-00](p7-00/README.md) | Fresh scope inventory and fixture baseline | Complete finite identity/route/matrix/static checks; inherited runtime separated. Push receipt recorded by the successor before page changes |
| [P7-01](p7-01/README.md) | Authentication and account-security presentation | Public sub-slice CONDITIONAL GO, pushed8ad720d with direct receipt; account implementation/runtime/actual8-image review CONDITIONAL GO (573/89 +6/22/10); pushedad7b419 with final static PASS/direct receipt19:16:15UTC; main unchanged |
| [P7-02](p7-02/README.md) | Onboarding and Career overview/evidence | Entryad7b419 pushed/verified; bounded onboarding CONDITIONAL GO32/13/4+types/lint/build/13 actual PNG inspections, hygiene PASS and d21501aa push verified23:55:12UTC. Separate SQLite evidence-list repair91 guards/HTTP1/Release passed, pushed01281f52/direct receipt00:06:47UTC with unfinished Career work preserved. Career affected46/3/native14/preservation2/types/lint/build and actual22-image review pass; implemented checkpoint CONDITIONAL GO with99 incompletes/manual gates. Career final hygiene PASS (four commands0,9docs347links0errors); normally pushed8b4d5c2/direct localHEAD=origin=live receipt05:51:04UTC, clean worktree/main unchanged |
-| [P7-03](p7-03/README.md) | Career structured editing and import review | Forward-ID/null-metadata repair3047 and hygiene704637a normally pushed/directly verified06:34:48UTC; original staged EOF failure retained. Structured-editor implemented scope CONDITIONAL GO: affected54/4, native editor11/source-ID2/Career14/preservation2, types/lint/build PASS; all13 final PNGs inspected,13 scans0violations/377 incompletes retained. Final staged hygiene PASS; normal editor pushf7f6b774 directly verified2026-10-12 11:33:47UTC, localHEAD=origin=live/clean/main unchanged; import/history presentation remains PENDING. Stale contract characterized without concurrency repair; manual/provider/production gates remain |
+| [P7-03](p7-03/README.md) | Career structured editing and import review | Source-ID and structured-editor commits pushed; final import/history runtime/design CONDITIONAL GO: affected76/6, native35, backend98/seeder24, types/lint/build PASS;33/54 final images inspected. Import17 scans0/302, editor13 scans0/377, Career22 scans0/99 retained. Final staged hygiene PASS; normal push pending. RD21/human/provider/output gates remain;57/32 unchanged |
| P7-04 | CV library and public entry | Existing gallery/editor and P7-03 source language; planned |
| P7-05 | Discovery, Companies, Offers and Reminders | Existing domain owners and Jobs return context; planned |
| P7-06 | Remaining Application forms and global correspondence | Existing seven-section workspace, immutable packages and draft/send owners; planned |
@@ -37,6 +37,8 @@ The [P7-01 public sub-slice](p7-01/evidence/public-auth-results.json) adds fresh
The separate [account runtime manifest](p7-01/evidence/account-results.json) records actual fresh573/89 full frontend, account6/public22/auth-boundaries10 and app/browser TypeScript/lint/build pass after truthful account-only stored-CV-text/unavailable-provider copy repairs. Full frontend521→573 adds52 cases/+4 suites without removals; exact file/name deltas remain recorded. Account8 scans retain0 violation nodes/85 incompletes and current public22 retain31 contrast incompletes, separately from the frozen public/Phase6 baselines. All eight final post-copy PNGs were actually inspected, with contextual axe/manual qualifications retained. Implemented P7-01 scope is CONDITIONAL GO; final staged finite hygiene passed and accountad7b419 was normally pushed, direct localHEAD=origin=live development equality verified2026-10-11 19:16:15UTC, main unchanged and worktree clean at observation. No whole-group/route upgrade follows from these finite results.
+The [P7-03 import/history candidate](p7-03/README.md#importhistory-candidate-implementation-and-pending-final-validation) adds scoped history/comparison recovery, dirty/pending mutation guards, explicit review choices and stable focus while preserving existing source/history owners. Earlier affected76/6 is candidate proof before the latest focus/inline-Alert corrections; final runtime/build/native/visual/axe/hygiene/push acceptance is pending. Corrected Low Contact is checked through real HTTP; invalid French native attempts remain fixture failures rather than valid product RED. Latest failed native attempt5/1 recovers language setup and identifies the actual NB320 pending-ready Alert message before the owner-local correction. Initial +20/646/93 expectations are superseded by22 new cases/2 suites and derived648/93; prospective ordinary233 adds6 to227. Latest actual full573/89, all57 statuses/32 routes, RD21, C11 and production/Phase8 limits remain unchanged.
+
## Working constraints
The [P7-02 onboarding slice](p7-02/evidence/onboarding-results.json) adds actual fresh affected32/2 (+23 cases over its nine-case inherited subset), ordinary native13 and separate Dashboard/Analytics4, app/browser types/lint/build and13 inspected final PNGs. Its13 all-enabled scans retain0 violation nodes/13 invisible-zero notification-badge contrast incompletes; no manual conformance or real provider grant is inferred. The retry-focus defect was reproduced by five strengthened unit cases and a focused native failure before correction. Latest full frontend573/89 remains inherited;596/89 is only a derived expectation. Onboarding implemented scope is CONDITIONAL GO final hygiene PASS and normal pushd21501aa/direct receipt23:55:12UTC; Career successor affected46/3/native14/preservation2 and22 actual image inspections now pass; implemented P7-02 scope is CONDITIONAL GO with final Career hygiene PASS and normal push8b4d5c2 directly verified05:51:04UTC, main unchanged. Its22 all-enabled scans retain0 violations/99 incompletes;610/89 is derived only, latest full573/89 unchanged. Frozen [Career results](p7-02/evidence/career-results.json) retain failures/source/export/manual qualifications;57 groups/32 routes unchanged and production NO-GO.
diff --git a/docs/redesign/phase-7/p7-03/README.md b/docs/redesign/phase-7/p7-03/README.md
index 82a4187..5c74fd4 100644
--- a/docs/redesign/phase-7/p7-03/README.md
+++ b/docs/redesign/phase-7/p7-03/README.md
@@ -1,6 +1,6 @@
# P7-03 — Career structured editing and import review
-**Status: structured editor CONDITIONAL GO; final staged hygiene PASS, normal editor pushf7f6b774 verified. Import/history presentation remains PENDING.** Follow the [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries): a structured-editor presentation commit, then a separate import/history presentation commit. The source-ID prerequisite was a separate bounded repair before those presentation changes; it does not introduce another checkpoint or schema.
+**Status: structured editor CONDITIONAL GO; final staged hygiene PASS, normal editor pushf7f6b774 verified. Import/history implementation is a candidate; final runtime/visual/hygiene/push acceptance remains PENDING.** Follow the [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries): a structured-editor presentation commit, then a separate import/history presentation commit. The source-ID prerequisite was a separate bounded repair before those presentation changes; it does not introduce another checkpoint or schema.
## Accepted entry and evidence limits
@@ -104,3 +104,64 @@ The source-ID prerequisite has bounded runtime/readback GO; repair3047b6c4 plus
### Verified structured-editor push
Normal commit/push `f7f6b774b912649116621de027474e9cfed33bec` is directly verified2026-10-12 11:33:47.348560UTC: localHEAD=origin=live development, local/origin/live main27657f3 unchanged and worktree clean at observation. Exact receipt bytes are frozen in `final-expanded/push-receipt.json` and linked from the manifest. This successor appends the observed receipt without changing measured runtime/source/build hashes. Those identities apply at f7f6b774 and their immutable snapshots after later legitimate import/history edits. Editor-only CONDITIONAL GO remains; import/history and whole P7-03, all manual/deferred/production gates remain unfinished.
+
+## Import/history entry and findings
+
+The editor receipt successor `ec23b650f74ea71c51ea872c19a43983d62955e2` was normally pushed and directly verified2026-10-12 11:36:15.404136UTC: localHEAD=origin=live development, local/origin/live main27657f3 unchanged and a clean worktree. [Import/history entry evidence](evidence/import-history-entry.json) freezes CareerProfilePage, CareerProfileSections, translations and ProfileCompleteness from exact ec23b650 Git blobs under `.artifacts/phase7/p7-03/import-history/baseline/source/`; concurrent worktree edits are excluded. The previous editor manifest is retained as a Git-object snapshot. W4 source/export identities apply historically at f7f6b774/ec23b650 and the existing immutable75-file export, without a new build or runtime claim. Prior editor54/4 and ordinary29 results are inherited here; latest full573/89 remains inherited,626/91/browser227/backend1,034 remain derived only.
+
+The following were entry source/review reproduction targets. The candidate and its recorded attempts follow below; this entry table is not final acceptance evidence:
+
+| Existing workflow | Reproduction target and bounded expected correction |
+|---|---|
+| Version history read | Reject the versions GET; distinguish request failure from genuine empty history and offer explicit local retry without changing restore semantics |
+| Extraction diff read | Reject a pending-review diff GET; replace indefinite loading with recoverable local feedback, keeping accept unavailable until a usable diff is obtained |
+| Review acceptance and stale result | Hold canonical save/review requests, then change source/run context; characterize pending-write collision and stale diff, preserve explicit low-confidence selections and prevent unowned completion from replacing the current draft |
+| Restore, retry/cancel and dirty draft | Restore while edited/pending, cancel deliberately and inject failures; make the operation state and retained draft clear while keeping established append-only history/owner guards |
+
+Follow the approved separate import/history presentation boundary. Use existing extraction/diff/select/accept/discard/reprocess/version owners, shared MUI feedback/confirmation and bilingual labels. No provider call on entry, silent acceptance, model qualification, new revision/schema protocol or automatic orphan remap is authorized. RD21's stale200/last-writer characterization remains a qualification. Required finite proof includes actual owner/foreign denial, canonical/sibling/frozen readback, low-confidence selection, retries/errors/pending locks, dirty-locale/history recovery, keyboard/focus and EN/NB/theme/narrow states with every axe finding retained. **Candidate unit outcomes are recorded below; final affected unit/native/build/visual/static/push acceptance remains PENDING and whole P7-03 is unfinished.**
+
+### Import/history unit evidence in progress
+
+Six exact command/report/log sets are retained under `.artifacts/phase7/p7-03/import-history/history/unit-baseline-attempts/`; [entry evidence](evidence/import-history-entry.json) links their aggregate. Child history RED16:07:58UTC passes1/fails7 of8; its focused GREEN16:11:21 passes8/8. The first parent12-case attempt16:10:15 passes0/fails12 because hidden-Save readiness prevented setup; **it is a setup failure, not product RED**. Corrected readiness RED16:11:59 passes2/fails10. First combined candidate16:16:45 passes15/fails5 of20; scoped alert and string-operation handling are then corrected and candidate16:18:38 passes20/20. These raw outcomes remain visible; no final source/native/visual/hygiene acceptance follows. The initial two-suite/+20-case expectation646/93 is historical, superseded below by22 new cases without removing those20. Latest full573/89 remains inherited.
+
+Comparison values are server-provided summaries, with some truncated/count-based values; the interface must state that custom/parsed sections and metadata are outside the comparison. Backend expected-version protection is absent from this contract and RD21 remains open. Acceptance may commit canonical data before the later identity refresh fails; record that partial-write/recovery qualification explicitly rather than reporting no write. Local pending-review fixtures do not activate workers, a model or a backend feature.
+
+### Import/history candidate implementation and pending final validation
+
+The candidate retains CareerProfilePage as the fetch/save/review owner and ProfileCompleteness as a display-only child. Version history now distinguishes loading, failed reads and genuine empty history, retains known rows during failures and retries only its history GET. Zero/one-version states are visible; longer histories keep the default-collapsed disclosure and12-row cap. Dirty or pending canonical state blocks Restore, with contextual version labels and durable failure feedback. The existing append-only restore payload and CURRENT raw source remain unchanged.
+
+Per-run comparison loading/errors and read generations reject stale completions; successful source Save/Restore invalidates comparisons and earlier low-confidence choices. A synchronous local profile mutex guards Save/Restore/Parse/Accept, a review mutex guards Accept/Discard, and operation guards use the actual string operation ID. Explicit failures retain drafts/choices for retry. Stable named history/run targets receive focus before pending actions replace or disable their controls. The partial comparison scope is visible; controlled labels and the synthetic Low Contact label are localized while imported facts remain verbatim. These are local UI guards, not backend expected-version or cross-tab concurrency protection. The latest owner-local inline-Alert wrapping/overflow correction applies across the existing Career overview/editor/import/history/evidence container and replaces the duplicated Pro wrappers; it adds no global framework/theme, backend/schema, renderer, provider or model change. Its affected final gates remain pending.
+
+Peer-review unit RED18PASS/3FAIL at16:25:15UTC is followed by21/2 GREEN; the synthetic Contact-label RED13PASS/1FAIL at16:38:42UTC extends the parent suite to14 cases. Affected candidate76/6 passes16:39:49–16:40:39UTC before the later action-focus and inline-Alert corrections. The strengthened held-action focus regression records13PASS/1FAIL at17:10:18UTC. Final affected units and applicable type/lint/build/native lanes are being validated separately; these earlier outcomes are not final acceptance. New history8+import14 =22 cases across2 suites yield **648/93 frontend** as a derived expectation from626/91. Six new native cases would yield **233 ordinary browser** from227. Latest actual full frontend remains inherited573/89; backend1,034 and both new totals remain derived, with no removals, skips or new whole-suite claim.
+
+| Retained native attempt | Actual result | Qualification |
+|---|---|---|
+| `native-baseline-w4` | 0PASS/6FAIL | The missing-level French fixture cannot establish the intended Low-confidence state through the actual API; this is invalid fixture/setup evidence, not a valid Low French product RED |
+| `native-attempt1-3dik` | 1PASS/5FAIL | The same invalid French premise remains; retain its raw failures without assigning them product-repair acceptance |
+| `native-attempt2-rury` | 4PASS/2FAIL | Accumulating locale init scripts caused one setup failure; NB320 exposed an actual `scrollable-region-focusable` violation, initially attributed to the Pro notice. Both observations remain retained |
+| `native-attempt3-cav7` | 4PASS/2FAIL | Retained failed candidate; its report/source context is not final acceptance |
+| `native-attempt4-qhax` | 5PASS/1FAIL,17:14:26–17:14:59UTC | Explicit reload fixes repeat-navigation language setup. The remaining actual NB320 focusability violation targets the pending-ready inline success Alert message, not the Pro notice |
+
+Attempt4's frozen result SHA256 is `04203026006e59c54d43b21f60be58a50723cd81aaa4ecf053db2d4c62da6c73`; earlier attempts remain separate. Root then corrected inline Alert wrapping/message flex basis/overflow at the existing Career outer container. Fresh76-case units, applicable native lanes and type/lint/build are running again; no final native or notice-fix PASS is inferred from the failed attempts.
+
+The corrected native fixture uses an email-only incoming Contact, verifies actual HTTP Low confidence/ID`Contact`/Email changes before UI interaction, and checks that professional contact acceptance does not change account email. The six-case pack targets explicit select/deselect/accept/discard, replay and foreign/anonymous denial, source/history and selected/sibling/frozen snapshot readback, scoped controlled read failures, keyboard focus and paired EN/NB/light/dark finite widths. Seeder and controlled-response provenance remain explicit; stored review does not qualify extraction, a model, output or a real provider. Final native/build identity, axe/incomplete inventory, actual image inspection, hygiene and normal push are **PENDING**. Whole P7-03 remains unfinished; all57 groups stay56 PARTIAL/C11 DEFERRED with32 routes, production NO-GO/main unchanged and Phase8 separate.
+
+## Final import/history finite result
+
+[Import/history results](evidence/import-history-results.json) supersede the preceding in-progress statuses. Final affected **76/6** pass2026-10-12 17:16:39–17:17:35UTC. The ordinary native pack passes **35/35**,17:17:31–17:20:48UTC: import/history6, editor11, source-ID2, Career14 and ordinary frozen/mobile preservation2. All have0failed/skipped/flaky/retries. Fresh app/browser TypeScript, lint and production build pass. The unchanged-API98/98 backend subset passes16:27:19–16:27:23UTC; its TRX/log and guarded isolated-SQLite seeder24/24 receipt are copied into the immutable final evidence. These subsets are not fresh whole-suite totals.
+
+Build `_ZuuD2E8lPzbPiP8Dve7Q` is frozen with75 exact export files; export digest is `22e9f8693243dd8a5bb3bc383486592c7b733ff28c0237efd6732351d0c0ce3a`. Eighteen source/test/config/helper snapshots match current canonical UTF-8/LF. The final import capsule SHA256 is `d1a91f38ca6aa26a14e667a5d4c65e1403e279c16eef119593a991cc11835119`; separate regression capsule is `07ab3d63338be32eb21ea91ea3bab5c23d5d4e90965ae24889f59c3f5c5cb4e5`. Failed historical capsules and exact unit transitions remain separately qualified. Two collector argument mistakes were rejected before writing: an incomplete capsule path and a nonmatching build ID; neither creates acceptance evidence.
+
+The existing owners now present named H2/H3 sections, contextual version restore, durable history/comparison/action failures and explicit local retry. Pending accept shares the canonical editor write guard; stale diff reads are invalidated after source changes. Discard preserves dirty structured/raw drafts; dirty source blocks restore/accept. Review/operation focus transfers before actions become disabled. Controlled category/field/status labels and synthetic Low Contact are bilingual; imported facts remain verbatim. Current/imported server summaries and fields outside comparison are disclosed. CURRENT raw is distinguished from pending extraction text. Owner-local inline Alert wrapping fixes both narrow Pro and pending-ready success message scroll barriers without a new component/framework or global theme change.
+
+Fresh import/history17 all-enabled axe scans retain **0violations/302 incompletes**:285 background overlap and17 short/invisible-zero badge. Fresh editor13 retain0/377 (362overlap,13badge,1partly obscured actual400 feedback,1hidden-select portal); Career22 retain0/99 (74overlap,22badge,3hidden-select portals). Source-ID/preservation lanes have0axe attachments. Complete nodes/checks and contextual examples remain hashed. Overlap, actual contrast and hidden portal tab sequence remain M09/M11 requirements; no incomplete result is suppressed or counted as human acceptance.
+
+Root actually inspected **33 of54 retained final PNGs**: all17 new import/history plus8 editor,6 Career overview/evidence/error and2 source/frozen captures. Remaining21 regression images are retained without a new inspection claim. Eight widths320/360/390/768/1024/1280×320/1440/1920 cover paired review/history, EN/NB and light/dark; finite root overflow is0. Full-page images retain scrolled/focused sticky-header/skip-link contexts and tall-image resizing; they do not prove top-of-page alignment or physical zoom/device behavior. Frozen-dialog transparency/settled rendering remains its prior contextual qualification.
+
+The actual additions are22 frontend cases/two suites (14import+8history) and6 ordinary browser cases. **648/93 frontend,233 ordinary browser and1,034 backend are derived only**; latest whole frontend573/89/backend1,033/sidecar49 and rendering16/36+8/24 remain inherited pending P7-12/applicable output rerun. No tests removed, skipped or relaxed.
+
+**Implemented P7-03 runtime/design scope CONDITIONAL GO; final hygiene and normal push pending.** All57 groups remain56 PARTIAL/C11 DEFERRED and32 routes retained. Canonical/sibling/CV override/history/frozen and owner/anonymous denial readback pass in bounded scope. RD21 absent backend ExpectedVersion/idempotency, partial canonical commit before identity-refresh failure, old orphan recovery and M01–M12/provider/output requirements remain open. M13/P5-13 stays withheld; no model qualification/provider/Docker/schema/renderer change. Production remains NO-GO/main unchanged; Phase8 separate. P7-04 library/public entry is the next approved independent checkpoint after the commit/push gate.
+
+### Final import/history staged hygiene
+
+[Final staged checks](evidence/import-history-static-checks.json) pass2026-10-12 17:26:45–17:26:48UTC: secret scan plus working/staged/Phase7-entry whitespace all exit0;10 Markdown documents/397 local links have0 errors,57 qualified groups/32 routes retained and main27657f3 unchanged. Canonical JSON SHA256877c554c28ba6b19c49529dff56f7ed0966fe5a24590be582f857ac28d12fde9; exact JSON/four raw logs are frozen in the final capsule. Independent finite recheck verifies373 references/249 unique files,18 current source/test/config/helper snapshots,75 exported files, unchanged API binary and actual98/35 backend/native totals. Earlier pending hygiene statements are superseded; implemented whole P7-03 CONDITIONAL GO with normal commit/push pending. The same manual/deferred/provider/output/concurrency/production qualifications remain.
diff --git a/docs/redesign/phase-7/p7-03/evidence/import-history-entry.json b/docs/redesign/phase-7/p7-03/evidence/import-history-entry.json
new file mode 100644
index 0000000..0251f87
--- /dev/null
+++ b/docs/redesign/phase-7/p7-03/evidence/import-history-entry.json
@@ -0,0 +1,209 @@
+{
+ "schemaVersion": 1,
+ "checkpoint": "P7-03",
+ "slice": "Import review/history presentation",
+ "status": "ENTRY_RECORDED;IMPLEMENTATION_UNIT_NATIVE_VISUAL_STATIC_PUSH_PENDING",
+ "entryCommit": "ec23b650f74ea71c51ea872c19a43983d62955e2",
+ "metadataPushReceipt": {
+ "observedUtc": "2026-10-12T11:36:15.404136+00:00",
+ "branch": "codex/ui-redesign-phase4",
+ "head": "ec23b650f74ea71c51ea872c19a43983d62955e2",
+ "originDevelopment": "ec23b650f74ea71c51ea872c19a43983d62955e2",
+ "liveDevelopment": "ec23b650f74ea71c51ea872c19a43983d62955e2",
+ "main": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
+ "originMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
+ "liveMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
+ "workingTreeClean": true,
+ "pendingPaths": [],
+ "commands": [
+ {
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "branch",
+ "--show-current"
+ ],
+ "exitCode": 0,
+ "stdout": "codex/ui-redesign-phase4\n",
+ "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n"
+ },
+ {
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "rev-parse",
+ "HEAD"
+ ],
+ "exitCode": 0,
+ "stdout": "ec23b650f74ea71c51ea872c19a43983d62955e2\n",
+ "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n"
+ },
+ {
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "rev-parse",
+ "origin/codex/ui-redesign-phase4"
+ ],
+ "exitCode": 0,
+ "stdout": "ec23b650f74ea71c51ea872c19a43983d62955e2\n",
+ "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n"
+ },
+ {
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "rev-parse",
+ "main"
+ ],
+ "exitCode": 0,
+ "stdout": "27657f31131cd95d42f0e1290853ec9c9b3959a4\n",
+ "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n"
+ },
+ {
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "rev-parse",
+ "origin/main"
+ ],
+ "exitCode": 0,
+ "stdout": "27657f31131cd95d42f0e1290853ec9c9b3959a4\n",
+ "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n"
+ },
+ {
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "ls-remote",
+ "origin",
+ "refs/heads/codex/ui-redesign-phase4",
+ "refs/heads/main"
+ ],
+ "exitCode": 0,
+ "stdout": "ec23b650f74ea71c51ea872c19a43983d62955e2\trefs/heads/codex/ui-redesign-phase4\n27657f31131cd95d42f0e1290853ec9c9b3959a4\trefs/heads/main\n",
+ "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n"
+ },
+ {
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "status",
+ "--porcelain=v1"
+ ],
+ "exitCode": 0,
+ "stdout": "",
+ "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n"
+ }
+ ]
+ },
+ "metadataPushReceiptRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/baseline/receipt-commit-push.json",
+ "sha256": "7cc5ff2ae144316a18f5400c8a8c4e745f8cc7a88dd9f498961c8642ff110e65",
+ "bytes": 2849,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "sourceBaseline": [
+ {
+ "originalSourcePath": "job-tracker-ui/src/views/CareerProfilePage.tsx",
+ "gitObject": "ec23b650f74ea71c51ea872c19a43983d62955e2:job-tracker-ui/src/views/CareerProfilePage.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/baseline/source/job-tracker-ui/src/views/CareerProfilePage.tsx",
+ "sha256": "e915b24ab000a6d8b5c2c8c3aaef2f81ddaa2c434a31c6edb0ff4aded1ea5b24",
+ "bytes": 49443,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "qualification": "Exact committed Git blob UTF-8/LF, not concurrently edited worktree bytes."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/views/career/CareerProfileSections.tsx",
+ "gitObject": "ec23b650f74ea71c51ea872c19a43983d62955e2:job-tracker-ui/src/views/career/CareerProfileSections.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/baseline/source/job-tracker-ui/src/views/career/CareerProfileSections.tsx",
+ "sha256": "aa3acbe472d34074a517a566c77983e7d95f8ec1df9ee37e47537ad96beffd0e",
+ "bytes": 20131,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "qualification": "Exact committed Git blob UTF-8/LF, not concurrently edited worktree bytes."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/i18n/translations.ts",
+ "gitObject": "ec23b650f74ea71c51ea872c19a43983d62955e2:job-tracker-ui/src/i18n/translations.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/baseline/source/job-tracker-ui/src/i18n/translations.ts",
+ "sha256": "3f737cdfb26c2ca654ab19089b1987fb973e05611a07e5597f2d0e199c28bd9f",
+ "bytes": 309142,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "qualification": "Exact committed Git blob UTF-8/LF, not concurrently edited worktree bytes."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
+ "gitObject": "ec23b650f74ea71c51ea872c19a43983d62955e2:job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/baseline/source/job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
+ "sha256": "ead89addfc9df54e10b81a8003365f27d01a5ab53d428c9e8143030804119f6c",
+ "bytes": 4292,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "qualification": "Exact committed Git blob UTF-8/LF, not concurrently edited worktree bytes."
+ }
+ ],
+ "priorEditorManifest": {
+ "path": ".artifacts/phase7/p7-03/import-history/baseline/entry-editor-results.json",
+ "sha256": "d75670e573af9b5fa3bb921628396dd86c6ea38d07d61dc7b4a8ec9633d06d8a",
+ "bytes": 259416,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "compiledBaseline": {
+ "sourceCommit": "f7f6b774b912649116621de027474e9cfed33bec",
+ "receiptCommit": "ec23b650f74ea71c51ea872c19a43983d62955e2",
+ "buildId": "W4fUO7_GUC0Qh5FuL3qVL",
+ "exportSha256": "6e60c305555153d3379be3dac24c0845cf7665855bb7bcba95b26b9131cfd33c",
+ "exportFiles": 75,
+ "immutableRoot": ".artifacts/phase7/p7-03/editor/final-expanded",
+ "qualification": "Previously measured W4 export/source evidence inherited unchanged; no new compilation/runtime execution."
+ },
+ "freshVerification": "Four exact committed Git-blob snapshots verified; no new tests or builds invoked.",
+ "inheritedAffected": "Editor54/4;native editor11/source-ID2/Career14/preservation2;types/lint/build;13 actual editor image reviews and final editor hygiene PASS.",
+ "fullCounts": {
+ "frontendLatestActual": "573/89 inherited P7-01",
+ "frontendDerivedOnly": "626/91",
+ "browserDerivedOnly": 227,
+ "backendActual": "1033 inherited Phase6",
+ "backendDerivedOnly": 1034,
+ "sidecarActual": "49 inherited",
+ "renderingActual": "16 original cases/36 pages +8 settings cases/24 pages inherited unchanged"
+ },
+ "openFindings": [
+ "Failed versions read can appear as empty history",
+ "Failed diff read can retain indefinite loading",
+ "Accept/pending canonical write collision and stale diff need ownership characterization",
+ "Dirty restore, retry/cancel pending and local operation states need meaningful proof"
+ ],
+ "findingQualification": "Entry source/review findings for reproduction; no new executed failure or passing acceptance claimed.",
+ "preservation": "All57 groups remain56 PARTIAL/C11 DEFERRED;all32 routes retained.",
+ "gates": "RD21 stale200/last-writer characterization is not concurrency repair; no automatic old-orphan remap, schema/provider/model/PDF activation. M01-M12 pending;M13/P5-13 deferred;production NO-GO/main unchanged;Phase8 separate.",
+ "unitHistory": {
+ "path": ".artifacts/phase7/p7-03/import-history/history/unit-baseline-attempts/results.json",
+ "sha256": "a1958ab74b69cb4f0ab261759a4b34c081b6a8ebed27b2e35c091424ce8e9198",
+ "bytes": 21878,
+ "hashPolicy": "Exact saved raw bytes",
+ "classification": [
+ "Child1PASS7FAIL→8PASS of8",
+ "Parent first0PASS12FAIL is readiness setup failure, not productRED",
+ "Corrected parent2PASS10FAIL is meaningfulRED",
+ "First combined15PASS5FAIL→candidate20PASS20total;not finalacceptance"
+ ],
+ "qualification": "No as-run source identity inferred retroactively. New unit/source/native/build/visual/static/push gates remain pending."
+ },
+ "comparisonBoundary": "Server summary/truncated/count values;custom and parsed sections/metadata not compared. No backendExpectedVersion/RD21repair. Canonicalaccept can precede failedidentityrefresh;partialwrite recovery qualification required.",
+ "plannedNewFrontendCounts": "Two new files,+20 cases/+2 suites would yield646/93 only after finalsuccess;latest full573/89 inherited;no newnativecount assumed."
+}
diff --git a/docs/redesign/phase-7/p7-03/evidence/import-history-results.json b/docs/redesign/phase-7/p7-03/evidence/import-history-results.json
new file mode 100644
index 0000000..f80d05f
--- /dev/null
+++ b/docs/redesign/phase-7/p7-03/evidence/import-history-results.json
@@ -0,0 +1,8460 @@
+{
+ "schemaVersion": 1,
+ "checkpoint": "P7-03",
+ "slice": "Import review/history",
+ "observedUtc": "2026-10-12T17:23:39.808431+00:00",
+ "status": "IMPLEMENTED_P7_03_CONDITIONAL_GO; FINITE_RUNTIME_VISUAL_AND_HYGIENE_PASS; NORMAL_PUSH_PENDING",
+ "finalCapsule": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/results.json",
+ "sha256": "d1a91f38ca6aa26a14e667a5d4c65e1403e279c16eef119593a991cc11835119",
+ "bytes": 115074,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "regressionCapsule": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/results.json",
+ "sha256": "07ab3d63338be32eb21ea91ea3bab5c23d5d4e90965ae24889f59c3f5c5cb4e5",
+ "bytes": 208880,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "units": [
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit/career-import-affected-alert-final-20261012T171639Z.json",
+ "sha256": "ffaaad357a13b8df8ab18674c98995e7068734499943ee58322a5a83d4d3b1b7",
+ "bytes": 32140,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "startedUnixMs": 1791825400646,
+ "passed": 76,
+ "failed": 0,
+ "pending": 0,
+ "total": 76,
+ "suites": 6,
+ "cases": [
+ {
+ "name": "failed history reads have a scoped Retry that preserves unsaved source fields",
+ "status": "passed"
+ },
+ {
+ "name": "a dirty canonical profile cannot be replaced through history restore",
+ "status": "passed"
+ },
+ {
+ "name": "each failed comparison can retry its own run without refetching canonical data or losing another comparison",
+ "status": "passed"
+ },
+ {
+ "name": "review shows actual current and imported values and discloses fields outside the comparison",
+ "status": "passed"
+ },
+ {
+ "name": "selecting then deselecting low-confidence data sends the explicit empty selection",
+ "status": "passed"
+ },
+ {
+ "name": "held acceptance locks review choices and all canonical editors and prevents duplicate or overlapping writes",
+ "status": "passed"
+ },
+ {
+ "name": "failed acceptance keeps the chosen stable IDs and shows durable translated recovery without automatically resending",
+ "status": "passed"
+ },
+ {
+ "name": "discarding an import preserves unsaved structured and raw drafts and does not reload the canonical profile",
+ "status": "passed"
+ },
+ {
+ "name": "saving canonical changes refreshes history and comparisons and clears choices made against the earlier source",
+ "status": "passed"
+ },
+ {
+ "name": "a failed restore keeps the original source and known history with an explicit retry",
+ "status": "passed"
+ },
+ {
+ "name": "an operation cancellation is guarded while pending and leaves an unsaved source draft intact",
+ "status": "passed"
+ },
+ {
+ "name": "a failed operation retry stays scoped and only resends the same operation on explicit user retry",
+ "status": "passed"
+ },
+ {
+ "name": "Bokmål localizes comparison labels while preserving imported facts named like UI labels or object properties",
+ "status": "passed"
+ },
+ {
+ "name": "the known low-confidence contact placeholder is localized",
+ "status": "passed"
+ },
+ {
+ "name": "a locale update retains dirty structured and raw drafts without reading their source again",
+ "status": "passed"
+ },
+ {
+ "name": "a pending initial read keeps one request and reports its failure in the latest locale without language writes",
+ "status": "passed"
+ },
+ {
+ "name": "a held Save locks every editor mutation, raw input and history restore until its snapshot settles",
+ "status": "passed"
+ },
+ {
+ "name": "two Save activations before React commits pending state send only one canonical PUT",
+ "status": "passed"
+ },
+ {
+ "name": "a failed Save retains a scoped localized error and draft for retry through the same Save button",
+ "status": "passed"
+ },
+ {
+ "name": "the editor exposes named H2/H3 groups and contextual repeated-item remove controls",
+ "status": "passed"
+ },
+ {
+ "name": "manual edits preserve long-tail data, custom links, opaque IDs and modeled fields without editor controls",
+ "status": "passed"
+ },
+ {
+ "name": "a read-only provider cannot edit canonical fields or trigger canonical writes",
+ "status": "passed"
+ },
+ {
+ "name": "meaningful identity initials use a readable foreground/background pair in [Function CareerProfilePage]",
+ "status": "passed"
+ },
+ {
+ "name": "meaningful identity initials use a readable foreground/background pair in [Function ProfilePage]",
+ "status": "passed"
+ },
+ {
+ "name": "Career Profile section headings describe the visible hierarchy without changing editing fields",
+ "status": "passed"
+ },
+ {
+ "name": "account headings separate identity from security sections",
+ "status": "passed"
+ },
+ {
+ "name": "account CV text status in en does not claim the CV library is empty",
+ "status": "passed"
+ },
+ {
+ "name": "account CV text status in nb does not claim the CV library is empty",
+ "status": "passed"
+ },
+ {
+ "name": "[PRES-E02/E09/C01] account save carries four identity fields and keeps career, email and CV writes separate",
+ "status": "passed"
+ },
+ {
+ "name": "[PRES-E02/E08/E09] failed account save keeps a scoped error and the identity draft for explicit retry",
+ "status": "passed"
+ },
+ {
+ "name": "[PRES-E02/E08] failed password update keeps a scoped error and secret draft until explicit retry succeeds",
+ "status": "passed"
+ },
+ {
+ "name": "profile page loads persisted structured cv and can re-parse it",
+ "status": "passed"
+ },
+ {
+ "name": "saving the career profile PUTs the structured profile and cv text unchanged (Phase 1 refactor invariant)",
+ "status": "passed"
+ },
+ {
+ "name": "editing a field in an extracted section updates parent state and flows into save (Phase 1 increment 2)",
+ "status": "passed"
+ },
+ {
+ "name": "profile page can reprocess from stored artifact history",
+ "status": "passed"
+ },
+ {
+ "name": "active extraction polling refreshes run status without resetting unsaved career fields",
+ "status": "passed"
+ },
+ {
+ "name": "profile page shows durable CV operation state and retries a failed run",
+ "status": "passed"
+ },
+ {
+ "name": "profile page keeps raw extraction collapsed until expanded",
+ "status": "passed"
+ },
+ {
+ "name": "saving the master profile (career) persists the structured profile via /career/profile",
+ "status": "passed"
+ },
+ {
+ "name": "/career shows the profile completeness overview",
+ "status": "passed"
+ },
+ {
+ "name": "/career profile exposes extraction progress",
+ "status": "passed"
+ },
+ {
+ "name": "/career profile can queue a CV upload without visiting import review first",
+ "status": "passed"
+ },
+ {
+ "name": "/career localizes completeness and review confidence without changing CV data",
+ "status": "passed"
+ },
+ {
+ "name": "/career separates overview, profile and import while preserving unsaved profile edits",
+ "status": "passed"
+ },
+ {
+ "name": "pending CV extraction can be reviewed and applied",
+ "status": "passed"
+ },
+ {
+ "name": "account email changes require a password and use the confirmation flow",
+ "status": "passed"
+ },
+ {
+ "name": "first-run workspace presents concise profile, import, general CV and job-specific actions",
+ "status": "passed"
+ },
+ {
+ "name": "career workspace overview and import state render in Bokmål",
+ "status": "passed"
+ },
+ {
+ "name": "returning workspace shows missing profile information and recent general and job-specific CVs",
+ "status": "passed"
+ },
+ {
+ "name": "workspace exposes the pending_review import state as a resumable action",
+ "status": "passed"
+ },
+ {
+ "name": "workspace exposes the queued import state as a resumable action",
+ "status": "passed"
+ },
+ {
+ "name": "workspace exposes the failed import state as a resumable action",
+ "status": "passed"
+ },
+ {
+ "name": "workspace represents loading and profile-load errors without inventing status",
+ "status": "passed"
+ },
+ {
+ "name": "a settled failed profile read hides the completeness score and retries only through its existing owner",
+ "status": "passed"
+ },
+ {
+ "name": "an unknown import read cannot claim no imports, completion or first-run guidance",
+ "status": "passed"
+ },
+ {
+ "name": "a failed import read stays unknown and keeps its own retry separate from the profile read",
+ "status": "passed"
+ },
+ {
+ "name": "failed recent-CV reads do not imply first-run and retry the same list without writes",
+ "status": "passed"
+ },
+ {
+ "name": "the parent exposes failed import-read retry without canonical saves or history restores",
+ "status": "passed"
+ },
+ {
+ "name": "changing language in overview cannot refetch or overwrite a dirty canonical draft",
+ "status": "passed"
+ },
+ {
+ "name": "visited evidence keeps its draft across sections without an unvisited or repeated list request",
+ "status": "passed"
+ },
+ {
+ "name": "the first history read announces progress without claiming an empty history",
+ "status": "passed"
+ },
+ {
+ "name": "a failed history read retains known rows and retries only through its history owner",
+ "status": "passed"
+ },
+ {
+ "name": "a settled zero-version history is a named empty section rather than a hidden capability",
+ "status": "passed"
+ },
+ {
+ "name": "one current version remains visible in Bokmål without offering a restore of the current source",
+ "status": "passed"
+ },
+ {
+ "name": "the collapsed history keeps twelve rows and contextual restore actions pass the exact selected version",
+ "status": "passed"
+ },
+ {
+ "name": "dirty source state explains the restore guard and re-enables the same version after the parent clears it",
+ "status": "passed"
+ },
+ {
+ "name": "the existing overall loading guard still blocks history restores",
+ "status": "passed"
+ },
+ {
+ "name": "restore failure stays visible with the known history until the parent clears it and retry is explicit",
+ "status": "passed"
+ },
+ {
+ "name": "preserves the server item ID when normalizing jobs",
+ "status": "passed"
+ },
+ {
+ "name": "preserves the server item ID when normalizing education",
+ "status": "passed"
+ },
+ {
+ "name": "preserves the server item ID when normalizing certifications",
+ "status": "passed"
+ },
+ {
+ "name": "preserves the server item ID when normalizing projects",
+ "status": "passed"
+ },
+ {
+ "name": "legacy structured items without IDs remain usable and acquire no client-generated IDs",
+ "status": "passed"
+ },
+ {
+ "name": "legacy parsed sections keep their facts without inventing structured item IDs",
+ "status": "passed"
+ },
+ {
+ "name": "API null and missing numeric metadata remain absent rather than becoming zero",
+ "status": "passed"
+ },
+ {
+ "name": "zero, finite numbers and numeric strings keep the established metadata number conversion",
+ "status": "passed"
+ }
+ ],
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit/career-import-affected-alert-final-20261012T171639Z-command.json",
+ "sha256": "a139b7fd11f8cd9e2288ff1ae79223ed594b10d7879d0e237ee39d3d00040956",
+ "bytes": 845,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit/career-import-affected-alert-final-20261012T171639Z.log",
+ "sha256": "1954bcabd71e0af169ba6d07e453886800a7da3b6e721498cb8545882d2026c0",
+ "bytes": 898,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "qualification": "Raw executed outcome; source bytes are not inferred retroactively. Passing subset is not slice acceptance."
+ }
+ ],
+ "native": {
+ "career-import-review": {
+ "command": {
+ "name": "career-import-review",
+ "command": [
+ "rtk",
+ "proxy",
+ "node",
+ "node_modules/@playwright/test/cli.js",
+ "test",
+ "e2e/phase7-career-import-review.spec.ts",
+ "--retries=0",
+ "--reporter=list,json",
+ "--output=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\career-import-review-results"
+ ],
+ "startedUtc": "2026-10-12T17:17:30.653322+00:00",
+ "finishedUtc": "2026-10-12T17:18:33.814659+00:00",
+ "exitCode": 0,
+ "stats": {
+ "startTime": "2026-10-12T17:17:31.179Z",
+ "duration": 62582.675,
+ "expected": 6,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ }
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review-command.json",
+ "sha256": "661fbf955a98ff719294917f2de3a2a31e15f3edc10b85486d063c5e0af6312f",
+ "bytes": 674,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "reportRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.log",
+ "sha256": "bcd35abd7c56b0ef5f8be7c1ef0413c7688f46f1695228123198e46e5f312363",
+ "bytes": 1649,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "stats": {
+ "startTime": "2026-10-12T17:17:31.179Z",
+ "duration": 62582.675,
+ "expected": 6,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ },
+ "cases": [
+ {
+ "title": "[P7-03 PRES-C01 C02 C03 C04 C05 W07] explicit select/deselect acceptance uses stable IDs and preserves raw, CV siblings and frozen snapshots",
+ "file": "phase7-career-import-review.spec.ts",
+ "line": 258,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 5072
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 C04] discarding stored review retains dirty structured and CURRENT raw drafts without a source write",
+ "file": "phase7-career-import-review.spec.ts",
+ "line": 326,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3389
+ },
+ {
+ "title": "[P7-03 PRES-C02 C04 E09] stored reviews are owner scoped and foreign/anonymous review actions cannot mutate source",
+ "file": "phase7-career-import-review.spec.ts",
+ "line": 358,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 1942
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02] version Restore appends a new structured version and preserves CURRENT raw text",
+ "file": "phase7-career-import-review.spec.ts",
+ "line": 393,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3499
+ },
+ {
+ "title": "[P7-03 PRES-C02 C04 E08] comparison GET failure has scoped retry and held loading without source mutation",
+ "file": "phase7-career-import-review.spec.ts",
+ "line": 420,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 2835
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "file": "phase7-career-import-review.spec.ts",
+ "line": 478,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 37663
+ }
+ ],
+ "reportErrors": [],
+ "configuration": {
+ "version": "1.62.1",
+ "workers": 1,
+ "projects": [
+ {
+ "name": "chromium",
+ "retries": 0
+ }
+ ]
+ },
+ "audit": {
+ "scans": [
+ {
+ "test": "[P7-03 PRES-C02 C04 E08] comparison GET failure has scoped retry and held loading without source mutation",
+ "attachment": "p7-career-review-en-light-320-comparison-failure-audit",
+ "geometry": {
+ "width": 320,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/005-p7-career-review-en-light-320-comparison-failure-audit.json",
+ "sha256": "4598fa75ba34423f2fc19ef4024b0b7d54bdd34e6f3675461793d448754eab55",
+ "bytes": 6191,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 320,
+ "height": 844
+ },
+ "state": "comparison-failure",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-nb-dark-320-settled-stored-review-audit",
+ "geometry": {
+ "width": 320,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 3,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/008-p7-career-review-nb-dark-320-settled-stored-review-audit.json",
+ "sha256": "5c3cbe608582844aa7a3857a7e87038f28f42f7e85d156188b06078a2d5f440d",
+ "bytes": 8924,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 320,
+ "height": 844
+ },
+ "state": "settled-stored-review",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 3
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-nb-dark-320-settled-version-history-audit",
+ "geometry": {
+ "width": 320,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 36,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/010-p7-career-review-nb-dark-320-settled-version-history-audit.json",
+ "sha256": "12a7545f55cf185cf069b1b84ab068d9963cbc1a3f09be581b098db298ddf9ce",
+ "bytes": 35759,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 320,
+ "height": 844
+ },
+ "state": "settled-version-history",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 36
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-en-light-360-settled-stored-review-audit",
+ "geometry": {
+ "width": 360,
+ "height": 800,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 3,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/012-p7-career-review-en-light-360-settled-stored-review-audit.json",
+ "sha256": "16d56a54d18b42bc6e95ba2eb8488eba2fd066cff0be62d22070e009189eeaa3",
+ "bytes": 8662,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 360,
+ "height": 800
+ },
+ "state": "settled-stored-review",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 3
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-en-light-360-settled-version-history-audit",
+ "geometry": {
+ "width": 360,
+ "height": 800,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 35,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/014-p7-career-review-en-light-360-settled-version-history-audit.json",
+ "sha256": "b56dceec0ec2b680322ec98b4ebf4971c973bd54c63536e88c9400636726d0b4",
+ "bytes": 34851,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 360,
+ "height": 800
+ },
+ "state": "settled-version-history",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 35
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-nb-light-390-settled-stored-review-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 3,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/016-p7-career-review-nb-light-390-settled-stored-review-audit.json",
+ "sha256": "6a46ec5abcd2599fe27d47a5d974d6867d157b7e081c6fdb9e6d938ee123c3d7",
+ "bytes": 8925,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "settled-stored-review",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 3
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-nb-light-390-settled-version-history-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 35,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/018-p7-career-review-nb-light-390-settled-version-history-audit.json",
+ "sha256": "a79fd6e0787a8018921abe2dc0be133c37fd2733f97887038f0fd3a2d394cd71",
+ "bytes": 35083,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "settled-version-history",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 35
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-en-dark-768-settled-stored-review-audit",
+ "geometry": {
+ "width": 768,
+ "height": 1024,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/020-p7-career-review-en-dark-768-settled-stored-review-audit.json",
+ "sha256": "85b3bbdffcab27a2ef273c659da865923d2bdadc287c74d671f6116ece6a8260",
+ "bytes": 7968,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 768,
+ "height": 1024
+ },
+ "state": "settled-stored-review",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-en-dark-768-settled-version-history-audit",
+ "geometry": {
+ "width": 768,
+ "height": 1024,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 35,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/022-p7-career-review-en-dark-768-settled-version-history-audit.json",
+ "sha256": "93a78ccb7957d55f410fea0dc4fff2fe4aea55e465264e98ec4938cfdfb8346c",
+ "bytes": 34882,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 768,
+ "height": 1024
+ },
+ "state": "settled-version-history",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 35
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-nb-dark-1024-settled-stored-review-audit",
+ "geometry": {
+ "width": 1024,
+ "height": 768,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/024-p7-career-review-nb-dark-1024-settled-stored-review-audit.json",
+ "sha256": "9669ab4d9146d07fd86dda74fe14345188eb9ee13f6282804dfc4df197814296",
+ "bytes": 8304,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 1024,
+ "height": 768
+ },
+ "state": "settled-stored-review",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-nb-dark-1024-settled-version-history-audit",
+ "geometry": {
+ "width": 1024,
+ "height": 768,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 35,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/026-p7-career-review-nb-dark-1024-settled-version-history-audit.json",
+ "sha256": "e72f8075857112b73f755e0d8f307a265b1966b6dafa71544533b7e88c5aa6b9",
+ "bytes": 35195,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 1024,
+ "height": 768
+ },
+ "state": "settled-version-history",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 35
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-en-light-1280-settled-stored-review-audit",
+ "geometry": {
+ "width": 1280,
+ "height": 320,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/028-p7-career-review-en-light-1280-settled-stored-review-audit.json",
+ "sha256": "70b6d5fc9b7d458b2351d8d41597b8c79f9964022c387758c677e52c370b379c",
+ "bytes": 8055,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 1280,
+ "height": 320
+ },
+ "state": "settled-stored-review",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-en-light-1280-settled-version-history-audit",
+ "geometry": {
+ "width": 1280,
+ "height": 320,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 35,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/030-p7-career-review-en-light-1280-settled-version-history-audit.json",
+ "sha256": "8df1841e83575b9171cf33be03174bcea6c29316a74c4390291451f22b678b4e",
+ "bytes": 34969,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 1280,
+ "height": 320
+ },
+ "state": "settled-version-history",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 35
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-nb-light-1440-settled-stored-review-audit",
+ "geometry": {
+ "width": 1440,
+ "height": 900,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/032-p7-career-review-nb-light-1440-settled-stored-review-audit.json",
+ "sha256": "2995f1599334e13618bc34d0797acdfe44b53875e72be1c7a4e8eaee91f22fd2",
+ "bytes": 8305,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 1440,
+ "height": 900
+ },
+ "state": "settled-stored-review",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-nb-light-1440-settled-version-history-audit",
+ "geometry": {
+ "width": 1440,
+ "height": 900,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 35,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/034-p7-career-review-nb-light-1440-settled-version-history-audit.json",
+ "sha256": "eedb3e3caf4fd006e782d1db23228d4a50dcdf69d809dcf8a58dccc6f0bbe740",
+ "bytes": 35196,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 1440,
+ "height": 900
+ },
+ "state": "settled-version-history",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 35
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-en-dark-1920-settled-stored-review-audit",
+ "geometry": {
+ "width": 1920,
+ "height": 1080,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/036-p7-career-review-en-dark-1920-settled-stored-review-audit.json",
+ "sha256": "56911137ac7a4451dcb03d2cab9b0296a2ea91783b6101d47593b3d231e080d2",
+ "bytes": 8009,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 1920,
+ "height": 1080
+ },
+ "state": "settled-stored-review",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "attachment": "p7-career-review-en-dark-1920-settled-version-history-audit",
+ "geometry": {
+ "width": 1920,
+ "height": 1080,
+ "rootOverflow": 0,
+ "overflowElements": []
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 35,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/038-p7-career-review-en-dark-1920-settled-version-history-audit.json",
+ "sha256": "7406a30847d4c1dbf1a04bddc823b3fdc76e4ea2f9247ea8096c732683e08b24",
+ "bytes": 34923,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 1920,
+ "height": 1080
+ },
+ "state": "settled-version-history",
+ "qualification": "Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance."
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 35
+ }
+ ]
+ }
+ ],
+ "violationNodes": 0,
+ "incompleteNodes": 302,
+ "checkContexts": [
+ {
+ "kind": "incomplete",
+ "rule": "color-contrast",
+ "check": "color-contrast",
+ "message": "Element content is too short to determine if it is actual text content",
+ "occurrences": 17,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-review-en-light-320-comparison-failure-audit",
+ "target": [
+ ".MuiBadge-badge"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "9.0pt (12px)",
+ "fontWeight": "normal",
+ "messageKey": "shortTextContent",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ },
+ {
+ "attachment": "p7-career-review-nb-dark-320-settled-stored-review-audit",
+ "target": [
+ ".MuiBadge-badge"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "9.0pt (12px)",
+ "fontWeight": "normal",
+ "messageKey": "shortTextContent",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ }
+ ]
+ },
+ {
+ "kind": "incomplete",
+ "rule": "color-contrast",
+ "check": "color-contrast",
+ "message": "Element's background color could not be determined because it is overlapped by another element",
+ "occurrences": 285,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-review-en-light-320-comparison-failure-audit",
+ "target": [
+ ".MuiSelect-select"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "10.5pt (14px)",
+ "fontWeight": "normal",
+ "messageKey": "bgOverlap",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ },
+ {
+ "attachment": "p7-career-review-nb-dark-320-settled-stored-review-audit",
+ "target": [
+ ".MuiSelect-select"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "10.5pt (14px)",
+ "fontWeight": "normal",
+ "messageKey": "bgOverlap",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ }
+ ]
+ }
+ ],
+ "qualification": "Every violation/incomplete category counted; complete node/check vectors remain exact raw report and extracted JSON. Parent contextual triage pending."
+ }
+ },
+ "career-editor": {
+ "command": {
+ "name": "career-editor",
+ "command": [
+ "rtk",
+ "proxy",
+ "node",
+ "node_modules/@playwright/test/cli.js",
+ "test",
+ "e2e/phase7-career-editor.spec.ts",
+ "--retries=0",
+ "--reporter=list,json",
+ "--output=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\career-editor-results"
+ ],
+ "startedUtc": "2026-10-12T17:18:33.830874+00:00",
+ "finishedUtc": "2026-10-12T17:19:22.486846+00:00",
+ "exitCode": 0,
+ "stats": {
+ "startTime": "2026-10-12T17:18:34.329Z",
+ "duration": 48101.738,
+ "expected": 11,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ }
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor-command.json",
+ "sha256": "35ec4414ecc887fd850b1cd27d49e5d050b7b793182dfe0cbce8f97c87cec288",
+ "bytes": 654,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "reportRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.log",
+ "sha256": "d15c9ad479b435b9bc4c912147392f11714d1589d2dabb7439ce13dbaefb2f2c",
+ "bytes": 2464,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "stats": {
+ "startTime": "2026-10-12T17:18:34.329Z",
+ "duration": 48101.738,
+ "expected": 11,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ },
+ "cases": [
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured and raw drafts survive English to Bokmål without canonical refetch or write",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 161,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4410
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] held save locks edits and duplicate writes; failed save retains its snapshot for explicit identical-body retry",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 211,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 7851
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] actual validation400 retains draft and source; corrected explicit save persists once",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 321,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4082
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/dark/320x844",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 381,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 2822
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/light/360x800",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 381,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3008
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/light/390x844",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 381,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 2811
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/dark/768x1024",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 381,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3104
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/dark/1024x768",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 381,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3106
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/light/1280x320",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 381,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3319
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/light/1440x900",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 381,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3075
+ },
+ {
+ "title": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/dark/1920x1080",
+ "file": "phase7-career-editor.spec.ts",
+ "line": 381,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3334
+ }
+ ],
+ "reportErrors": [],
+ "configuration": {
+ "version": "1.62.1",
+ "workers": 1,
+ "projects": [
+ {
+ "name": "chromium",
+ "retries": 0
+ }
+ ]
+ },
+ "audit": {
+ "scans": [
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured and raw drafts survive English to Bokmål without canonical refetch or write",
+ "attachment": "p7-career-editor-nb-light-1440-locale-retained-raw-draft-audit",
+ "geometry": {
+ "width": 1440,
+ "height": 900,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Profil-CV / hovedtekst for CV",
+ "left": 334,
+ "right": 1360,
+ "width": 1026
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 6,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/002-p7-career-editor-nb-light-1440-locale-retained-raw-draft-audit.json",
+ "sha256": "cf56885658c6022289c6b8d8a46020ae7fe38c6ee2eab3e024d659d3a89d09a6",
+ "bytes": 9801,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 1440,
+ "height": 900
+ },
+ "state": "locale-retained-raw-draft",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 6
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] held save locks edits and duplicate writes; failed save retains its snapshot for explicit identical-body retry",
+ "attachment": "p7-career-editor-en-light-390-held-save-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Full name",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Professional headline",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Contact email",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Phone",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Location",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Website",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "LinkedIn",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "GitHub",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Label",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "URL",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Professional summary",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Skills",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Interests",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Awards",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Publications",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Organisations",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "References",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Language",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Level",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Notes",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Job title",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Company",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Location",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 181,
+ "width": 104
+ },
+ {
+ "name": "End",
+ "left": 209,
+ "right": 313,
+ "width": 104
+ },
+ {
+ "name": "Job bullets",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Job skills",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Qualification",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Institution",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Location",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 181,
+ "width": 104
+ },
+ {
+ "name": "End",
+ "left": 209,
+ "right": 313,
+ "width": 104
+ },
+ {
+ "name": "Education details",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Section title",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Section items",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/005-p7-career-editor-en-light-390-held-save-audit.json",
+ "sha256": "c028b58cb25694d02862188385acad9bac108410300ce248bbf526433e3b12e9",
+ "bytes": 14156,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "held-save",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] held save locks edits and duplicate writes; failed save retains its snapshot for explicit identical-body retry",
+ "attachment": "p7-career-editor-en-light-390-held-save-raw-import-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Profile CV / master resume text",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 3,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/007-p7-career-editor-en-light-390-held-save-raw-import-audit.json",
+ "sha256": "9caa6c4ce5670ac1b9c0c4a8a4181eb8a07f13f4d615a33ed165362d35c06ed5",
+ "bytes": 7793,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "held-save-raw-import",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "aria-hidden-focus",
+ "nodes": 1
+ },
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] held save locks edits and duplicate writes; failed save retains its snapshot for explicit identical-body retry",
+ "attachment": "p7-career-editor-en-light-390-failed-save-retained-draft-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Full name",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Professional headline",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Contact email",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Phone",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Location",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Website",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "LinkedIn",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "GitHub",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Label",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "URL",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Professional summary",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Skills",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Interests",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Awards",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Publications",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Organisations",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "References",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Language",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Level",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Notes",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Job title",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Company",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Location",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 181,
+ "width": 104
+ },
+ {
+ "name": "End",
+ "left": 209,
+ "right": 313,
+ "width": 104
+ },
+ {
+ "name": "Job bullets",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Job skills",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Qualification",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Institution",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Location",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 181,
+ "width": 104
+ },
+ {
+ "name": "End",
+ "left": 209,
+ "right": 313,
+ "width": 104
+ },
+ {
+ "name": "Education details",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Section title",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Section items",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 37,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/009-p7-career-editor-en-light-390-failed-save-retained-draft-audit.json",
+ "sha256": "7197637a144aa62946b27af769bb80afb8d1caff2baf856d4a9ec93ca4f93958",
+ "bytes": 40303,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "failed-save-retained-draft",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 37
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] actual validation400 retains draft and source; corrected explicit save persists once",
+ "attachment": "p7-career-editor-nb-dark-390-actual-validation400-retained-draft-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Fullt navn",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Profesjonell overskrift",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Kontakt-e-post",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Telefon",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Sted",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Nettsted",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "LinkedIn",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "GitHub",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Etikett",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "URL",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Sammendrags-punkter",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Kjernekompetanse",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Interesser",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Priser og utmerkelser",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Publikasjoner",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Organisasjoner",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Referanser",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Språk",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Nivå",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Notater",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Stillingstittel",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Selskap",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Sted",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 181,
+ "width": 104
+ },
+ {
+ "name": "Slutt",
+ "left": 209,
+ "right": 313,
+ "width": 104
+ },
+ {
+ "name": "Jobbpunkter",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Ferdigheter for jobben",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Kvalifikasjon",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Institusjon",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Sted",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 181,
+ "width": 104
+ },
+ {
+ "name": "Slutt",
+ "left": 209,
+ "right": 313,
+ "width": 104
+ },
+ {
+ "name": "Detaljer om utdanning",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Seksjonstittel",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Seksjonsinnhold",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 38,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/012-p7-career-editor-nb-dark-390-actual-validation400-retained-draft-audit.json",
+ "sha256": "5a34db597dd8c0c1bc38fbcb143f2b52e2b080b47c182fafe23e0a9378436230",
+ "bytes": 41448,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 390,
+ "height": 844
+ },
+ "state": "actual-validation400-retained-draft",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 38
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/dark/320x844",
+ "attachment": "p7-career-editor-nb-dark-320-structured-editor-audit",
+ "geometry": {
+ "width": 320,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Fullt navn",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Profesjonell overskrift",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Kontakt-e-post",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Telefon",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Sted",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Nettsted",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "LinkedIn",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "GitHub",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Etikett",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "URL",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Sammendrags-punkter",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Kjernekompetanse",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Interesser",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Priser og utmerkelser",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Publikasjoner",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Organisasjoner",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Referanser",
+ "left": 60,
+ "right": 260,
+ "width": 200
+ },
+ {
+ "name": "Språk",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Nivå",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Notater",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Stillingstittel",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Selskap",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Sted",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 146,
+ "width": 69
+ },
+ {
+ "name": "Slutt",
+ "left": 174,
+ "right": 243,
+ "width": 69
+ },
+ {
+ "name": "Jobbpunkter",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Ferdigheter for jobben",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Kvalifikasjon",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Institusjon",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Sted",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 146,
+ "width": 69
+ },
+ {
+ "name": "Slutt",
+ "left": 174,
+ "right": 243,
+ "width": 69
+ },
+ {
+ "name": "Detaljer om utdanning",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Seksjonstittel",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ },
+ {
+ "name": "Seksjonsinnhold",
+ "left": 77,
+ "right": 243,
+ "width": 166
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 37,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/015-p7-career-editor-nb-dark-320-structured-editor-audit.json",
+ "sha256": "1c2bf31b23500e70b85058cfeae4412fc9a61151a7acdd4304d0f26144be872f",
+ "bytes": 40191,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 320,
+ "height": 844
+ },
+ "state": "structured-editor",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 37
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/light/360x800",
+ "attachment": "p7-career-editor-en-light-360-structured-editor-audit",
+ "geometry": {
+ "width": 360,
+ "height": 800,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Full name",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Professional headline",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Contact email",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Phone",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Location",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Website",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "LinkedIn",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "GitHub",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Label",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "URL",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Professional summary",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Skills",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Interests",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Awards",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Publications",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Organisations",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "References",
+ "left": 60,
+ "right": 300,
+ "width": 240
+ },
+ {
+ "name": "Language",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Level",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Notes",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Job title",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Company",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Location",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 166,
+ "width": 89
+ },
+ {
+ "name": "End",
+ "left": 194,
+ "right": 283,
+ "width": 89
+ },
+ {
+ "name": "Job bullets",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Job skills",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Qualification",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Institution",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Location",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 166,
+ "width": 89
+ },
+ {
+ "name": "End",
+ "left": 194,
+ "right": 283,
+ "width": 89
+ },
+ {
+ "name": "Education details",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Section title",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ },
+ {
+ "name": "Section items",
+ "left": 77,
+ "right": 283,
+ "width": 206
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 37,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/017-p7-career-editor-en-light-360-structured-editor-audit.json",
+ "sha256": "aa507fb894d142e85a7ec50b953dad9c1a8160e6a9151871c6222c6a651ffd0a",
+ "bytes": 39898,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 360,
+ "height": 800
+ },
+ "state": "structured-editor",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 37
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/light/390x844",
+ "attachment": "p7-career-editor-nb-light-390-structured-editor-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Fullt navn",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Profesjonell overskrift",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Kontakt-e-post",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Telefon",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Sted",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Nettsted",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "LinkedIn",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "GitHub",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Etikett",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "URL",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Sammendrags-punkter",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Kjernekompetanse",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Interesser",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Priser og utmerkelser",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Publikasjoner",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Organisasjoner",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Referanser",
+ "left": 60,
+ "right": 330,
+ "width": 270
+ },
+ {
+ "name": "Språk",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Nivå",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Notater",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Stillingstittel",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Selskap",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Sted",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 181,
+ "width": 104
+ },
+ {
+ "name": "Slutt",
+ "left": 209,
+ "right": 313,
+ "width": 104
+ },
+ {
+ "name": "Jobbpunkter",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Ferdigheter for jobben",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Kvalifikasjon",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Institusjon",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Sted",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Start",
+ "left": 77,
+ "right": 181,
+ "width": 104
+ },
+ {
+ "name": "Slutt",
+ "left": 209,
+ "right": 313,
+ "width": 104
+ },
+ {
+ "name": "Detaljer om utdanning",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Seksjonstittel",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ },
+ {
+ "name": "Seksjonsinnhold",
+ "left": 77,
+ "right": 313,
+ "width": 236
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 37,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/019-p7-career-editor-nb-light-390-structured-editor-audit.json",
+ "sha256": "924f4a9fbaa58cd68d5fb9d091340efc339873bb52bdc02952361388cea16ac7",
+ "bytes": 40177,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "structured-editor",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 37
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/dark/768x1024",
+ "attachment": "p7-career-editor-en-dark-768-structured-editor-audit",
+ "geometry": {
+ "width": 768,
+ "height": 1024,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Full name",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Professional headline",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Contact email",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Phone",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Location",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Website",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "LinkedIn",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "GitHub",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Label",
+ "left": 76,
+ "right": 184.828125,
+ "width": 108.828125
+ },
+ {
+ "name": "URL",
+ "left": 212.828125,
+ "right": 648,
+ "width": 435.171875
+ },
+ {
+ "name": "Professional summary",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Skills",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Interests",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Awards",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Publications",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Organisations",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "References",
+ "left": 76,
+ "right": 692,
+ "width": 616
+ },
+ {
+ "name": "Language",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Level",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Notes",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Job title",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Company",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Location",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Start",
+ "left": 97,
+ "right": 370,
+ "width": 273
+ },
+ {
+ "name": "End",
+ "left": 398,
+ "right": 671,
+ "width": 273
+ },
+ {
+ "name": "Job bullets",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Job skills",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Qualification",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Institution",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Location",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Start",
+ "left": 97,
+ "right": 370,
+ "width": 273
+ },
+ {
+ "name": "End",
+ "left": 398,
+ "right": 671,
+ "width": 273
+ },
+ {
+ "name": "Education details",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Section title",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ },
+ {
+ "name": "Section items",
+ "left": 97,
+ "right": 671,
+ "width": 574
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 36,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/021-p7-career-editor-en-dark-768-structured-editor-audit.json",
+ "sha256": "83d767fd8df9fb0a4a21cd6add923d6f7f714634d0958a098952907401d57bd3",
+ "bytes": 39196,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 768,
+ "height": 1024
+ },
+ "state": "structured-editor",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 36
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/dark/1024x768",
+ "attachment": "p7-career-editor-nb-dark-1024-structured-editor-audit",
+ "geometry": {
+ "width": 1024,
+ "height": 768,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Fullt navn",
+ "left": 330,
+ "right": 623,
+ "width": 293
+ },
+ {
+ "name": "Profesjonell overskrift",
+ "left": 655,
+ "right": 948,
+ "width": 293
+ },
+ {
+ "name": "Kontakt-e-post",
+ "left": 330,
+ "right": 623,
+ "width": 293
+ },
+ {
+ "name": "Telefon",
+ "left": 655,
+ "right": 948,
+ "width": 293
+ },
+ {
+ "name": "Sted",
+ "left": 330,
+ "right": 623,
+ "width": 293
+ },
+ {
+ "name": "Nettsted",
+ "left": 655,
+ "right": 948,
+ "width": 293
+ },
+ {
+ "name": "LinkedIn",
+ "left": 330,
+ "right": 948,
+ "width": 618
+ },
+ {
+ "name": "GitHub",
+ "left": 330,
+ "right": 948,
+ "width": 618
+ },
+ {
+ "name": "Etikett",
+ "left": 330,
+ "right": 438.953125,
+ "width": 108.953125
+ },
+ {
+ "name": "URL",
+ "left": 466.953125,
+ "right": 904,
+ "width": 437.046875
+ },
+ {
+ "name": "Sammendrags-punkter",
+ "left": 330,
+ "right": 623,
+ "width": 293
+ },
+ {
+ "name": "Kjernekompetanse",
+ "left": 655,
+ "right": 948,
+ "width": 293
+ },
+ {
+ "name": "Interesser",
+ "left": 330,
+ "right": 623,
+ "width": 293
+ },
+ {
+ "name": "Priser og utmerkelser",
+ "left": 330,
+ "right": 623,
+ "width": 293
+ },
+ {
+ "name": "Publikasjoner",
+ "left": 655,
+ "right": 948,
+ "width": 293
+ },
+ {
+ "name": "Organisasjoner",
+ "left": 330,
+ "right": 623,
+ "width": 293
+ },
+ {
+ "name": "Referanser",
+ "left": 655,
+ "right": 948,
+ "width": 293
+ },
+ {
+ "name": "Språk",
+ "left": 351,
+ "right": 500.328125,
+ "width": 149.328125
+ },
+ {
+ "name": "Nivå",
+ "left": 528.328125,
+ "right": 677.65625,
+ "width": 149.328125
+ },
+ {
+ "name": "Notater",
+ "left": 705.65625,
+ "right": 854.984375,
+ "width": 149.328125
+ },
+ {
+ "name": "Stillingstittel",
+ "left": 351,
+ "right": 625,
+ "width": 274
+ },
+ {
+ "name": "Selskap",
+ "left": 653,
+ "right": 927,
+ "width": 274
+ },
+ {
+ "name": "Sted",
+ "left": 351,
+ "right": 625,
+ "width": 274
+ },
+ {
+ "name": "Start",
+ "left": 653,
+ "right": 776,
+ "width": 123
+ },
+ {
+ "name": "Slutt",
+ "left": 804,
+ "right": 927,
+ "width": 123
+ },
+ {
+ "name": "Jobbpunkter",
+ "left": 351,
+ "right": 927,
+ "width": 576
+ },
+ {
+ "name": "Ferdigheter for jobben",
+ "left": 351,
+ "right": 927,
+ "width": 576
+ },
+ {
+ "name": "Kvalifikasjon",
+ "left": 351,
+ "right": 625,
+ "width": 274
+ },
+ {
+ "name": "Institusjon",
+ "left": 653,
+ "right": 927,
+ "width": 274
+ },
+ {
+ "name": "Sted",
+ "left": 351,
+ "right": 625,
+ "width": 274
+ },
+ {
+ "name": "Start",
+ "left": 653,
+ "right": 776,
+ "width": 123
+ },
+ {
+ "name": "Slutt",
+ "left": 804,
+ "right": 927,
+ "width": 123
+ },
+ {
+ "name": "Detaljer om utdanning",
+ "left": 351,
+ "right": 927,
+ "width": 576
+ },
+ {
+ "name": "Seksjonstittel",
+ "left": 351,
+ "right": 855,
+ "width": 504
+ },
+ {
+ "name": "Seksjonsinnhold",
+ "left": 351,
+ "right": 927,
+ "width": 576
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 36,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/023-p7-career-editor-nb-dark-1024-structured-editor-audit.json",
+ "sha256": "1c0f9f20b58ca5e42d23fe18d28770c05ac1139b64a03efc7016e0d503b9b389",
+ "bytes": 39639,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 1024,
+ "height": 768
+ },
+ "state": "structured-editor",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 36
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/light/1280x320",
+ "attachment": "p7-career-editor-en-light-1280-structured-editor-audit",
+ "geometry": {
+ "width": 1280,
+ "height": 320,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Full name",
+ "left": 330,
+ "right": 751,
+ "width": 421
+ },
+ {
+ "name": "Professional headline",
+ "left": 783,
+ "right": 1204,
+ "width": 421
+ },
+ {
+ "name": "Contact email",
+ "left": 330,
+ "right": 751,
+ "width": 421
+ },
+ {
+ "name": "Phone",
+ "left": 783,
+ "right": 1204,
+ "width": 421
+ },
+ {
+ "name": "Location",
+ "left": 330,
+ "right": 751,
+ "width": 421
+ },
+ {
+ "name": "Website",
+ "left": 783,
+ "right": 1204,
+ "width": 421
+ },
+ {
+ "name": "LinkedIn",
+ "left": 330,
+ "right": 1204,
+ "width": 874
+ },
+ {
+ "name": "GitHub",
+ "left": 330,
+ "right": 1204,
+ "width": 874
+ },
+ {
+ "name": "Label",
+ "left": 330,
+ "right": 451.125,
+ "width": 121.125
+ },
+ {
+ "name": "URL",
+ "left": 479.125,
+ "right": 1160,
+ "width": 680.875
+ },
+ {
+ "name": "Professional summary",
+ "left": 330,
+ "right": 751,
+ "width": 421
+ },
+ {
+ "name": "Skills",
+ "left": 783,
+ "right": 1204,
+ "width": 421
+ },
+ {
+ "name": "Interests",
+ "left": 330,
+ "right": 751,
+ "width": 421
+ },
+ {
+ "name": "Awards",
+ "left": 330,
+ "right": 751,
+ "width": 421
+ },
+ {
+ "name": "Publications",
+ "left": 783,
+ "right": 1204,
+ "width": 421
+ },
+ {
+ "name": "Organisations",
+ "left": 330,
+ "right": 751,
+ "width": 421
+ },
+ {
+ "name": "References",
+ "left": 783,
+ "right": 1204,
+ "width": 421
+ },
+ {
+ "name": "Language",
+ "left": 351,
+ "right": 584.671875,
+ "width": 233.671875
+ },
+ {
+ "name": "Level",
+ "left": 612.671875,
+ "right": 846.34375,
+ "width": 233.671875
+ },
+ {
+ "name": "Notes",
+ "left": 874.34375,
+ "right": 1108.015625,
+ "width": 233.671875
+ },
+ {
+ "name": "Job title",
+ "left": 351,
+ "right": 753,
+ "width": 402
+ },
+ {
+ "name": "Company",
+ "left": 781,
+ "right": 1183,
+ "width": 402
+ },
+ {
+ "name": "Location",
+ "left": 351,
+ "right": 753,
+ "width": 402
+ },
+ {
+ "name": "Start",
+ "left": 781,
+ "right": 968,
+ "width": 187
+ },
+ {
+ "name": "End",
+ "left": 996,
+ "right": 1183,
+ "width": 187
+ },
+ {
+ "name": "Job bullets",
+ "left": 351,
+ "right": 1183,
+ "width": 832
+ },
+ {
+ "name": "Job skills",
+ "left": 351,
+ "right": 1183,
+ "width": 832
+ },
+ {
+ "name": "Qualification",
+ "left": 351,
+ "right": 753,
+ "width": 402
+ },
+ {
+ "name": "Institution",
+ "left": 781,
+ "right": 1183,
+ "width": 402
+ },
+ {
+ "name": "Location",
+ "left": 351,
+ "right": 753,
+ "width": 402
+ },
+ {
+ "name": "Start",
+ "left": 781,
+ "right": 968,
+ "width": 187
+ },
+ {
+ "name": "End",
+ "left": 996,
+ "right": 1183,
+ "width": 187
+ },
+ {
+ "name": "Education details",
+ "left": 351,
+ "right": 1183,
+ "width": 832
+ },
+ {
+ "name": "Section title",
+ "left": 351,
+ "right": 1108.015625,
+ "width": 757.015625
+ },
+ {
+ "name": "Section items",
+ "left": 351,
+ "right": 1183,
+ "width": 832
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 36,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/025-p7-career-editor-en-light-1280-structured-editor-audit.json",
+ "sha256": "56328a9f4ea57aee411aabdfa6d550a8a9f8a25393e48d64a1dd79c4c01b2cc3",
+ "bytes": 39390,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 1280,
+ "height": 320
+ },
+ "state": "structured-editor",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 36
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/light/1440x900",
+ "attachment": "p7-career-editor-nb-light-1440-structured-editor-audit",
+ "geometry": {
+ "width": 1440,
+ "height": 900,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Fullt navn",
+ "left": 338,
+ "right": 831,
+ "width": 493
+ },
+ {
+ "name": "Profesjonell overskrift",
+ "left": 863,
+ "right": 1356,
+ "width": 493
+ },
+ {
+ "name": "Kontakt-e-post",
+ "left": 338,
+ "right": 831,
+ "width": 493
+ },
+ {
+ "name": "Telefon",
+ "left": 863,
+ "right": 1356,
+ "width": 493
+ },
+ {
+ "name": "Sted",
+ "left": 338,
+ "right": 831,
+ "width": 493
+ },
+ {
+ "name": "Nettsted",
+ "left": 863,
+ "right": 1356,
+ "width": 493
+ },
+ {
+ "name": "LinkedIn",
+ "left": 338,
+ "right": 1356,
+ "width": 1018
+ },
+ {
+ "name": "GitHub",
+ "left": 338,
+ "right": 1356,
+ "width": 1018
+ },
+ {
+ "name": "Etikett",
+ "left": 338,
+ "right": 463.71875,
+ "width": 125.71875
+ },
+ {
+ "name": "URL",
+ "left": 491.71875,
+ "right": 1312,
+ "width": 820.28125
+ },
+ {
+ "name": "Sammendrags-punkter",
+ "left": 338,
+ "right": 831,
+ "width": 493
+ },
+ {
+ "name": "Kjernekompetanse",
+ "left": 863,
+ "right": 1356,
+ "width": 493
+ },
+ {
+ "name": "Interesser",
+ "left": 338,
+ "right": 831,
+ "width": 493
+ },
+ {
+ "name": "Priser og utmerkelser",
+ "left": 338,
+ "right": 831,
+ "width": 493
+ },
+ {
+ "name": "Publikasjoner",
+ "left": 863,
+ "right": 1356,
+ "width": 493
+ },
+ {
+ "name": "Organisasjoner",
+ "left": 338,
+ "right": 831,
+ "width": 493
+ },
+ {
+ "name": "Referanser",
+ "left": 863,
+ "right": 1356,
+ "width": 493
+ },
+ {
+ "name": "Språk",
+ "left": 359,
+ "right": 641.65625,
+ "width": 282.65625
+ },
+ {
+ "name": "Nivå",
+ "left": 669.65625,
+ "right": 952.328125,
+ "width": 282.671875
+ },
+ {
+ "name": "Notater",
+ "left": 980.328125,
+ "right": 1262.984375,
+ "width": 282.65625
+ },
+ {
+ "name": "Stillingstittel",
+ "left": 359,
+ "right": 833,
+ "width": 474
+ },
+ {
+ "name": "Selskap",
+ "left": 861,
+ "right": 1335,
+ "width": 474
+ },
+ {
+ "name": "Sted",
+ "left": 359,
+ "right": 833,
+ "width": 474
+ },
+ {
+ "name": "Start",
+ "left": 861,
+ "right": 1084,
+ "width": 223
+ },
+ {
+ "name": "Slutt",
+ "left": 1112,
+ "right": 1335,
+ "width": 223
+ },
+ {
+ "name": "Jobbpunkter",
+ "left": 359,
+ "right": 1335,
+ "width": 976
+ },
+ {
+ "name": "Ferdigheter for jobben",
+ "left": 359,
+ "right": 1335,
+ "width": 976
+ },
+ {
+ "name": "Kvalifikasjon",
+ "left": 359,
+ "right": 833,
+ "width": 474
+ },
+ {
+ "name": "Institusjon",
+ "left": 861,
+ "right": 1335,
+ "width": 474
+ },
+ {
+ "name": "Sted",
+ "left": 359,
+ "right": 833,
+ "width": 474
+ },
+ {
+ "name": "Start",
+ "left": 861,
+ "right": 1084,
+ "width": 223
+ },
+ {
+ "name": "Slutt",
+ "left": 1112,
+ "right": 1335,
+ "width": 223
+ },
+ {
+ "name": "Detaljer om utdanning",
+ "left": 359,
+ "right": 1335,
+ "width": 976
+ },
+ {
+ "name": "Seksjonstittel",
+ "left": 359,
+ "right": 1263,
+ "width": 904
+ },
+ {
+ "name": "Seksjonsinnhold",
+ "left": 359,
+ "right": 1335,
+ "width": 976
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 36,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/027-p7-career-editor-nb-light-1440-structured-editor-audit.json",
+ "sha256": "aa5bcfcf1c3faa383fa1a3c0f048ac61884d915f349e5623fb2659347bca9f21",
+ "bytes": 39658,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 1440,
+ "height": 900
+ },
+ "state": "structured-editor",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 36
+ }
+ ]
+ },
+ {
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/dark/1920x1080",
+ "attachment": "p7-career-editor-en-dark-1920-structured-editor-audit",
+ "geometry": {
+ "width": 1920,
+ "height": 1080,
+ "rootOverflow": 0,
+ "overflowElements": [],
+ "visibleFields": [
+ {
+ "name": "Full name",
+ "left": 479,
+ "right": 1071,
+ "width": 592
+ },
+ {
+ "name": "Professional headline",
+ "left": 1103,
+ "right": 1695,
+ "width": 592
+ },
+ {
+ "name": "Contact email",
+ "left": 479,
+ "right": 1071,
+ "width": 592
+ },
+ {
+ "name": "Phone",
+ "left": 1103,
+ "right": 1695,
+ "width": 592
+ },
+ {
+ "name": "Location",
+ "left": 479,
+ "right": 1071,
+ "width": 592
+ },
+ {
+ "name": "Website",
+ "left": 1103,
+ "right": 1695,
+ "width": 592
+ },
+ {
+ "name": "LinkedIn",
+ "left": 479,
+ "right": 1695,
+ "width": 1216
+ },
+ {
+ "name": "GitHub",
+ "left": 479,
+ "right": 1695,
+ "width": 1216
+ },
+ {
+ "name": "Label",
+ "left": 479,
+ "right": 609.515625,
+ "width": 130.515625
+ },
+ {
+ "name": "URL",
+ "left": 637.515625,
+ "right": 1651,
+ "width": 1013.484375
+ },
+ {
+ "name": "Professional summary",
+ "left": 479,
+ "right": 1071,
+ "width": 592
+ },
+ {
+ "name": "Skills",
+ "left": 1103,
+ "right": 1695,
+ "width": 592
+ },
+ {
+ "name": "Interests",
+ "left": 479,
+ "right": 1071,
+ "width": 592
+ },
+ {
+ "name": "Awards",
+ "left": 479,
+ "right": 1071,
+ "width": 592
+ },
+ {
+ "name": "Publications",
+ "left": 1103,
+ "right": 1695,
+ "width": 592
+ },
+ {
+ "name": "Organisations",
+ "left": 479,
+ "right": 1071,
+ "width": 592
+ },
+ {
+ "name": "References",
+ "left": 1103,
+ "right": 1695,
+ "width": 592
+ },
+ {
+ "name": "Language",
+ "left": 500,
+ "right": 847.671875,
+ "width": 347.671875
+ },
+ {
+ "name": "Level",
+ "left": 875.671875,
+ "right": 1223.34375,
+ "width": 347.671875
+ },
+ {
+ "name": "Notes",
+ "left": 1251.34375,
+ "right": 1599.015625,
+ "width": 347.671875
+ },
+ {
+ "name": "Job title",
+ "left": 500,
+ "right": 1073,
+ "width": 573
+ },
+ {
+ "name": "Company",
+ "left": 1101,
+ "right": 1674,
+ "width": 573
+ },
+ {
+ "name": "Location",
+ "left": 500,
+ "right": 1073,
+ "width": 573
+ },
+ {
+ "name": "Start",
+ "left": 1101,
+ "right": 1373.5,
+ "width": 272.5
+ },
+ {
+ "name": "End",
+ "left": 1401.5,
+ "right": 1674,
+ "width": 272.5
+ },
+ {
+ "name": "Job bullets",
+ "left": 500,
+ "right": 1674,
+ "width": 1174
+ },
+ {
+ "name": "Job skills",
+ "left": 500,
+ "right": 1674,
+ "width": 1174
+ },
+ {
+ "name": "Qualification",
+ "left": 500,
+ "right": 1073,
+ "width": 573
+ },
+ {
+ "name": "Institution",
+ "left": 1101,
+ "right": 1674,
+ "width": 573
+ },
+ {
+ "name": "Location",
+ "left": 500,
+ "right": 1073,
+ "width": 573
+ },
+ {
+ "name": "Start",
+ "left": 1101,
+ "right": 1373.5,
+ "width": 272.5
+ },
+ {
+ "name": "End",
+ "left": 1401.5,
+ "right": 1674,
+ "width": 272.5
+ },
+ {
+ "name": "Education details",
+ "left": 500,
+ "right": 1674,
+ "width": 1174
+ },
+ {
+ "name": "Section title",
+ "left": 500,
+ "right": 1599.015625,
+ "width": 1099.015625
+ },
+ {
+ "name": "Section items",
+ "left": 500,
+ "right": 1674,
+ "width": 1174
+ }
+ ]
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 36,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/029-p7-career-editor-en-dark-1920-structured-editor-audit.json",
+ "sha256": "cd2e6f7334fe2b806831fc83a6d2079ebfd6ec11630beb7d31e1d2f41fd3b85a",
+ "bytes": 39407,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 1920,
+ "height": 1080
+ },
+ "state": "structured-editor",
+ "qualifications": [
+ "Automated Chromium evidence only; no human screen reader or physical touch/software keyboard",
+ "No actual browser zoom, production font/photo, PDF, model/provider or production acceptance"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 36
+ }
+ ]
+ }
+ ],
+ "violationNodes": 0,
+ "incompleteNodes": 377,
+ "checkContexts": [
+ {
+ "kind": "incomplete",
+ "rule": "color-contrast",
+ "check": "color-contrast",
+ "message": "Element's background color could not be determined because it is overlapped by another element",
+ "occurrences": 362,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-editor-nb-light-1440-locale-retained-raw-draft-audit",
+ "target": [
+ ".MuiButtonGroup-firstButton"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "9.8pt (13px)",
+ "fontWeight": "bold",
+ "messageKey": "bgOverlap",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ },
+ {
+ "attachment": "p7-career-editor-nb-light-1440-locale-retained-raw-draft-audit",
+ "target": [
+ ".MuiButton-containedSizeSmall"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "9.8pt (13px)",
+ "fontWeight": "bold",
+ "messageKey": "bgOverlap",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ }
+ ]
+ },
+ {
+ "kind": "incomplete",
+ "rule": "color-contrast",
+ "check": "color-contrast",
+ "message": "Element content is too short to determine if it is actual text content",
+ "occurrences": 13,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-editor-nb-light-1440-locale-retained-raw-draft-audit",
+ "target": [
+ ".MuiBadge-badge"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "9.0pt (12px)",
+ "fontWeight": "normal",
+ "messageKey": "shortTextContent",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ },
+ {
+ "attachment": "p7-career-editor-en-light-390-held-save-audit",
+ "target": [
+ ".MuiBadge-badge"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "9.0pt (12px)",
+ "fontWeight": "normal",
+ "messageKey": "shortTextContent",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ }
+ ]
+ },
+ {
+ "kind": "incomplete",
+ "rule": "aria-hidden-focus",
+ "check": "focusable-modal-open",
+ "message": "Check that focusable elements are not tabbable in the current state",
+ "occurrences": 1,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-editor-en-light-390-held-save-raw-import-audit",
+ "target": [
+ "#menu-"
+ ],
+ "data": null,
+ "relatedNodes": [
+ {
+ "html": "
",
+ "target": [
+ "li[data-value=\"import\"]"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "kind": "incomplete",
+ "rule": "color-contrast",
+ "check": "color-contrast",
+ "message": "Element's background color could not be determined because it partially overlaps other elements",
+ "occurrences": 1,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-editor-nb-dark-390-actual-validation400-retained-draft-audit",
+ "target": [
+ ".MuiAlert-filledError > .MuiAlert-message.css-127h8j3"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "10.5pt (14px)",
+ "fontWeight": "normal",
+ "messageKey": "elmPartiallyObscuring",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ }
+ ]
+ }
+ ],
+ "qualification": "Every violation/incomplete category counted; complete node/check vectors remain exact raw report and extracted JSON. Parent contextual triage pending."
+ }
+ },
+ "career-source-ids": {
+ "command": {
+ "name": "career-source-ids",
+ "command": [
+ "rtk",
+ "proxy",
+ "node",
+ "node_modules/@playwright/test/cli.js",
+ "test",
+ "e2e/phase7-career-source-ids.spec.ts",
+ "--retries=0",
+ "--reporter=list,json",
+ "--output=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\career-source-ids-results"
+ ],
+ "startedUtc": "2026-10-12T17:19:22.501428+00:00",
+ "finishedUtc": "2026-10-12T17:19:34.854415+00:00",
+ "exitCode": 0,
+ "stats": {
+ "startTime": "2026-10-12T17:19:23.018Z",
+ "duration": 11790.417000000001,
+ "expected": 2,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ }
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-source-ids-command.json",
+ "sha256": "ef7c901d2cb86510668e4afe44c9ce716f68836839990f0e80a67c304535fb2e",
+ "bytes": 674,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "reportRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-source-ids.json",
+ "sha256": "fe2d4fd4f6f4f68cd664f332fa37f6997945db1aa0aeb3486b446ed0aa4cbe12",
+ "bytes": 407686,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-source-ids.log",
+ "sha256": "0fcbc6d80c75224f965a86ab6c5997185406068e166c121155caacf19f4f22d9",
+ "bytes": 927,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "stats": {
+ "startTime": "2026-10-12T17:19:23.018Z",
+ "duration": 11790.417000000001,
+ "expected": 2,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ },
+ "cases": [
+ {
+ "title": "[P7-03 PRES-C01 C03 C06 C07 C10 W05 W06] unrelated canonical UI save preserves four source IDs, existing CV overrides, sibling and frozen package",
+ "file": "phase7-career-source-ids.spec.ts",
+ "line": 69,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4062
+ },
+ {
+ "title": "[P7-03 PRES-C01 C03 E05 E09] real HTTP bounds canonical last-writer saves and structured-history recovery without claiming stale-write protection",
+ "file": "phase7-career-source-ids.spec.ts",
+ "line": 185,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 875
+ }
+ ],
+ "reportErrors": [],
+ "configuration": {
+ "version": "1.62.1",
+ "workers": 1,
+ "projects": [
+ {
+ "name": "chromium",
+ "retries": 0
+ }
+ ]
+ },
+ "audit": {
+ "scans": [],
+ "violationNodes": 0,
+ "incompleteNodes": 0,
+ "checkContexts": [],
+ "qualification": "Every violation/incomplete category counted; complete node/check vectors remain exact raw report and extracted JSON. Parent contextual triage pending."
+ }
+ },
+ "career": {
+ "command": {
+ "name": "career",
+ "command": [
+ "rtk",
+ "proxy",
+ "node",
+ "node_modules/@playwright/test/cli.js",
+ "test",
+ "e2e/phase7-career-overview.spec.ts",
+ "--retries=0",
+ "--reporter=list,json",
+ "--output=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\career-results"
+ ],
+ "startedUtc": "2026-10-12T17:19:34.860436+00:00",
+ "finishedUtc": "2026-10-12T17:20:33.177194+00:00",
+ "exitCode": 0,
+ "stats": {
+ "startTime": "2026-10-12T17:19:35.427Z",
+ "duration": 57696.734,
+ "expected": 14,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ }
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-command.json",
+ "sha256": "5e6e2f2eb31bf8d6a7e99df223aa56e6f82fc36d960ffc834967464bf8a0f3c5",
+ "bytes": 642,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "reportRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.log",
+ "sha256": "ae9c59353ae0c468ce943d5937399c7daf2157695e72479bc1e595cda2a76b9f",
+ "bytes": 3266,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "stats": {
+ "startTime": "2026-10-12T17:19:35.427Z",
+ "duration": 57696.734,
+ "expected": 14,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ },
+ "cases": [
+ {
+ "title": "[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 106,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 928
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 320px overview and factual evidence preserve canonical source and recent CV links",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 139,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4401
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 360px overview and factual evidence preserve canonical source and recent CV links",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 139,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4162
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 390px overview and factual evidence preserve canonical source and recent CV links",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 139,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3788
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 768px overview and factual evidence preserve canonical source and recent CV links",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 139,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4141
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 1024px overview and factual evidence preserve canonical source and recent CV links",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 139,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4129
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 1280px overview and factual evidence preserve canonical source and recent CV links",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 139,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4380
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 1440px overview and factual evidence preserve canonical source and recent CV links",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 139,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4564
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 1920px overview and factual evidence preserve canonical source and recent CV links",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 139,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 4447
+ },
+ {
+ "title": "[P7-02 PRES-C02 E09] unavailable /career/profile stays unknown and retries its reads without writes or false first-run guidance",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 191,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 2262
+ },
+ {
+ "title": "[P7-02 PRES-C02 E09] unavailable /profile-cv/runs stays unknown and retries its reads without writes or false first-run guidance",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 191,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 2183
+ },
+ {
+ "title": "[P7-02 PRES-C02 E09] unavailable /cv/variants stays unknown and retries its reads without writes or false first-run guidance",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 191,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 2249
+ },
+ {
+ "title": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 229,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 6595
+ },
+ {
+ "title": "[P7-02 PRES-C01 C02] existing raw source copy and history entry remain read-only",
+ "file": "phase7-career-overview.spec.ts",
+ "line": 331,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 2129
+ }
+ ],
+ "reportErrors": [],
+ "configuration": {
+ "version": "1.62.1",
+ "workers": 1,
+ "projects": [
+ {
+ "name": "chromium",
+ "retries": 0
+ }
+ ]
+ },
+ "audit": {
+ "scans": [
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 320px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-nb-dark-320-populated-overview-audit",
+ "geometry": {
+ "width": 320,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/002-p7-career-nb-dark-320-populated-overview-audit.json",
+ "sha256": "06b9894b40df5b25aadfe47d380ffe29af49c9decc5c9b81a012049f2bd56736",
+ "bytes": 6792,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 320,
+ "height": 844
+ },
+ "state": "populated-overview",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 320px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-nb-dark-320-long-evidence-audit",
+ "geometry": {
+ "width": 320,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 8,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/004-p7-career-nb-dark-320-long-evidence-audit.json",
+ "sha256": "a2288f6072ead891375093fa002407fce5c056845ea1d5ff99eb4d4c681368af",
+ "bytes": 11676,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 320,
+ "height": 844
+ },
+ "state": "long-evidence",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "aria-hidden-focus",
+ "nodes": 1
+ },
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 360px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-en-light-360-populated-overview-audit",
+ "geometry": {
+ "width": 360,
+ "height": 800,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/006-p7-career-en-light-360-populated-overview-audit.json",
+ "sha256": "4967c67ec92d240fa20f82b2bc41c34fcb2e55d5b511e033f45f6407981a06b1",
+ "bytes": 6679,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 360,
+ "height": 800
+ },
+ "state": "populated-overview",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 360px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-en-light-360-long-evidence-audit",
+ "geometry": {
+ "width": 360,
+ "height": 800,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 8,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/008-p7-career-en-light-360-long-evidence-audit.json",
+ "sha256": "7ecb060300192a0c5b9827b24ebab835fbdd5648215cf9eaa9aea4bc0b37fb4d",
+ "bytes": 11585,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 360,
+ "height": 800
+ },
+ "state": "long-evidence",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "aria-hidden-focus",
+ "nodes": 1
+ },
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 390px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-nb-light-390-populated-overview-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/010-p7-career-nb-light-390-populated-overview-audit.json",
+ "sha256": "c2c8a7cdb3177360635095b74bcd6cf5e881448133b357f38da9b8b8100461c5",
+ "bytes": 6796,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "populated-overview",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 390px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-nb-light-390-long-evidence-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 8,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/012-p7-career-nb-light-390-long-evidence-audit.json",
+ "sha256": "d73b176c5a2750dd55ea1ddbe49ac868c6c38ac07b9924af78c11b096bb1ea6d",
+ "bytes": 11677,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "long-evidence",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "aria-hidden-focus",
+ "nodes": 1
+ },
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 768px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-en-dark-768-populated-overview-audit",
+ "geometry": {
+ "width": 768,
+ "height": 1024,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 1,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/014-p7-career-en-dark-768-populated-overview-audit.json",
+ "sha256": "79e22aff21539affadbdfeb0a37132d4624bae7bc6550eaceccd4f4b42b60b0e",
+ "bytes": 5998,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 768,
+ "height": 1024
+ },
+ "state": "populated-overview",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 1
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 768px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-en-dark-768-long-evidence-audit",
+ "geometry": {
+ "width": 768,
+ "height": 1024,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 7,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/016-p7-career-en-dark-768-long-evidence-audit.json",
+ "sha256": "89d50b7618ebb51a50935bbbfc564f70b252b930e8974eea64ab72ff04a77df3",
+ "bytes": 10419,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 768,
+ "height": 1024
+ },
+ "state": "long-evidence",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 1024px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-nb-dark-1024-populated-overview-audit",
+ "geometry": {
+ "width": 1024,
+ "height": 768,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 1,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/018-p7-career-nb-dark-1024-populated-overview-audit.json",
+ "sha256": "9416274400aef9ef072254ba01914c44daa7324f876cd7b07273a3c62e485003",
+ "bytes": 6194,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 1024,
+ "height": 768
+ },
+ "state": "populated-overview",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 1
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 1024px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-nb-dark-1024-long-evidence-audit",
+ "geometry": {
+ "width": 1024,
+ "height": 768,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 7,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/020-p7-career-nb-dark-1024-long-evidence-audit.json",
+ "sha256": "ab06eb0e4f2ed956cd36c9328f2dc64d096e623d9ec076204207137fb99e12fa",
+ "bytes": 10595,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "dark",
+ "width": 1024,
+ "height": 768
+ },
+ "state": "long-evidence",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 1280px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-en-light-1280-populated-overview-audit",
+ "geometry": {
+ "width": 1280,
+ "height": 320,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 1,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/022-p7-career-en-light-1280-populated-overview-audit.json",
+ "sha256": "1147566317d407fa4f55a29daebd710a06b5e2ed6919d694706ded2f7d4f9add",
+ "bytes": 6086,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 1280,
+ "height": 320
+ },
+ "state": "populated-overview",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 1
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 1280px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-en-light-1280-long-evidence-audit",
+ "geometry": {
+ "width": 1280,
+ "height": 320,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 7,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/024-p7-career-en-light-1280-long-evidence-audit.json",
+ "sha256": "09f2a02a6783ff589b05c4221cf3fdb73ed096ad649bdeb9514797224f9420ef",
+ "bytes": 10509,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 1280,
+ "height": 320
+ },
+ "state": "long-evidence",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 1440px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-nb-light-1440-populated-overview-audit",
+ "geometry": {
+ "width": 1440,
+ "height": 900,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 1,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/026-p7-career-nb-light-1440-populated-overview-audit.json",
+ "sha256": "b17107c4aa02114c5f96d80b4e195a207b17cce2462cf047226de37c5baf81d6",
+ "bytes": 6195,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 1440,
+ "height": 900
+ },
+ "state": "populated-overview",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 1
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 1440px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-nb-light-1440-long-evidence-audit",
+ "geometry": {
+ "width": 1440,
+ "height": 900,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 7,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/028-p7-career-nb-light-1440-long-evidence-audit.json",
+ "sha256": "140bdf86a0e3d8d95f4b409da4474b1d27942ea8899c11ee19a2e1601be94415",
+ "bytes": 15841,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "nb",
+ "theme": "light",
+ "width": 1440,
+ "height": 900
+ },
+ "state": "long-evidence",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 1920px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-en-dark-1920-populated-overview-audit",
+ "geometry": {
+ "width": 1920,
+ "height": 1080,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 1,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/030-p7-career-en-dark-1920-populated-overview-audit.json",
+ "sha256": "2a5f1935c4e8ddbd47be73964cb490dc32f3087d7230f7386ba6a7d469045d17",
+ "bytes": 6040,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 1920,
+ "height": 1080
+ },
+ "state": "populated-overview",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 1
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 1920px overview and factual evidence preserve canonical source and recent CV links",
+ "attachment": "p7-career-en-dark-1920-long-evidence-audit",
+ "geometry": {
+ "width": 1920,
+ "height": 1080,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 7,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/032-p7-career-en-dark-1920-long-evidence-audit.json",
+ "sha256": "ff66cdef6a1c1427213380396fe09f603bdcdb5478cef1df1dd9dde33bb055e9",
+ "bytes": 10463,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 1920,
+ "height": 1080
+ },
+ "state": "long-evidence",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C02 E09] unavailable /career/profile stays unknown and retries its reads without writes or false first-run guidance",
+ "attachment": "p7-career-en-dark-390-unavailable-profile-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/034-p7-career-en-dark-390-unavailable-profile-audit.json",
+ "sha256": "416a3fdf25bfe9631a29819d3060060a27811f3fbfb365ca0e6f43697508f663",
+ "bytes": 5945,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 390,
+ "height": 844
+ },
+ "state": "unavailable-profile",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C02 E09] unavailable /profile-cv/runs stays unknown and retries its reads without writes or false first-run guidance",
+ "attachment": "p7-career-en-dark-390-unavailable-runs-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/036-p7-career-en-dark-390-unavailable-runs-audit.json",
+ "sha256": "3395ba3449e5cb433bcce98ca25b44da3b82274b72f752130471522eb0f1c4e2",
+ "bytes": 6109,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 390,
+ "height": 844
+ },
+ "state": "unavailable-runs",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C02 E09] unavailable /cv/variants stays unknown and retries its reads without writes or false first-run guidance",
+ "attachment": "p7-career-en-dark-390-unavailable-variants-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 2,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/038-p7-career-en-dark-390-unavailable-variants-audit.json",
+ "sha256": "bd70a06a950d5a9727cdcc47f38c6523848ff3b20c1c81feb898069920a7235f",
+ "bytes": 6107,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "dark",
+ "width": 390,
+ "height": 844
+ },
+ "state": "unavailable-variants",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 2
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion",
+ "attachment": "p7-career-en-light-390-pending-evidence-read-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 7,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/040-p7-career-en-light-390-pending-evidence-read-audit.json",
+ "sha256": "1cf61579d7e4b068a6637706d5c9c10ceee13b4d098768bc4cc6115b289b4b02",
+ "bytes": 9069,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "pending-evidence-read",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 7
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion",
+ "attachment": "p7-career-en-light-390-failed-save-retained-draft-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 8,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/042-p7-career-en-light-390-failed-save-retained-draft-audit.json",
+ "sha256": "3c7cdfe93e72fecd2bd2e127bad501f151c44abbe5e005113f93b7270ea01c64",
+ "bytes": 10008,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "failed-save-retained-draft",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 8
+ }
+ ]
+ },
+ {
+ "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion",
+ "attachment": "p7-career-en-light-390-failed-delete-retained-row-audit",
+ "geometry": {
+ "width": 390,
+ "height": 844,
+ "rootOverflow": 0
+ },
+ "engine": null,
+ "toolOptions": null,
+ "violationNodes": 0,
+ "incompleteNodes": 8,
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/044-p7-career-en-light-390-failed-delete-retained-row-audit.json",
+ "sha256": "ac1472ace969c0ff3d8c3890fb77df067a0eda0c151fb8b7a5947e5f3c5bd75d",
+ "bytes": 10190,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "context": {
+ "sample": {
+ "language": "en",
+ "theme": "light",
+ "width": 390,
+ "height": 844
+ },
+ "state": "failed-delete-retained-row",
+ "limits": [
+ "No human screen reader or physical touch/software keyboard",
+ "No actual browser zoom or production font/photo qualification",
+ "Controlled faults are explicit; no model/provider invocation"
+ ]
+ },
+ "rules": [
+ {
+ "kind": "incomplete",
+ "id": "color-contrast",
+ "nodes": 8
+ }
+ ]
+ }
+ ],
+ "violationNodes": 0,
+ "incompleteNodes": 99,
+ "checkContexts": [
+ {
+ "kind": "incomplete",
+ "rule": "color-contrast",
+ "check": "color-contrast",
+ "message": "Element content is too short to determine if it is actual text content",
+ "occurrences": 22,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-nb-dark-320-populated-overview-audit",
+ "target": [
+ ".MuiBadge-badge"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "9.0pt (12px)",
+ "fontWeight": "normal",
+ "messageKey": "shortTextContent",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ },
+ {
+ "attachment": "p7-career-nb-dark-320-long-evidence-audit",
+ "target": [
+ ".MuiBadge-badge"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "9.0pt (12px)",
+ "fontWeight": "normal",
+ "messageKey": "shortTextContent",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ }
+ ]
+ },
+ {
+ "kind": "incomplete",
+ "rule": "color-contrast",
+ "check": "color-contrast",
+ "message": "Element's background color could not be determined because it is overlapped by another element",
+ "occurrences": 74,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-nb-dark-320-populated-overview-audit",
+ "target": [
+ ".MuiSelect-select"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "10.5pt (14px)",
+ "fontWeight": "normal",
+ "messageKey": "bgOverlap",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ },
+ {
+ "attachment": "p7-career-nb-dark-320-long-evidence-audit",
+ "target": [
+ ".css-1f6076n > .MuiSelect-select.MuiSelect-outlined.css-1ehla7j"
+ ],
+ "data": {
+ "contrastRatio": 0,
+ "fontSize": "10.5pt (14px)",
+ "fontWeight": "normal",
+ "messageKey": "bgOverlap",
+ "expectedContrastRatio": "4.5:1"
+ },
+ "relatedNodes": []
+ }
+ ]
+ },
+ {
+ "kind": "incomplete",
+ "rule": "aria-hidden-focus",
+ "check": "focusable-modal-open",
+ "message": "Check that focusable elements are not tabbable in the current state",
+ "occurrences": 3,
+ "representativeContexts": [
+ {
+ "attachment": "p7-career-nb-dark-320-long-evidence-audit",
+ "target": [
+ "#menu-"
+ ],
+ "data": null,
+ "relatedNodes": [
+ {
+ "html": "",
+ "target": [
+ "li[data-value=\"evidence\"]"
+ ]
+ }
+ ]
+ },
+ {
+ "attachment": "p7-career-en-light-360-long-evidence-audit",
+ "target": [
+ "#menu-"
+ ],
+ "data": null,
+ "relatedNodes": [
+ {
+ "html": "",
+ "target": [
+ "li[data-value=\"evidence\"]"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "qualification": "Every violation/incomplete category counted; complete node/check vectors remain exact raw report and extracted JSON. Parent contextual triage pending."
+ }
+ },
+ "career-preservation": {
+ "command": {
+ "name": "career-preservation",
+ "command": [
+ "rtk",
+ "proxy",
+ "node",
+ "node_modules/@playwright/test/cli.js",
+ "test",
+ "e2e/redesign-preservation.spec.ts",
+ "--grep",
+ "mobile CV override|legacy workspace preserves frozen",
+ "--retries=0",
+ "--reporter=list,json",
+ "--output=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\career-preservation-results"
+ ],
+ "startedUtc": "2026-10-12T17:20:33.190730+00:00",
+ "finishedUtc": "2026-10-12T17:20:48.024384+00:00",
+ "exitCode": 0,
+ "stats": {
+ "startTime": "2026-10-12T17:20:33.697Z",
+ "duration": 14295.822,
+ "expected": 2,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ }
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-preservation-command.json",
+ "sha256": "06d19a03a801832372896867c441578133205d30e17dd75fe19a0428f78ce48d",
+ "bytes": 742,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "reportRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-preservation.json",
+ "sha256": "2422df82c11e45b281248e9bf40075a9e25c6394b1b80e4136bb3c7533e1a4a5",
+ "bytes": 114011,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-preservation.log",
+ "sha256": "fbe9281765a5c5f86da9e6ee2272c431b331e246dc21887988c93870e169fb50",
+ "bytes": 866,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "stats": {
+ "startTime": "2026-10-12T17:20:33.697Z",
+ "duration": 14295.822,
+ "expected": 2,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ },
+ "cases": [
+ {
+ "title": "[PRES-C01 PRES-C06 PRES-C07 PRES-C10] mobile CV override persists without changing the canonical profile or sibling CV",
+ "file": "redesign-preservation.spec.ts",
+ "line": 43,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3676
+ },
+ {
+ "title": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change",
+ "file": "redesign-preservation.spec.ts",
+ "line": 73,
+ "expectedStatus": "passed",
+ "project": "chromium",
+ "resultStatuses": [
+ "passed"
+ ],
+ "retries": [
+ 0
+ ],
+ "errors": [
+ []
+ ],
+ "durationMs": 3543
+ }
+ ],
+ "reportErrors": [],
+ "configuration": {
+ "version": "1.62.1",
+ "workers": 1,
+ "projects": [
+ {
+ "name": "chromium",
+ "retries": 0
+ }
+ ]
+ },
+ "audit": {
+ "scans": [],
+ "violationNodes": 0,
+ "incompleteNodes": 0,
+ "checkContexts": [],
+ "qualification": "Every violation/incomplete category counted; complete node/check vectors remain exact raw report and extracted JSON. Parent contextual triage pending."
+ }
+ }
+ },
+ "gates": [
+ {
+ "command": {
+ "name": "typecheck",
+ "command": [
+ "rtk",
+ "proxy",
+ "npm.cmd",
+ "run",
+ "typecheck"
+ ],
+ "startedUtc": "2026-10-12T17:16:49.866313+00:00",
+ "finishedUtc": "2026-10-12T17:16:59.863357+00:00",
+ "exitCode": 0
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/gates/typecheck-command.json",
+ "sha256": "8e1879a00704cd9c70b98c3f58a804a50b8d4b6d606df4249f233468a68d6386",
+ "bytes": 247,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/gates/typecheck.log",
+ "sha256": "89b0ec97b537eca6560c13ca2dfea9e3a97dd1bb35580c4ff39d2462db25e080",
+ "bytes": 148,
+ "hashPolicy": "Exact measured raw bytes"
+ }
+ },
+ {
+ "command": {
+ "name": "lint",
+ "command": [
+ "rtk",
+ "proxy",
+ "npm.cmd",
+ "run",
+ "lint"
+ ],
+ "startedUtc": "2026-10-12T17:16:59.865374+00:00",
+ "finishedUtc": "2026-10-12T17:17:18.948670+00:00",
+ "exitCode": 0
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/gates/lint-command.json",
+ "sha256": "fc908117f4eedf85f3ab82b0a655d70ef23bc63c1c81e5a4c7f39fc08133fb7b",
+ "bytes": 237,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/gates/lint.log",
+ "sha256": "b040dbeca9b4adb3f6f4c25ac49de0d37e921375b2d9b57e87b542a10f599913",
+ "bytes": 136,
+ "hashPolicy": "Exact measured raw bytes"
+ }
+ },
+ {
+ "command": {
+ "name": "browser-typecheck",
+ "command": [
+ "rtk",
+ "proxy",
+ "npm.cmd",
+ "exec",
+ "tsc",
+ "--",
+ "--project",
+ "../.artifacts/phase7/e2e-tsconfig.json",
+ "--noEmit"
+ ],
+ "startedUtc": "2026-10-12T17:17:18.950693+00:00",
+ "finishedUtc": "2026-10-12T17:17:23.007397+00:00",
+ "exitCode": 0
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/gates/browser-typecheck-command.json",
+ "sha256": "5830712cc6e82a98a7be85cbcafad7e02d798553a4f55fcf88624744161d5af0",
+ "bytes": 343,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/gates/browser-typecheck.log",
+ "sha256": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6",
+ "bytes": 78,
+ "hashPolicy": "Exact measured raw bytes"
+ }
+ },
+ {
+ "command": {
+ "name": "build",
+ "command": [
+ "rtk",
+ "proxy",
+ "npm.cmd",
+ "run",
+ "build"
+ ],
+ "startedUtc": "2026-10-12T17:17:23.009404+00:00",
+ "finishedUtc": "2026-10-12T17:17:30.647328+00:00",
+ "exitCode": 0
+ },
+ "commandRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/gates/build-command.json",
+ "sha256": "29ec3f840d8e6b954ffadb769bb141ccb8dc59b7ec3a282d06e8cdd260a9a0ca",
+ "bytes": 239,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "logRaw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/gates/build.log",
+ "sha256": "96fcb637780de262194e472492ef7e0811684d881acdcd689bf91890b78b33b2",
+ "bytes": 670,
+ "hashPolicy": "Exact measured raw bytes"
+ }
+ }
+ ],
+ "auxiliary": {
+ "backend": {
+ "career.log": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/backend/career.log",
+ "sha256": "2ed40f9cf55676cf5dc430102facd8e09512b861fa828918d3af245dd2553b04",
+ "bytes": 611,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "career.trx": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/backend/career.trx",
+ "sha256": "eb8090d5f0a80fd5b8732a0e55c999555aa77ba4f6f1dbf32e29014679190ce8",
+ "bytes": 141150,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "command.json": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/backend/command.json",
+ "sha256": "6251ba7a5713e67c534ad788b16ba9f4e9b72ad58fcf57a22099302b8a98574f",
+ "bytes": 1268,
+ "hashPolicy": "Exact saved raw bytes"
+ }
+ },
+ "seeder": {
+ "command.json": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/seeder/command.json",
+ "sha256": "8db2e11ea626473c31a633733fb68b8c0aaa9e87d5579d4ea231eb338f761e5c",
+ "bytes": 1298,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "seed-career-review.py": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/seeder/seed-career-review.py",
+ "sha256": "ffab6b9f8a31fdba30e1ab70a55807defed44951878d4a634ada82001ebe39fd",
+ "bytes": 17017,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "stderr.log": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/seeder/stderr.log",
+ "sha256": "a4ed4c2c830adf807283a578ea7ee8b2f659416a86da69815d6147237e7d7f36",
+ "bytes": 79,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "stdout.log": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/seeder/stdout.log",
+ "sha256": "dea940e89d677b5e877c4332b698f80262e41e4670e0c3a378904f2abd540cfa",
+ "bytes": 697,
+ "hashPolicy": "Exact saved raw bytes"
+ }
+ }
+ },
+ "sourceSnapshots": [
+ {
+ "originalSourcePath": "job-tracker-ui/src/views/CareerProfilePage.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/views/CareerProfilePage.tsx",
+ "sha256": "03d4b7d4bc9aa55d597e70980f99449e4da0a5ab8c1f4a06aff6bca79d45abfd",
+ "bytes": 59986,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/views/CareerProfilePage.tsx",
+ "sha256": "f502f4bca67d7cc1f3975a5d2118bc5e7e59291539e794082f44d2c1f772f735",
+ "bytes": 59031,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
+ "sha256": "7a6aeb6cfdd790ec67177620711711319642d9e283fb00902b343cf4fa8a1886",
+ "bytes": 6321,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
+ "sha256": "caadfe1462fb68456ad66834be3b2e40244a8367720e5345e3406d51a4cc9454",
+ "bytes": 6219,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/views/career/CareerProfileSections.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/views/career/CareerProfileSections.tsx",
+ "sha256": "0c772feb6bde8324676b0884aaf343283465c5cd3b3318128363063df4ea22ab",
+ "bytes": 20375,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/views/career/CareerProfileSections.tsx",
+ "sha256": "aa3acbe472d34074a517a566c77983e7d95f8ec1df9ee37e47537ad96beffd0e",
+ "bytes": 20131,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/i18n/translations.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/i18n/translations.ts",
+ "sha256": "e65393226855fccb6b9677e781c6f698cc8eff41396a5440931fcfe09c7dc58b",
+ "bytes": 318871,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/i18n/translations.ts",
+ "sha256": "b1a1dc86dc71b453d41d91247a9d8cab9cef0f37d3da94e686c3f723d4da39f8",
+ "bytes": 313601,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/profileCv.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/profileCv.ts",
+ "sha256": "190b3e15ab00741f1e6bea868a79c3ca221e059936406098b693d13f3ef3f1d7",
+ "bytes": 12131,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/profileCv.ts",
+ "sha256": "7e0b8aa13aa6df830f7e508c338c1e2dd995574bbfbd3233602654452f75cdb9",
+ "bytes": 11796,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/career-import-review.test.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/career-import-review.test.tsx",
+ "sha256": "2ec396e29bacccacc7f9cac675894625474c99d68be33d88eaa15c93fb4ee43c",
+ "bytes": 18902,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/career-import-review.test.tsx",
+ "sha256": "2ec396e29bacccacc7f9cac675894625474c99d68be33d88eaa15c93fb4ee43c",
+ "bytes": 18902,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/career-history-view.test.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/career-history-view.test.tsx",
+ "sha256": "dfed6b3ccce38aba1492bc39bd94b1427ed307ea3ef1221f34095d8441e2cb59",
+ "bytes": 8309,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/career-history-view.test.tsx",
+ "sha256": "dfed6b3ccce38aba1492bc39bd94b1427ed307ea3ef1221f34095d8441e2cb59",
+ "bytes": 8309,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/career-editor.test.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/career-editor.test.tsx",
+ "sha256": "65ca2f09815b1cedfe693e772839655717e705d2c88795344c3a114eb21b1b01",
+ "bytes": 17307,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/career-editor.test.tsx",
+ "sha256": "65ca2f09815b1cedfe693e772839655717e705d2c88795344c3a114eb21b1b01",
+ "bytes": 17307,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/profile-page.test.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/profile-page.test.tsx",
+ "sha256": "2fdff01be0956e2dc232ca6381d82c129b2a3522c30c6b14441d893fc899dc7f",
+ "bytes": 30571,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/profile-page.test.tsx",
+ "sha256": "9aa00f32d8c7fb97b5e8b4d8de856d371aed5e2fb5efedafd171e49259304426",
+ "bytes": 30010,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/career-workspace-page.test.tsx",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/career-workspace-page.test.tsx",
+ "sha256": "628512985a14e71d0d34bf1e3e0e77d948ad7d5c3eb608de482051f2aedf3052",
+ "bytes": 14421,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/career-workspace-page.test.tsx",
+ "sha256": "d2a27946a0891742a18a28ec2ec87d6742ad413aae4aa5fdad0f2bb0a47c124b",
+ "bytes": 14210,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/src/profileCv.test.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/profileCv.test.ts",
+ "sha256": "c1c482bed380429489f1757852811e0d1e7f48b71af2bd7899693d2e8475ac9d",
+ "bytes": 4316,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/src/profileCv.test.ts",
+ "sha256": "c1c482bed380429489f1757852811e0d1e7f48b71af2bd7899693d2e8475ac9d",
+ "bytes": 4316,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/e2e/phase7-career-import-review.spec.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/phase7-career-import-review.spec.ts",
+ "sha256": "e34881500480e5fa70cba8cec8ddddd0777bb9b12776efa5947f2c4dd7326ad2",
+ "bytes": 37218,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/phase7-career-import-review.spec.ts",
+ "sha256": "e34881500480e5fa70cba8cec8ddddd0777bb9b12776efa5947f2c4dd7326ad2",
+ "bytes": 37218,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/e2e/phase7-career-editor.spec.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/phase7-career-editor.spec.ts",
+ "sha256": "dfc696107e8ad9adf265a5bae885407afd09f1be3b507de8ff03739b39a7f0b1",
+ "bytes": 29805,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/phase7-career-editor.spec.ts",
+ "sha256": "dfc696107e8ad9adf265a5bae885407afd09f1be3b507de8ff03739b39a7f0b1",
+ "bytes": 29805,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/e2e/phase7-career-source-ids.spec.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/phase7-career-source-ids.spec.ts",
+ "sha256": "92bc8f1b4c82210207071c56940813dfece3136832ba09ebd1e6c3471d8d7945",
+ "bytes": 20601,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/phase7-career-source-ids.spec.ts",
+ "sha256": "92bc8f1b4c82210207071c56940813dfece3136832ba09ebd1e6c3471d8d7945",
+ "bytes": 20601,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/e2e/phase7-career-overview.spec.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/phase7-career-overview.spec.ts",
+ "sha256": "40370ab8871b6f0d1b52123aecde692a9e1b9bac67d84f56b230334b687336de",
+ "bytes": 25916,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/phase7-career-overview.spec.ts",
+ "sha256": "40370ab8871b6f0d1b52123aecde692a9e1b9bac67d84f56b230334b687336de",
+ "bytes": 25916,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/e2e/redesign-preservation.spec.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/redesign-preservation.spec.ts",
+ "sha256": "997b01c7e2a313e5f590820bad6b630af7eec67e782df7a786ccce6ebd569da0",
+ "bytes": 23275,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/redesign-preservation.spec.ts",
+ "sha256": "fd96f798f33badd676c5850f65b306ad171af69bfc5644e35760482518c25105",
+ "bytes": 22991,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/playwright.config.ts",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/playwright.config.ts",
+ "sha256": "01840494c782b2cc3c4c639dd2978a98ffa685b656e6a61fe4c503aeac6798f3",
+ "bytes": 2669,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/playwright.config.ts",
+ "sha256": "bcf1dc87bd573f251ab3030088801fa5966907c86fdb90c701003c180ed969d3",
+ "bytes": 2606,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ },
+ {
+ "originalSourcePath": "job-tracker-ui/e2e/helpers/seed-career-review.py",
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/helpers/seed-career-review.py",
+ "sha256": "ffab6b9f8a31fdba30e1ab70a55807defed44951878d4a634ada82001ebe39fd",
+ "bytes": 17017,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "canonicalLf": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/source/job-tracker-ui/e2e/helpers/seed-career-review.py",
+ "sha256": "ffab6b9f8a31fdba30e1ab70a55807defed44951878d4a634ada82001ebe39fd",
+ "bytes": 17017,
+ "hashPolicy": "UTF-8 text with CRLF normalized to LF"
+ },
+ "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance."
+ }
+ ],
+ "buildId": "_ZuuD2E8lPzbPiP8Dve7Q",
+ "export": {
+ "files": [
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/404.html",
+ "sha256": "2eafc625af17998adde8f62e83cdfd0d62464041cda2bc39b4e859cbcdf8189a",
+ "bytes": 12482,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/__next.__PAGE__.txt",
+ "sha256": "ef6c4260e88e9cb9bc5a16c45bf69aa0559bdb9868075a5cbf6731644077851a",
+ "bytes": 5511,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/__next._full.txt",
+ "sha256": "f390771c7b32ea2ef3d8eb25730fb8ac13d8209e37fef5b1382bd18140c9deeb",
+ "bytes": 6026,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/__next._tree.txt",
+ "sha256": "3458a345203b79519a91f1b017f7d97541ac2d921c19d0c072726ccebbce3a9c",
+ "bytes": 351,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/_ZuuD2E8lPzbPiP8Dve7Q/_buildManifest.js",
+ "sha256": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea",
+ "bytes": 219,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/_ZuuD2E8lPzbPiP8Dve7Q/_clientMiddlewareManifest.js",
+ "sha256": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a",
+ "bytes": 96,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/_ZuuD2E8lPzbPiP8Dve7Q/_ssgManifest.js",
+ "sha256": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00",
+ "bytes": 80,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/02mwb4hjks52g.js",
+ "sha256": "e131c5847ddf632dab1d077fa638a06af4728ad88163bccc93a9d9ed30e8be94",
+ "bytes": 53894,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/08ydkbcc5f93r.js",
+ "sha256": "6b660d5f902d33aad41e6f326a9869e54a489a21181753862ac6abe71f8eba40",
+ "bytes": 141944,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/091poeh_7k8jp.js",
+ "sha256": "a6aacb5594c32836ed8721a00d462c9a4003c1fcf1baae401dbaf063109df392",
+ "bytes": 17603,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0cz1d0mv5g_q7.js",
+ "sha256": "0973c1d64c88adc8e3c950410cb58b288f72118d5965b78049438deb8f2f9683",
+ "bytes": 112594,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0f20amr0-m-zl.js",
+ "sha256": "70b0fb6db2fa0749d01768823746641975bfc42a65e133a2b138e4aae0ba660b",
+ "bytes": 49416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0g8jdam99b7-z.js",
+ "sha256": "94264307de5eb80b0e87dfd263607fe24b5cb19d6008184ab6b107a4873b49ac",
+ "bytes": 54284,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0lfuwd98rim9r.js",
+ "sha256": "db3216f3501d53c517031483d281466eb08c5054d83bb0d5009731e5fbaf3a1f",
+ "bytes": 28085,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0m7vi4hs61md9.js",
+ "sha256": "b098d60b98930bfa895489a42ae534227e2e44e2c888aaa1a139fadbe700d119",
+ "bytes": 32405,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0nb4syhs2ze1s.js",
+ "sha256": "20b2e2f1195168f16752da3fe651e6d6f0e2561b0139de4042e7faee590114a7",
+ "bytes": 1112,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0swqvzc1gm8tm.js",
+ "sha256": "ace5778cc960bb904ab2b77085d6c6ee4b9efc9d95023d3100a8f850af6512b0",
+ "bytes": 257660,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0w3y5uv0hr947.js",
+ "sha256": "94b0774abaaa0aaf1f6f324d72982fcec39061a97602b8d27d7550e2076ab0c0",
+ "bytes": 23683,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/0xj7pytmwb27r.js",
+ "sha256": "83ba726bbf10cc9eb7375f21db41ccb59491ef31cd0031e0bd3fde67c49ed547",
+ "bytes": 2312,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1-bjgejrqfcdt.js",
+ "sha256": "f3eb6b9bfc32c1e454abcf45ba3217afff46c2feb8d35de6a689b8e12bb95717",
+ "bytes": 69675,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/100y3nigll5ap.js",
+ "sha256": "49c825c42cc40fbf26b5780f710234537974fd99792119db43ffc29c666141ae",
+ "bytes": 7081,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1bo5vruln9ro7.js",
+ "sha256": "d3c3fd8cd9086e741993371e2a1c847f9262a11c5ff4ac15ca956143a8ad68e2",
+ "bytes": 32051,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1emuuo-0m8vez.js",
+ "sha256": "4c21bf2a07fcdc992e3e74d65c78b33bb6c44a14298f641aa0008aa8f2187416",
+ "bytes": 17565,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1eux0673d84-v.js",
+ "sha256": "f96dd6e8841910f12c58e92b5b8ce002e9fb8dc539c5acac4e1ed0fe6ef588d4",
+ "bytes": 2764,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1jhpn3g6nuazw.js",
+ "sha256": "f4aefb7dd17514ff4fa66d3e1f51e3b817de5748b56f38c1032bdc3afd8b16a0",
+ "bytes": 45306,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1k_5axiqq7um2.js",
+ "sha256": "d4cc9b89e854d02a65428f540dbda1845849d96e994a56a20c5e441db99e2f23",
+ "bytes": 37926,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1ocp5iwqw5t8n.js",
+ "sha256": "5770e4f6c9b589511b855e40fd717ee066d543fa6e4e6cc54cc5bd252bbe47a1",
+ "bytes": 24802,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1ookeyi94iiwv.js",
+ "sha256": "883db2ccfca25d90c8b00472e71c3c2c4c068460911ef850f7a9e9e9f19fcbe9",
+ "bytes": 4800,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1owxpom4r3xpr.js",
+ "sha256": "372368d3aba84cb4a23eca2694bc554d50575b341a8b73e2074c4fac820beb7b",
+ "bytes": 3560,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1pvs_7i8s24h_.js",
+ "sha256": "e00d3cb92b81cf1572f00175d3b25bf3805946d5bd189e8d268c23af449473f3",
+ "bytes": 62964,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1qqkyuzg57fzy.js",
+ "sha256": "e6c51af6bf0550be75844042339019ccc58e5be166c0fba97a4d8534f021d1ca",
+ "bytes": 438064,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1wn9plf_g3dwv.js",
+ "sha256": "a56a34c253983d23225447640cd7ee4a6a4e6ed62d83577640e3d557cc0be6d5",
+ "bytes": 39663,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1xwc-b795syag.css",
+ "sha256": "f73c002233f931ca14d0ae58815c47ca9f2659f25b1547a6d1fdca12a2a00b3f",
+ "bytes": 293,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1yr2lgiku_lgn.js",
+ "sha256": "0869486e8c706cf09cef4ff7c21a72dcb51af1b0aff61154ae7ef653a3fb892e",
+ "bytes": 34520,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/1zcy_4vqhe6sw.js",
+ "sha256": "b3b9895b34038841ef594a45b02c1c4d176e6c1a4828c8c06a60ca616128801d",
+ "bytes": 4918,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/24lsivow0-r0-.js",
+ "sha256": "b9f7534286f4ebd10f0ecd6f867e6edba5b7ccec02f3b6082e930f8b4e2ca46b",
+ "bytes": 31624,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/2e2n0wy891_-d.js",
+ "sha256": "3436d9be1827de975577e7fcc84eaf322dcd2ab163c3534fd4b485814e7e831f",
+ "bytes": 14467,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/2fjpwi22kr5uy.js",
+ "sha256": "38ba6df82e11dd976fbc93026a9cfc8e1523537b9a4324a2f1d90883dee84884",
+ "bytes": 207715,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/2hhjn96fczjvs.js",
+ "sha256": "589c85f58bad63587b2822add77b37080bc573a1f7ad90f8d3e691a22f095456",
+ "bytes": 41242,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/2q65uitl2oksj.js",
+ "sha256": "f47d839bc4ca7396d870f0b27c9b0bb070860b978ab137c576927effb9720192",
+ "bytes": 17234,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/2vlttipo05xfv.js",
+ "sha256": "a17d6235f5f3d618b8d0c03fcafe6ee624088571c8b29f1f6d8800f8f57bccf2",
+ "bytes": 19557,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/2vlvgi2hbk32a.js",
+ "sha256": "10157c67f2fdbecef54efa23ba15ea21513f773af8787b594e87133c45a45cd1",
+ "bytes": 177687,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3--i00i4av4q_.js",
+ "sha256": "79902e86c8d920115cba0abc6e6b787eca1d8aa59b687a94ce889f270a3cf600",
+ "bytes": 24247,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3-8sli__93ru0.js",
+ "sha256": "a76c7a411c8352b9b9b1ce07e737b496f5e4023e399c27aa04007e88754c3f0a",
+ "bytes": 4110,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/31nkei43jjbv6.js",
+ "sha256": "396e43ac57c3488d26b3dda208f3a23a4d3e0d2d527e9553fdef7932210753d2",
+ "bytes": 11304,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/39qtpg2zpb1d8.js",
+ "sha256": "b7e1066bd4d6cd5cf6c2448bf89c5a008e5c189e58b7b7b25791b9bdb100f39c",
+ "bytes": 37956,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3d1sq_9gctax5.js",
+ "sha256": "98b9561a1ee4177229295eca3efa72ff36466f1b392f617af26a15817f402cba",
+ "bytes": 6155,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3dq3l-or19e0_.js",
+ "sha256": "1f05bc4dd91710507a63e773b3a878f7925765e568f673aa17cb7cdc8d1e2c68",
+ "bytes": 4834,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3f82vakjf_7-4.js",
+ "sha256": "dd882483d27fd161d7fe8bf3031eac9d21b9d04fe85bd2b600e8a345156ff80e",
+ "bytes": 61704,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3gf4f1j6l-alg.js",
+ "sha256": "30ed0f30bd9de0f1229caa107a98ce7e5695227ac4b9e7f3272f7b10eaa866dd",
+ "bytes": 118155,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3nrlrkxac2pon.js",
+ "sha256": "751243327443f5ccdd8b5f3df50b32ab3d2744dcdf7e40b002b7f432f34b06f6",
+ "bytes": 11919,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3oic_1dun0n0c.js",
+ "sha256": "dc3c80dcc93f8d7bc5209cb6310dcf035cdcadc9630cdcc9663032af5788f55c",
+ "bytes": 417662,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3pd_mozp76yih.js",
+ "sha256": "0f1d6719ed49d8ac6f2b98974dd1be831982bcea2b1955efb97b2bf178fdce18",
+ "bytes": 228034,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3q6k02svdfjz4.js",
+ "sha256": "55a0099595493aff2d0a121d91ef55d4e7748180ad87bd0ed077d6ab84586f62",
+ "bytes": 245,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3t4zlerpupcoq.js",
+ "sha256": "b1b1cc211c58922939677aaad111dd106a98ffd9e08a40dff208f8c4d9e7a95b",
+ "bytes": 25352,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3wi4ei8dsihay.js",
+ "sha256": "56ff128469b14721092d27a5644f1eb532bd3d81430edccc854817ce0cfaedc5",
+ "bytes": 11665,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/3y9_6i44vsn5e.js",
+ "sha256": "8344e681e09c997ec542b3342f5beb2df4be04381cad079fa44112b60b813d93",
+ "bytes": 12492,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/406gm9r2rgjcf.js",
+ "sha256": "c165b5e9dced109c6faf32b8bdcbe2050471f67c5bc37c8349404827d4575ca1",
+ "bytes": 158095,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_next/static/chunks/turbopack-14p19yf3yful3.js",
+ "sha256": "79ab929130be94debf628997bd7a90fa07b385be7eb4a27928068daa4f597706",
+ "bytes": 9886,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_not-found/__next._full.txt",
+ "sha256": "78ee1f443a282cbede8f78b748d44850bcb18ab49b8da122bdfa9b8de2b0220c",
+ "bytes": 7488,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_not-found/__next._not-found/__PAGE__.txt",
+ "sha256": "90ffc78e5cdee7f3ff63e385e24c5a2da69fb1dba9f5f8560276e9434204d007",
+ "bytes": 6454,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_not-found/__next._tree.txt",
+ "sha256": "33e47a634cffd9a8bd14eb8cd6d72125f0321855b2558b169cfbf06a6d5667d3",
+ "bytes": 429,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_not-found.html",
+ "sha256": "2eafc625af17998adde8f62e83cdfd0d62464041cda2bc39b4e859cbcdf8189a",
+ "bytes": 12482,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/_not-found.txt",
+ "sha256": "78ee1f443a282cbede8f78b748d44850bcb18ab49b8da122bdfa9b8de2b0220c",
+ "bytes": 7488,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/favicon.ico",
+ "sha256": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a",
+ "bytes": 147708,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/favicon.svg",
+ "sha256": "f46bb75bd17edaa86713a92b40774be5055bc2bd5f49223b3891fbe9a5d068cb",
+ "bytes": 1002,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/index.html",
+ "sha256": "6dac9194621636e9a18ee51b31890a0b832e98a4c6db2d250f4ccd63577661ca",
+ "bytes": 10130,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/index.txt",
+ "sha256": "f390771c7b32ea2ef3d8eb25730fb8ac13d8209e37fef5b1382bd18140c9deeb",
+ "bytes": 6026,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/logo192.png",
+ "sha256": "bc652031597fabd19b9f14e22a71f809490d218037521b3b64d013418c1390b4",
+ "bytes": 32284,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/logo512.png",
+ "sha256": "5129e9bc1ba812b711fd9a646d3a38a906d365a26ee685df183b8752458944d4",
+ "bytes": 133453,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/manifest.json",
+ "sha256": "2667ce63c2e0835b7007239816a5597639321d333da396a78638dfa9e8a7c935",
+ "bytes": 956,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/mockups/dashboard.svg",
+ "sha256": "318be3adb1324c26eb30f05572a29528a3e38331c6a604652eef75b54f8c29dc",
+ "bytes": 9130,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/mockups/pipeline.svg",
+ "sha256": "db2ef41faabeb90e7ce85413e168581686c54535d970fc7d8deda3888a479de4",
+ "bytes": 7889,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/mockups/workspace.svg",
+ "sha256": "9bbab22349147c7b01d6e18c93c622a6f8aed6dedaf23715189ab54d60e1ddbd",
+ "bytes": 10361,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/export/robots.txt",
+ "sha256": "90d24bc3bf698ac1e173739502298ccca72adf1f564fab05f484b8c48d1cadd2",
+ "bytes": 67,
+ "hashPolicy": "Exact measured raw bytes"
+ }
+ ],
+ "count": 75,
+ "sha256": "22e9f8693243dd8a5bb3bc383486592c7b733ff28c0237efd6732351d0c0ce3a",
+ "policy": "Windows Path sort; original output path + TAB + exact raw file SHA + LF"
+ },
+ "history": [
+ {
+ "manifest": {
+ "path": ".artifacts/phase7/p7-03/import-history/native-baseline-w4/results.json",
+ "sha256": "41ac7a083653df61c103f9bff545c6e506a664282f6ecec92e346b8a0ac34be7",
+ "bytes": 48375,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "classification": "0PASS/6FAIL. Five missing-checkbox setups used invalid missing-level French at API admission; these are not native Low-French regression proof. Baseline presentation/recovery absences and actual Restore baseline remain qualified."
+ },
+ {
+ "manifest": {
+ "path": ".artifacts/phase7/p7-03/import-history/native-attempt1-3dik/results.json",
+ "sha256": "7dc27e433be7299d23bd31b5255d35b1070b3a6fd4bc7b361480e807180ff6c2",
+ "bytes": 55198,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "classification": "1PASS/5FAIL; Restore passed, five cases exposed the invalid French fixture. Backend normalization was preserved; corrected native fixture verifies reachable Low Contact via HTTP before UI."
+ },
+ {
+ "manifest": {
+ "path": ".artifacts/phase7/p7-03/import-history/native-attempt2-rury/results.json",
+ "sha256": "e8fa9ba76160c3336037fb4996d383190fc9ee6b4a4d4abdb2b8f2cb6c803f10",
+ "bytes": 54900,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "classification": "4PASS/2FAIL; repeated-init-script language setup failure and actual NB320 Pro notice scrollable-region-focusable violation."
+ },
+ {
+ "manifest": {
+ "path": ".artifacts/phase7/p7-03/import-history/native-attempt3-cav7/results.json",
+ "sha256": "a477ab1016157b32ee1b1caef59bd9878ea96f94c83caeb13c29fa153eed914d",
+ "bytes": 74725,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "classification": "4PASS/2FAIL; focus fix passed, repeat navigation still required explicit reload and the separate import Pro notice retained its real scroll violation."
+ },
+ {
+ "manifest": {
+ "path": ".artifacts/phase7/p7-03/import-history/native-attempt4-qhax/results.json",
+ "sha256": "04203026006e59c54d43b21f60be58a50723cd81aaa4ecf053db2d4c62da6c73",
+ "bytes": 70469,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "classification": "5PASS/1FAIL; language fixture fixed, remaining actual NB320 pending-ready success Alert scroll violation. Owner-local alert wrapping corrected, not suppressed."
+ },
+ {
+ "manifest": {
+ "path": ".artifacts/phase7/p7-03/import-history/pre-native/results.json",
+ "sha256": "db02d6c53e54841f60d3becdaf182a547916d279065f6308f182fa9be8773461",
+ "bytes": 35535,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ "classification": "Historical 75-case candidate and peer-review RED/GREEN, before the later Low Contact and action-focus/alert corrections. No source identity inferred for earlier unsnapshotted RED code."
+ }
+ ],
+ "visualsActuallyReviewed": [
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/006-p7-career-review-en-light-320-comparison-failure.png",
+ "sha256": "3bd4e1919a97eca6641d086548d3a13c9b0b1bb361410a3cd21575b57f222ee6",
+ "bytes": 80505,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C02 C04 E08] comparison GET failure has scoped retry and held loading without source mutation",
+ "name": "p7-career-review-en-light-320-comparison-failure",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/009-p7-career-review-nb-dark-320-settled-stored-review.png",
+ "sha256": "b2aeb5fd0cac286db8df03094036a315173311585aeab35c27de6ed20c290657",
+ "bytes": 126626,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-nb-dark-320-settled-stored-review",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/011-p7-career-review-nb-dark-320-settled-version-history.png",
+ "sha256": "537d04c28a2e89eb7c3439abc3cd5e878173657c836b3fc2f20a3dfa2b39c396",
+ "bytes": 194267,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-nb-dark-320-settled-version-history",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/013-p7-career-review-en-light-360-settled-stored-review.png",
+ "sha256": "89687de12d96758512a6a2c66cf026f6087ec15813e3007ea8064ab2421d63b9",
+ "bytes": 117097,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-en-light-360-settled-stored-review",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/015-p7-career-review-en-light-360-settled-version-history.png",
+ "sha256": "b562d582f7099020983e486b384605ab9aeba5be4c23edbd83ac15478a9da617",
+ "bytes": 197200,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-en-light-360-settled-version-history",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/017-p7-career-review-nb-light-390-settled-stored-review.png",
+ "sha256": "6e4b88daadae075b6a4381b25ea4cc32819f512744f89b7f1dd3a42dc71d2996",
+ "bytes": 123474,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-nb-light-390-settled-stored-review",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/019-p7-career-review-nb-light-390-settled-version-history.png",
+ "sha256": "0213c629fe4f395313997a17d38a3794f8eca4a0c9d67fd64433e51087277e57",
+ "bytes": 199714,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-nb-light-390-settled-version-history",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/021-p7-career-review-en-dark-768-settled-stored-review.png",
+ "sha256": "ee000f955f707a2fc6b8178d3681dc3106bf509b4da469cf1e9f77b9adb3529b",
+ "bytes": 130400,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-en-dark-768-settled-stored-review",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/023-p7-career-review-en-dark-768-settled-version-history.png",
+ "sha256": "788d59b9c5b24a736e878aa0499654c6acdcd24533b8c31cfd596c0beeebcd6d",
+ "bytes": 218587,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-en-dark-768-settled-version-history",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/025-p7-career-review-nb-dark-1024-settled-stored-review.png",
+ "sha256": "160bdb243c2cf28367ee8550260f7256268ea0e0e343ac5503c03d83f6af653b",
+ "bytes": 165457,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-nb-dark-1024-settled-stored-review",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/027-p7-career-review-nb-dark-1024-settled-version-history.png",
+ "sha256": "aad28be5a0b5621cec436888f0841d67122952950840fb56f505cae76d27c534",
+ "bytes": 232786,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-nb-dark-1024-settled-version-history",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/029-p7-career-review-en-light-1280-settled-stored-review.png",
+ "sha256": "6244c1a0fdd85b0a97d2de92829e559ca899f5fb501612696d74f2ae801206e0",
+ "bytes": 142000,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-en-light-1280-settled-stored-review",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/031-p7-career-review-en-light-1280-settled-version-history.png",
+ "sha256": "468fc7658b0f50e0079247842b9b7f22987a42ef85982b60006c176649baca71",
+ "bytes": 220794,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-en-light-1280-settled-version-history",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/033-p7-career-review-nb-light-1440-settled-stored-review.png",
+ "sha256": "cb13e0e971253a39ef8ecbbfc464aa029a21cac0c8c8e6fb0c3caa61d09fdf72",
+ "bytes": 167073,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-nb-light-1440-settled-stored-review",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/035-p7-career-review-nb-light-1440-settled-version-history.png",
+ "sha256": "a30d15e55ce763b92b9560edf75c654c0e5b101e49d36a88b9d44c21e4f1ce5b",
+ "bytes": 244482,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-nb-light-1440-settled-version-history",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/037-p7-career-review-en-dark-1920-settled-stored-review.png",
+ "sha256": "3ec353ea749f8943a23ac7fc0c92c851d34df7dcd0f4847495c0808ce6fa26f7",
+ "bytes": 165386,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-en-dark-1920-settled-stored-review",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/embedded/career-import-review/039-p7-career-review-en-dark-1920-settled-version-history.png",
+ "sha256": "b04066c26d59a9df7426cbfe259a1e3b243562be58a882ed5f2bba123b58fb59",
+ "bytes": 250795,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final/career-import-review.json",
+ "sha256": "d248adc3e763c5cb8660acdc7364f24268c33325e88c8416fed2460d2dcc3126",
+ "bytes": 4496785,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-import-review",
+ "test": "[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths",
+ "name": "p7-career-review-en-dark-1920-settled-version-history",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/003-p7-career-editor-nb-light-1440-locale-retained-raw-draft.png",
+ "sha256": "995ea17d13b740d8d4f8a9620aaa9aa0a18b5d37bea09afda7a1f8e203498e4f",
+ "bytes": 118345,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured and raw drafts survive English to Bokmål without canonical refetch or write",
+ "name": "p7-career-editor-nb-light-1440-locale-retained-raw-draft",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/006-p7-career-editor-en-light-390-held-save.png",
+ "sha256": "03d67f97fa8ad04130c5893dbdf12639182b695a4df41c149b64aa8401f51770",
+ "bytes": 224396,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] held save locks edits and duplicate writes; failed save retains its snapshot for explicit identical-body retry",
+ "name": "p7-career-editor-en-light-390-held-save",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/008-p7-career-editor-en-light-390-held-save-raw-import.png",
+ "sha256": "bf4df702b71b994933ee57d8eb0e25a330adc38217eb8f4863f06054da71529f",
+ "bytes": 78882,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] held save locks edits and duplicate writes; failed save retains its snapshot for explicit identical-body retry",
+ "name": "p7-career-editor-en-light-390-held-save-raw-import",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/010-p7-career-editor-en-light-390-failed-save-retained-draft.png",
+ "sha256": "2286f3204daf6a32e09ff84668e5901d761fc376de6ff06387dfa8a7016513d7",
+ "bytes": 236503,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] held save locks edits and duplicate writes; failed save retains its snapshot for explicit identical-body retry",
+ "name": "p7-career-editor-en-light-390-failed-save-retained-draft",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/013-p7-career-editor-nb-dark-390-actual-validation400-retained-draft.png",
+ "sha256": "f2c71ab6d4936ace17626e71a1ac0fc6a24cac6859a96752806198f308f01c2d",
+ "bytes": 235441,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] actual validation400 retains draft and source; corrected explicit save persists once",
+ "name": "p7-career-editor-nb-dark-390-actual-validation400-retained-draft",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/016-p7-career-editor-nb-dark-320-structured-editor.png",
+ "sha256": "c7e16ecc26659be74cd0d2b2b3f27249b43de91e104c2451611de1955f87c586",
+ "bytes": 218573,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/dark/320x844",
+ "name": "p7-career-editor-nb-dark-320-structured-editor",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/022-p7-career-editor-en-dark-768-structured-editor.png",
+ "sha256": "4d59f2c7503d7dd672907bccd44b9e34e760255e1bea319a1ce44d7171a887af",
+ "bytes": 257668,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/dark/768x1024",
+ "name": "p7-career-editor-en-dark-768-structured-editor",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/030-p7-career-editor-en-dark-1920-structured-editor.png",
+ "sha256": "84f0d4d3783613879e882f49879b66f832e4c0e03bbea8ca84a31f1e64ee045d",
+ "bytes": 284468,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/dark/1920x1080",
+ "name": "p7-career-editor-en-dark-1920-structured-editor",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-source-ids/002-native-career-source-id-editor.png",
+ "sha256": "e1d87883c59761fa6ff1eff0964e3c633a035b0b57d0014d4e940dd0ab5e513e",
+ "bytes": 203197,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-source-ids.json",
+ "sha256": "fe2d4fd4f6f4f68cd664f332fa37f6997945db1aa0aeb3486b446ed0aa4cbe12",
+ "bytes": 407686,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-source-ids",
+ "test": "[P7-03 PRES-C01 C03 C06 C07 C10 W05 W06] unrelated canonical UI save preserves four source IDs, existing CV overrides, sibling and frozen package",
+ "name": "native-career-source-id-editor",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/003-p7-career-nb-dark-320-populated-overview.png",
+ "sha256": "a5e2a497ad77f8a1e0b6437c59b8e1b7247c19c84534203de59476f5de76dcfe",
+ "bytes": 85586,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 320px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-nb-dark-320-populated-overview",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/005-p7-career-nb-dark-320-long-evidence.png",
+ "sha256": "bd9f56b40d881e6c1733cd54d0115927b29be340bd55b4cb3434231d517cd61b",
+ "bytes": 79268,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 320px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-nb-dark-320-long-evidence",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/023-p7-career-en-light-1280-populated-overview.png",
+ "sha256": "3cd9116f6473da8dfba1074571a344bfe63fffb135665344ab825d61f0eaa0e3",
+ "bytes": 102513,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 1280px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-en-light-1280-populated-overview",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/035-p7-career-en-dark-390-unavailable-profile.png",
+ "sha256": "0551ee98b50960e5129e38adfb9ef9021dbd1b5619d439d9d06660d38b30a456",
+ "bytes": 73177,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C02 E09] unavailable /career/profile stays unknown and retries its reads without writes or false first-run guidance",
+ "name": "p7-career-en-dark-390-unavailable-profile",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/043-p7-career-en-light-390-failed-save-retained-draft.png",
+ "sha256": "9c2e095ebc44aeb595fbace39bc0f83994bad3548ed06910255ef7d1ed806153",
+ "bytes": 50068,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion",
+ "name": "p7-career-en-light-390-failed-save-retained-draft",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/045-p7-career-en-light-390-failed-delete-retained-row.png",
+ "sha256": "e622150cc8ac5e8b3638bf04d409747ecb64fb01255e362789fe19b5803e12e1",
+ "bytes": 52574,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion",
+ "name": "p7-career-en-light-390-failed-delete-retained-row",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-preservation/001-native-frozen-package.png",
+ "sha256": "e6c5484e108b36ff7833d01da1aa749fb01b9829f05ddcee400cc351d661f4c3",
+ "bytes": 81328,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-preservation.json",
+ "sha256": "2422df82c11e45b281248e9bf40075a9e25c6394b1b80e4136bb3c7533e1a4a5",
+ "bytes": 114011,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-preservation",
+ "test": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change",
+ "name": "native-frozen-package",
+ "manualReview": "ACTUALLY_VIEWED_BY_PARENT_ASSISTANT; finite visual inspection, not human assistive-technology acceptance",
+ "reviewQualification": "Wrapped controls/messages, readable hierarchy, responsive columns and retained draft/error content. Full-page images retain scrolled/focused sticky-header and skip-link contexts; tall captures are resized. These do not establish top-of-page alignment, actual zoom, human contrast, screen-reader or physical-device acceptance."
+ }
+ ],
+ "otherRetainedVisuals": [
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/018-p7-career-editor-en-light-360-structured-editor.png",
+ "sha256": "e275e139d41b0cc82db71260917d45b058344baf5dccf6afaae03cfa138580ff",
+ "bytes": 226780,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/light/360x800",
+ "name": "p7-career-editor-en-light-360-structured-editor",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/020-p7-career-editor-nb-light-390-structured-editor.png",
+ "sha256": "9207cc97ca1c036422f29b0b739555967011e6f1b5123efd24ae9446cec18894",
+ "bytes": 230995,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/light/390x844",
+ "name": "p7-career-editor-nb-light-390-structured-editor",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/024-p7-career-editor-nb-dark-1024-structured-editor.png",
+ "sha256": "36ed14000bba67366b3af27335a0f370273d7924c46f3c8705c0fa8cfd73d7fa",
+ "bytes": 261620,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/dark/1024x768",
+ "name": "p7-career-editor-nb-dark-1024-structured-editor",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/026-p7-career-editor-en-light-1280-structured-editor.png",
+ "sha256": "fd1d0ebac8ffb524f54430450fa73ce536ef4261cc9695159800244f6c29a923",
+ "bytes": 255825,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry en/light/1280x320",
+ "name": "p7-career-editor-en-light-1280-structured-editor",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career-editor/028-p7-career-editor-nb-light-1440-structured-editor.png",
+ "sha256": "c9af3b8f2e0154aebb6f257c2d14af81f5d316706b75e87aede23edf166b8ec6",
+ "bytes": 278051,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career-editor.json",
+ "sha256": "5c08c22170d739825c15b09d51b14b3f0409dd39ca2d8c93890272cdcb6e1443",
+ "bytes": 4602018,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career-editor",
+ "test": "[P7-03 PRES-C01 C02 E08] structured editor headings, contextual actions and geometry nb/light/1440x900",
+ "name": "p7-career-editor-nb-light-1440-structured-editor",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/007-p7-career-en-light-360-populated-overview.png",
+ "sha256": "78a15394efe0b58fea2494f70b939a379845661c96b6eebedb5a42dc8e64bd3b",
+ "bytes": 83980,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 360px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-en-light-360-populated-overview",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/009-p7-career-en-light-360-long-evidence.png",
+ "sha256": "203ded6fe42434459875d165a3ff42f5405a962e9972a4b44f11189167a647ca",
+ "bytes": 69976,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 360px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-en-light-360-long-evidence",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/011-p7-career-nb-light-390-populated-overview.png",
+ "sha256": "4f82ab83b185fa48d3538a55a9b10c3c6223799c3c984801d969547bf076fe44",
+ "bytes": 85950,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 390px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-nb-light-390-populated-overview",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/013-p7-career-nb-light-390-long-evidence.png",
+ "sha256": "cbcbccbfaa042e3e5100d04bd154e8ca23d0ba6e6ff95d5578db36193ed433d8",
+ "bytes": 70584,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 390px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-nb-light-390-long-evidence",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/015-p7-career-en-dark-768-populated-overview.png",
+ "sha256": "03e5d7bc1ff0aaf39d962311b768fc4eccf2521365e64f6fcb6cbea816db0272",
+ "bytes": 94090,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 768px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-en-dark-768-populated-overview",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/017-p7-career-en-dark-768-long-evidence.png",
+ "sha256": "65417e33920f9b068817467086f432e0af952c5c3e6f7369216e41c9faa101d2",
+ "bytes": 83520,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 768px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-en-dark-768-long-evidence",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/019-p7-career-nb-dark-1024-populated-overview.png",
+ "sha256": "b4d06ee32e6744f0cff3dd337a27757117d2318913efe4fac9de7deb20ad6c69",
+ "bytes": 118966,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 1024px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-nb-dark-1024-populated-overview",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/021-p7-career-nb-dark-1024-long-evidence.png",
+ "sha256": "01db3ea3dc1ef98c51685ff0e90b2e98269b277687f0a4e07fdf79b724a06c87",
+ "bytes": 109985,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/dark 1024px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-nb-dark-1024-long-evidence",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/025-p7-career-en-light-1280-long-evidence.png",
+ "sha256": "e3e1a52424edc69f6a90ccbb8a269269567f1d297d228bc926d643ec1d91734d",
+ "bytes": 96044,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/light 1280px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-en-light-1280-long-evidence",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/027-p7-career-nb-light-1440-populated-overview.png",
+ "sha256": "df0d21d0d95561e0ed622d5e1f759c5214906e815adc9d01d1d40e829d7d52c2",
+ "bytes": 116421,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 1440px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-nb-light-1440-populated-overview",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/029-p7-career-nb-light-1440-long-evidence.png",
+ "sha256": "8e7ee34df98daea2e512ec4ca091c526df15a9e367861b873463b662657a25d6",
+ "bytes": 247154,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] nb/light 1440px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-nb-light-1440-long-evidence",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/031-p7-career-en-dark-1920-populated-overview.png",
+ "sha256": "e2bc2fe634b46cfcb8ace0082253b84456b503484209de90aaad81477ea5e6c1",
+ "bytes": 120354,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 1920px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-en-dark-1920-populated-overview",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/033-p7-career-en-dark-1920-long-evidence.png",
+ "sha256": "5e745ade3ed97b8543b3ddbdfe454b1a41d881d3fe8062e8cdaee7ad88dc0295",
+ "bytes": 113792,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C01 C02 C04 C05 E08 E09] en/dark 1920px overview and factual evidence preserve canonical source and recent CV links",
+ "name": "p7-career-en-dark-1920-long-evidence",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/037-p7-career-en-dark-390-unavailable-runs.png",
+ "sha256": "7ecdc9566b816fdf4eb2dbc51f602f32e84f3b6e53d398f6ab19f9900a55770b",
+ "bytes": 73572,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C02 E09] unavailable /profile-cv/runs stays unknown and retries its reads without writes or false first-run guidance",
+ "name": "p7-career-en-dark-390-unavailable-runs",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/039-p7-career-en-dark-390-unavailable-variants.png",
+ "sha256": "8c77ff1f4b95e77fdbc9e2ca8e1f1cf3d331b5ec2e026d21aba68821238f8eb9",
+ "bytes": 74948,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C02 E09] unavailable /cv/variants stays unknown and retries its reads without writes or false first-run guidance",
+ "name": "p7-career-en-dark-390-unavailable-variants",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ },
+ {
+ "raw": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/embedded/career/041-p7-career-en-light-390-pending-evidence-read.png",
+ "sha256": "a1c3e56d179197d1dd68c78069abd34f64c61527cf368f09124678a69d3c23f1",
+ "bytes": 46260,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "originalEmbeddedReport": {
+ "path": ".artifacts/phase7/p7-03/import-history/final-regression/career.json",
+ "sha256": "e901a446e2c535bad336b885ca48596349b5eed12d894bd8366194e8f7136dc4",
+ "bytes": 3016416,
+ "hashPolicy": "Exact measured raw bytes"
+ },
+ "lane": "career",
+ "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion",
+ "name": "p7-career-en-light-390-pending-evidence-read",
+ "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT"
+ }
+ ],
+ "counts": {
+ "affectedFrontend": "76/6 fresh",
+ "newFrontend": "22 cases in two new suites;14 import/8 history",
+ "latestWholeFrontend": "573/89 inherited",
+ "derivedWholeFrontendOnly": "648/93",
+ "freshTargetedOrdinaryBrowser": 35,
+ "newOrdinaryBrowser": 6,
+ "derivedWholeBrowserOnly": 233,
+ "freshBackendSubset": "98/98 unchanged-binary cases;not additive",
+ "latestWholeBackend": "1033 inherited",
+ "derivedWholeBackendOnly": 1034,
+ "sidecar": "49 inherited"
+ },
+ "axeTriage": {
+ "newImportHistory": "17 scans,0 violations/302 incompletes:285 overlap +17 short/invisible-zero badge",
+ "editorRegression": "13 scans,0/377:362 overlap +13 short badge +1 partially obscured actual400 feedback +1 hidden-select portal",
+ "careerRegression": "22 scans,0/99:74 overlap +22 short badge +3 hidden-select portals",
+ "sourceIdsAndPreservation": "0 scans;not axe acceptance",
+ "qualification": "Complete node/check vectors retained. Native captures and DOM oracles do not close M09/M11; hidden portal tab sequence and actual foreground/background contrast require contextual/manual acceptance."
+ },
+ "preservation": "57 groups:56 PARTIAL/C11 DEFERRED;32 original routes retained;canonical/sibling/override/history/frozen readback and ordinary P2-D01 pass in bounded scope.",
+ "limits": [
+ "RD21 backend ExpectedVersion/idempotency remains absent; client pending guard is not multi-session concurrency repair.",
+ "Canonical acceptance may commit before a later identity refresh fails; partial-write/recovery qualification remains.",
+ "Diff values are server summaries, sometimes truncated/count-based. Custom/parsed sections and metadata are outside comparison and may be merged/replaced on accept.",
+ "Pending extraction fixture has null artifact/operation; only stored CURRENT raw is displayed. No provider, worker, model or actual extraction/PDF qualification.",
+ "M01-M12 human reader/device/zoom/output/operator evidence remains pending;M13/P5-13 deferred/withheld.",
+ "Production NO-GO/main unchanged;Phase8 implementation separate;fresh whole regression remains P7-12."
+ ],
+ "unitTransitions": [
+ {
+ "qualification": "13PASS/1FAIL of14; synthetic Low Contact localized-label regression;not native extraction qualification.",
+ "files": [
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-contact-label-red-20261012T163842Z.json",
+ "sha256": "60eaad08c34ec0bd1a76919bc8452b1d89ef4030a24231f42717fcdd9cd6e855",
+ "bytes": 55520,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-contact-label-red-20261012T163842Z.log",
+ "sha256": "58b89fabe2d78a2acee22a8c10edcb862c8df2771ec4ef87bd6bc713448130df",
+ "bytes": 635835,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-contact-label-red-20261012T163842Z-command.json",
+ "sha256": "5f08a1684034449d95a20da2283b6c142ca90ae9c5b0f23a10a4037617c69e6a",
+ "bytes": 659,
+ "hashPolicy": "Exact saved raw bytes"
+ }
+ ],
+ "sourceQualification": "Exact raw execution retained; earlier RED source is not reconstructed retroactively."
+ },
+ {
+ "qualification": "76/6 candidate before later action-focus and Alert layout corrections.",
+ "files": [
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-affected-contact-final-20261012T163949Z.json",
+ "sha256": "9619ba48b736c9f65842d69b603469e4177a879eddbb361271d8ea2e22d09f40",
+ "bytes": 32136,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-affected-contact-final-20261012T163949Z.log",
+ "sha256": "64a90e9e3eaaccc3f784196d8fca006959912f544b1c2ed97e2f2c4615bb72ca",
+ "bytes": 903,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-affected-contact-final-20261012T163949Z-command.json",
+ "sha256": "01d5f5370b532b865aa9ffbd0100d6b01d4c943adee5483e9a2096ba5c5bee2f",
+ "bytes": 847,
+ "hashPolicy": "Exact saved raw bytes"
+ }
+ ],
+ "sourceQualification": "Exact raw execution retained; earlier RED source is not reconstructed retroactively."
+ },
+ {
+ "qualification": "13PASS/1FAIL of14; strengthened held action loses focus before pending transfer correction.",
+ "files": [
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-action-focus-red-20261012T171018Z.json",
+ "sha256": "52662556a6b582febe3569a8b3c6f45992bd56ff538143f509ed185fe1d9af90",
+ "bytes": 21608,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-action-focus-red-20261012T171018Z.log",
+ "sha256": "ac8bf3c81b6f3a9d45b23124ca0f339de3c6cc784469ccda0df0919e745ff1d0",
+ "bytes": 624398,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/unit-transition-history/career-import-action-focus-red-20261012T171018Z-command.json",
+ "sha256": "9cc86fa258ceb66a963ae15088cae1d7136553dfb1ff1b2de1d1430954d25faa",
+ "bytes": 658,
+ "hashPolicy": "Exact saved raw bytes"
+ }
+ ],
+ "sourceQualification": "Exact raw execution retained; earlier RED source is not reconstructed retroactively."
+ }
+ ],
+ "static": {
+ "status": "PASS",
+ "checkedUtc": "2026-10-12T17:26:49.110195+00:00",
+ "files": [
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/static/20261012T172645Z/import-history-static-checks.json",
+ "sha256": "877c554c28ba6b19c49529dff56f7ed0966fe5a24590be582f857ac28d12fde9",
+ "bytes": 3166,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/static/20261012T172645Z/secret-scan.log",
+ "sha256": "c5a88d5ebdc042adba125c1eaacbe44f9f4a5c19898c0f195573c00d511aa28d",
+ "bytes": 153,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/static/20261012T172645Z/working-whitespace.log",
+ "sha256": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6",
+ "bytes": 78,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/static/20261012T172645Z/staged-whitespace.log",
+ "sha256": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6",
+ "bytes": 78,
+ "hashPolicy": "Exact saved raw bytes"
+ },
+ {
+ "path": ".artifacts/phase7/p7-03/import-history/final/static/20261012T172645Z/phase7-whitespace.log",
+ "sha256": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6",
+ "bytes": 78,
+ "hashPolicy": "Exact saved raw bytes"
+ }
+ ],
+ "documentation": {
+ "files": 10,
+ "relativeLinks": 397,
+ "errors": []
+ }
+ }
+}
diff --git a/docs/redesign/phase-7/p7-03/evidence/import-history-static-checks.json b/docs/redesign/phase-7/p7-03/evidence/import-history-static-checks.json
new file mode 100644
index 0000000..4282cd3
--- /dev/null
+++ b/docs/redesign/phase-7/p7-03/evidence/import-history-static-checks.json
@@ -0,0 +1,104 @@
+{
+ "schemaVersion": 1,
+ "checkpoint": "p7-03",
+ "status": "PASS",
+ "checkedUtc": "2026-10-12T17:26:49.110195+00:00",
+ "commands": [
+ {
+ "name": "secret-scan",
+ "command": [
+ "rtk",
+ "proxy",
+ "C:\\Users\\Connor\\AppData\\Local\\Programs\\Python\\Python312\\python.exe",
+ "-X",
+ "utf8",
+ "scripts/supply-chain.py",
+ "scan-secrets"
+ ],
+ "startedUtc": "2026-10-12T17:26:45.615985+00:00",
+ "finishedUtc": "2026-10-12T17:26:48.466289+00:00",
+ "exitCode": 0,
+ "log": ".artifacts/phase7/current/static/20261012T172645Z/secret-scan.log",
+ "logSha256Raw": "c5a88d5ebdc042adba125c1eaacbe44f9f4a5c19898c0f195573c00d511aa28d"
+ },
+ {
+ "name": "working-whitespace",
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "diff",
+ "--check"
+ ],
+ "startedUtc": "2026-10-12T17:26:48.466786+00:00",
+ "finishedUtc": "2026-10-12T17:26:48.550068+00:00",
+ "exitCode": 0,
+ "log": ".artifacts/phase7/current/static/20261012T172645Z/working-whitespace.log",
+ "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6"
+ },
+ {
+ "name": "staged-whitespace",
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "diff",
+ "--cached",
+ "--check"
+ ],
+ "startedUtc": "2026-10-12T17:26:48.550571+00:00",
+ "finishedUtc": "2026-10-12T17:26:48.646734+00:00",
+ "exitCode": 0,
+ "log": ".artifacts/phase7/current/static/20261012T172645Z/staged-whitespace.log",
+ "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6"
+ },
+ {
+ "name": "phase7-whitespace",
+ "command": [
+ "rtk",
+ "proxy",
+ "git",
+ "diff",
+ "--check",
+ "b5319981ad3d1bd635daff861453d23c0de5320b"
+ ],
+ "startedUtc": "2026-10-12T17:26:48.647234+00:00",
+ "finishedUtc": "2026-10-12T17:26:48.775774+00:00",
+ "exitCode": 0,
+ "log": ".artifacts/phase7/current/static/20261012T172645Z/phase7-whitespace.log",
+ "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6"
+ }
+ ],
+ "untrackedSecretScan": {
+ "files": 0,
+ "findings": 0
+ },
+ "documentation": {
+ "files": 10,
+ "relativeLinks": 397,
+ "errors": []
+ },
+ "preservation": {
+ "groups": 57,
+ "statuses": {
+ "PARTIAL": 56,
+ "PASS": 0,
+ "FAIL": 0,
+ "DEFERRED": 1
+ },
+ "originalRoutesPreserved": true,
+ "currentConcreteRoutes": 32
+ },
+ "production": {
+ "main": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
+ "originMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
+ "status": "NO-GO",
+ "qualification": "Local fetched refs; direct push observation recorded separately."
+ },
+ "hashPolicy": "Portable JSON UTF8 LF; raw log hashes measure exact saved bytes.",
+ "limits": [
+ "Pattern scanner skips binary and files over2MiB; not historical Git/production secrets.",
+ "Local links check target existence, not URL/heading anchors.",
+ "Static evidence is not runtime/manual/device/provider/production acceptance."
+ ]
+}
diff --git a/docs/roadmap/todo.md b/docs/roadmap/todo.md
index ade22a4..0c08252 100644
--- a/docs/roadmap/todo.md
+++ b/docs/roadmap/todo.md
@@ -85,7 +85,7 @@ Follow the approved [Phase 7 handoff](../redesign/phase-6/p6-05/PHASE7_HANDOFF.m
- [x] P7-00 fresh scope inventory and unchanged-source fixture baseline; finite static checks pass. Commit and remote receipt in the Phase 7 ledger.
- [x] P7-01 public authentication and separate account/security presentation (implemented scope CONDITIONAL GO; account pushedad7b419/direct receipt19:16:15UTC): public sub-slice CONDITIONAL GO, pushed `8ad720d`, direct remote=HEAD verified2026-10-11 18:50:24UTC, main unchanged; affected61/native22/isolated SMTP2/helper6/auth subset87 pass. [Checkpoint record](../redesign/phase-7/p7-01/README.md) retains manual/provider/production gates. Fresh account full573/89, native6/public22/auth-boundaries10 and types/lint/build pass; all eight final post-copy PNGs actually inspected and source/context evidence frozen. Account85 and public31 current axe incompletes remain qualified; final staged finite hygiene passed; normal account pushad7b419 directly verified2026-10-11 19:16:15UTC with localHEAD=origin=live equality and clean worktree at observation, main unchanged.
- [x] P7-02 [onboarding guidance and Career overview/evidence](../redesign/phase-7/p7-02/README.md): entryad7b419 pushed/verified; onboarding implemented-scope CONDITIONAL GO32/13/4+types/lint/build/13 actual PNG inspections/hygiene, pushedd21501aa/direct receipt23:55:12UTC. Separate actual SQLite evidence-list repair91 guards/HTTP1/Release passed and pushed01281f52/direct receipt00:06:47UTC; unfinished Career work preserved/main unchanged. Career affected46/3/native14/fresh preservation2/types/lint/build and22 actual PNG inspections pass; implemented P7-02 CONDITIONAL GO, final Career hygiene PASS (four commands0,9docs347links0errors) and normal push8b4d5c2 directly verified05:51:04UTC, localHEAD=origin=live/clean worktree/main unchanged. Career0/99 axe incompletes/manual gates retained; fullfrontend610/backend1,034 are derived only, latest fresh full573/89 unchanged.
-- [ ] P7-03 Career structured editor and import/history: prerequisite repair3047/hygiene704637a normally pushed/directly verified06:34:48UTC, original staged EOF failure retained. Structured-editor implemented scope CONDITIONAL GO: affected54/4, native editor11/source-ID2/Career14/preservation2, types/lint/build PASS; all13 final PNGs inspected,13 editor scans0/377 and separate Career22 scans0/99 retained. Dirty-locale/no-refetch, structured/raw held-save locks, retry/validation/readback and finite reflow proven. Final staged hygiene PASS; normal editor pushf7f6b774 directly verified2026-10-12 11:33:47UTC, localHEAD=origin=live/clean/main unchanged; separate import/history presentation and whole checkpoint remain unfinished. Old orphan recovery/concurrency/manual/provider/production gates stay open. Full626/91/browser227/backend1,034 derived only; latest full573/89 inherited,57/32 unchanged/main NO-GO.
+- [ ] P7-03 Career structured editor and import/history: prerequisite repair3047/hygiene704637a normally pushed/directly verified06:34:48UTC, original staged EOF failure retained. Structured-editor implemented scope CONDITIONAL GO: affected54/4, native editor11/source-ID2/Career14/preservation2, types/lint/build PASS; all13 final PNGs inspected,13 editor scans0/377 and separate Career22 scans0/99 retained. Final staged hygiene PASS; editor pushf7f6b774 directly verified2026-10-12 11:33:47UTC, localHEAD=origin=live/clean/main unchanged. Import/history candidate follows pushed metadataec23b650: scoped history/comparison retry, dirty/pending guards, retained review choices, stable focus and verbatim imported facts; earlier affected76/6 passes before latest focus/inline-Alert changes. Final runtime/native/visual/axe/hygiene/push acceptance remains PENDING and whole checkpoint unfinished. Invalid French attempts and later failures remain qualified; latest5PASS/1FAIL recovers language setup and identifies actual NB320 pending-ready Alert focusability, awaiting owner-local correction validation. Corrected Low Contact uses actual HTTP. Initial +20 expectation is historical, superseded by22 new units/2 suites and derived648/93, prospective browser233/backend1,034 only; latest full573/89 inherited. RD21 expected-version/partial-write, orphan recovery and manual/provider/output gates stay open;57/32 unchanged, production NO-GO/main unchanged/Phase8 separate.
- [ ] P7-04 CV library and public entry.
- [ ] P7-05 Discovery, Companies, Offers and Reminders.
- [ ] P7-06 remaining Application forms and global correspondence.
diff --git a/job-tracker-ui/e2e/helpers/seed-career-review.py b/job-tracker-ui/e2e/helpers/seed-career-review.py
new file mode 100644
index 0000000..b6421a8
--- /dev/null
+++ b/job-tracker-ui/e2e/helpers/seed-career-review.py
@@ -0,0 +1,287 @@
+"""Test-only Career import-review seeder; never a product endpoint.
+
+Input JSON on stdin: dataRoot, ownerId, ownerEmail, profile; optional rawText and
+normalizedText (string or null). Output: {"runId": }.
+The database must already exist as /jobtracker-e2e-*/jobtracker.db.
+Run --self-check to exercise only this helper's own temporary SQLite fixtures.
+"""
+
+from __future__ import annotations
+
+import json
+import re
+import sqlite3
+import subprocess
+import sys
+import tempfile
+from contextlib import closing
+from datetime import datetime, timezone
+from pathlib import Path
+
+
+class SeedDenied(ValueError):
+ """The requested input is outside this isolated test fixture contract."""
+
+
+RUN_SCHEMA = {
+ "Id": ("INTEGER", 1, 1),
+ "OwnerUserId": ("TEXT", 1, 0),
+ "ArtifactId": ("INTEGER", 0, 0),
+ "Trigger": ("TEXT", 1, 0),
+ "ParserVersion": ("TEXT", 1, 0),
+ "NormalizerVersion": ("TEXT", 1, 0),
+ "LlmPromptVersion": ("TEXT", 1, 0),
+ "Status": ("TEXT", 1, 0),
+ "RawExtractedText": ("TEXT", 0, 0),
+ "NormalizedText": ("TEXT", 0, 0),
+ "StructuredProfileJson": ("TEXT", 0, 0),
+ "ErrorMessage": ("TEXT", 0, 0),
+ "StartedAtUtc": ("TEXT", 1, 0),
+ "CompletedAtUtc": ("TEXT", 0, 0),
+ "AppliedAtUtc": ("TEXT", 0, 0),
+}
+
+
+def seed_review(payload: object) -> int:
+ if not isinstance(payload, dict):
+ raise SeedDenied("Input must be a JSON object")
+ allowed = {"dataRoot", "ownerId", "ownerEmail", "profile", "rawText", "normalizedText"}
+ if set(payload) - allowed:
+ raise SeedDenied("Unsupported input keys")
+ for key in ("dataRoot", "ownerId", "ownerEmail"):
+ if not isinstance(payload.get(key), str) or not payload[key].strip():
+ raise SeedDenied(f"{key} must be a nonempty string")
+ if not isinstance(payload.get("profile"), dict):
+ raise SeedDenied("profile must be a JSON object")
+ for key in ("rawText", "normalizedText"):
+ if payload.get(key) is not None and not isinstance(payload[key], str):
+ raise SeedDenied(f"{key} must be text or null")
+ try:
+ structured_json = json.dumps(payload["profile"], ensure_ascii=False, separators=(",", ":"), allow_nan=False)
+ except (TypeError, ValueError) as error:
+ raise SeedDenied("profile must contain finite JSON values") from error
+
+ requested_root = Path(payload["dataRoot"])
+ if not requested_root.is_absolute():
+ raise SeedDenied("dataRoot must be absolute")
+ try:
+ root = requested_root.resolve(strict=True)
+ temp_root = Path(tempfile.gettempdir()).resolve(strict=True)
+ except OSError as error:
+ raise SeedDenied("dataRoot must already exist") from error
+ if not root.is_dir() or root.parent != temp_root or not re.fullmatch(r"jobtracker-e2e-[A-Za-z0-9][A-Za-z0-9_-]*", root.name):
+ raise SeedDenied("dataRoot must be a jobtracker-e2e-* direct child of the system temp directory")
+ database = root / "jobtracker.db"
+ if not database.is_file() or database.resolve(strict=True) != database or database.stat().st_nlink != 1:
+ raise SeedDenied("The existing direct jobtracker.db file is required")
+
+ prohibited_actions = {
+ sqlite3.SQLITE_UPDATE, sqlite3.SQLITE_DELETE,
+ sqlite3.SQLITE_ATTACH, sqlite3.SQLITE_DETACH, sqlite3.SQLITE_ALTER_TABLE,
+ sqlite3.SQLITE_CREATE_TABLE, sqlite3.SQLITE_CREATE_INDEX, sqlite3.SQLITE_CREATE_TRIGGER,
+ sqlite3.SQLITE_CREATE_VIEW, sqlite3.SQLITE_CREATE_TEMP_TABLE, sqlite3.SQLITE_CREATE_TEMP_INDEX,
+ sqlite3.SQLITE_CREATE_TEMP_TRIGGER, sqlite3.SQLITE_CREATE_TEMP_VIEW,
+ sqlite3.SQLITE_DROP_TABLE, sqlite3.SQLITE_DROP_INDEX, sqlite3.SQLITE_DROP_TRIGGER,
+ sqlite3.SQLITE_DROP_VIEW, sqlite3.SQLITE_DROP_TEMP_TABLE, sqlite3.SQLITE_DROP_TEMP_INDEX,
+ sqlite3.SQLITE_DROP_TEMP_TRIGGER, sqlite3.SQLITE_DROP_TEMP_VIEW,
+ }
+
+ def authorize(action: int, target: str | None, _column: str | None,
+ _database: str | None, _trigger: str | None) -> int:
+ if action in prohibited_actions:
+ return sqlite3.SQLITE_DENY
+ if action == sqlite3.SQLITE_INSERT and target != "CvExtractionRuns":
+ return sqlite3.SQLITE_DENY
+ if action == sqlite3.SQLITE_PRAGMA and target != "table_info":
+ return sqlite3.SQLITE_DENY
+ return sqlite3.SQLITE_OK
+
+ # mode=rw refuses to create a database. Closing is explicit for Windows locks.
+ with closing(sqlite3.connect(database.as_uri() + "?mode=rw", uri=True, timeout=5)) as connection, connection:
+ connection.execute("PRAGMA foreign_keys=ON")
+ connection.set_authorizer(authorize)
+ connection.execute("BEGIN IMMEDIATE")
+ actual = {row[1]: (row[2].upper(), row[3], row[5])
+ for row in connection.execute('PRAGMA table_info("CvExtractionRuns")')}
+ if actual != RUN_SCHEMA:
+ raise SeedDenied("CvExtractionRuns schema does not match the existing fixture contract")
+ users = {row[1]: row[2].upper() for row in connection.execute('PRAGMA table_info("AspNetUsers")')}
+ if users.get("Id") != "TEXT" or users.get("Email") != "TEXT":
+ raise SeedDenied("Existing AspNetUsers Id/Email schema is required")
+ owner = connection.execute('SELECT "Id", "Email" FROM "AspNetUsers" WHERE "Id" = ?', (payload["ownerId"],)).fetchone()
+ if owner != (payload["ownerId"], payload["ownerEmail"]):
+ raise SeedDenied("Owner ID and email must exactly match an existing real fixture account")
+ if connection.execute("SELECT name FROM sqlite_master WHERE type='trigger' AND tbl_name='CvExtractionRuns' LIMIT 1").fetchone():
+ raise SeedDenied("CvExtractionRuns triggers are outside this insert-only fixture contract")
+ timestamp = datetime.now(timezone.utc).isoformat(timespec="microseconds").replace("T", " ")
+ cursor = connection.execute(
+ 'INSERT INTO "CvExtractionRuns" ("OwnerUserId", "ArtifactId", "Trigger", "ParserVersion", "NormalizerVersion", "LlmPromptVersion", "Status", "RawExtractedText", "NormalizedText", "StructuredProfileJson", "ErrorMessage", "StartedAtUtc", "CompletedAtUtc", "AppliedAtUtc") VALUES (?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, NULL)',
+ (payload["ownerId"], "upload", "native-offline-fixture", "native-offline-fixture",
+ "native-offline-fixture", "pending_review", payload.get("rawText"),
+ payload.get("normalizedText"), structured_json, timestamp, timestamp),
+ )
+ return int(cursor.lastrowid)
+
+
+def self_check() -> dict:
+ """No repo/live database is opened; every database belongs to this check."""
+ passed: list[str] = []
+ profile = {
+ "version": "1", "contact": {},
+ "languages": [{"name": "French"}, {"name": "Norwegian", "level": "B1"}],
+ }
+ owner_id, owner_email = "self-check-owner", "self-check@example.test"
+
+ def fixture(root: Path, *, schema: str = "correct", owner: str = owner_id,
+ email: str = owner_email) -> Path:
+ database = root / "jobtracker.db"
+ columns = []
+ for name, (kind, required, primary) in RUN_SCHEMA.items():
+ if schema == "missing_column" and name == "StructuredProfileJson":
+ continue
+ if schema == "wrong_type" and name == "Status":
+ kind = "INTEGER"
+ if schema == "wrong_nullability" and name == "Status":
+ required = 0
+ columns.append(f'"{name}" {kind}' + (" NOT NULL" if required else "")
+ + (" PRIMARY KEY AUTOINCREMENT" if primary else ""))
+ if schema == "extra_column":
+ columns.append('"UnexpectedColumn" TEXT')
+ with closing(sqlite3.connect(database)) as connection, connection:
+ connection.execute('CREATE TABLE "CvExtractionRuns" (' + ",".join(columns) + ")")
+ if schema != "missing_users":
+ connection.execute('CREATE TABLE "AspNetUsers" ("Id" TEXT PRIMARY KEY, "Email" TEXT, "ProfileCvText" TEXT, "ProfileCvStructureJson" TEXT)')
+ connection.execute('INSERT INTO "AspNetUsers" VALUES (?, ?, ?, ?)',
+ (owner, email, "Canonical raw — æøå", '{"summary":["Canonical source"]}'))
+ connection.execute('INSERT INTO "AspNetUsers" VALUES (?, ?, ?, ?)',
+ ("other-owner", "other@example.test", "Other raw", '{"summary":["Other source"]}'))
+ connection.execute('CREATE TABLE "CareerProfiles" ("Id" INTEGER PRIMARY KEY, "OwnerUserId" TEXT, "Version" INTEGER, "Summary" TEXT)')
+ connection.execute('INSERT INTO "CareerProfiles" VALUES (1, ?, 7, ?)', (owner, "Current canonical — æøå"))
+ connection.execute('CREATE TABLE "CareerProfileVersions" ("Id" INTEGER PRIMARY KEY, "CareerProfileId" INTEGER, "Version" INTEGER, "ProfileJson" TEXT)')
+ connection.execute('INSERT INTO "CareerProfileVersions" VALUES (1, 1, 7, ?)', ('{"summary":["Historical source"]}',))
+ connection.execute('CREATE TABLE "UserOperations" ("Id" TEXT PRIMARY KEY, "OwnerUserId" TEXT, "Status" TEXT)')
+ connection.execute('INSERT INTO "UserOperations" VALUES (?, ?, ?)', ("existing-operation", owner, "succeeded"))
+ return database
+
+ def payload_for(root: Path, **changes: object) -> dict:
+ return {"dataRoot": str(root), "ownerId": owner_id, "ownerEmail": owner_email,
+ "profile": profile, "rawText": "Synthetic raw — æøå",
+ "normalizedText": "French\nNorwegian B1", **changes}
+
+ def snapshot(database: Path) -> dict:
+ with closing(sqlite3.connect(database)) as connection, connection:
+ rows = {table: connection.execute(f'SELECT * FROM "{table}" ORDER BY rowid').fetchall()
+ for table in ("AspNetUsers", "CareerProfiles", "CareerProfileVersions", "UserOperations", "CvExtractionRuns")}
+ rows["__schema__"] = connection.execute("SELECT type, name, tbl_name, sql FROM sqlite_master ORDER BY type, name").fetchall()
+ return rows
+
+ def denied(name: str, payload: object) -> None:
+ try:
+ seed_review(payload)
+ except SeedDenied:
+ passed.append(name)
+ else:
+ raise AssertionError(f"{name}: seeder accepted a forbidden request")
+
+ with tempfile.TemporaryDirectory(prefix="unrelated-career-seed-") as directory:
+ root = Path(directory).resolve()
+ fixture(root)
+ denied("wrong_prefix", payload_for(root))
+ with tempfile.TemporaryDirectory(prefix="jobtracker-e2e-seed-selfcheck-") as directory:
+ root = Path(directory).resolve() / "jobtracker-e2e-nested"
+ root.mkdir()
+ fixture(root)
+ denied("nested_root", payload_for(root))
+ with tempfile.TemporaryDirectory(prefix="jobtracker-e2e-seed-selfcheck-") as directory:
+ root = Path(directory).resolve()
+ denied("missing_database", payload_for(root))
+ assert not (root / "jobtracker.db").exists(), "mode=rw must not create a database"
+ with tempfile.TemporaryDirectory(prefix="jobtracker-e2e-seed-selfcheck-") as directory:
+ root = Path(directory).resolve()
+ database = fixture(root)
+ (root / "own-fixture-alias.db").hardlink_to(database)
+ before = snapshot(database)
+ denied("linked_database_denied", payload_for(root))
+ assert snapshot(database) == before
+ for schema in ("missing_column", "extra_column", "wrong_type", "wrong_nullability", "missing_users"):
+ with tempfile.TemporaryDirectory(prefix="jobtracker-e2e-seed-selfcheck-") as directory:
+ root = Path(directory).resolve()
+ fixture(root, schema=schema)
+ denied(schema, payload_for(root))
+ with tempfile.TemporaryDirectory(prefix="jobtracker-e2e-seed-selfcheck-") as directory:
+ root = Path(directory).resolve()
+ database = fixture(root)
+ before = snapshot(database)
+ denied("missing_owner", payload_for(root, ownerId="absent-owner"))
+ denied("wrong_owner_email", payload_for(root, ownerEmail="other@example.test"))
+ denied("owner_email_case_is_exact", payload_for(root, ownerEmail=owner_email.upper()))
+ denied("invalid_profile", payload_for(root, profile=[]))
+ denied("non_finite_profile_json", payload_for(root, profile={"confidence": float("nan")}))
+ denied("unknown_payload_key", payload_for(root, trigger="parse"))
+ denied("invalid_raw_text", payload_for(root, rawText={"not": "text"}))
+ assert snapshot(database) == before, "Denied requests changed existing data"
+ passed.append("denied_requests_preserve_all_rows")
+ with tempfile.TemporaryDirectory(prefix="jobtracker-e2e-seed-selfcheck-") as directory:
+ root = Path(directory).resolve()
+ database = fixture(root)
+ with closing(sqlite3.connect(database)) as connection, connection:
+ connection.execute('CREATE TRIGGER "unexpected_review_write" AFTER INSERT ON "CvExtractionRuns" BEGIN UPDATE "AspNetUsers" SET "ProfileCvText" = \'mutated\'; END')
+ before = snapshot(database)
+ denied("trigger_cannot_mutate_users", payload_for(root))
+ assert snapshot(database) == before, "Forbidden trigger changed existing data"
+ with tempfile.TemporaryDirectory(prefix="jobtracker-e2e-seed-selfcheck-") as directory:
+ root = Path(directory).resolve()
+ quoted_id, quoted_email = "owner' OR 1=1 --", "quote'@example.test"
+ database = fixture(root, owner=quoted_id, email=quoted_email)
+ before = snapshot(database)
+ submitted = {**profile, "contact": {"fullName": "Robert'); DROP TABLE AspNetUsers; -- æøå"}}
+ run_id = seed_review(payload_for(root, ownerId=quoted_id, ownerEmail=quoted_email, profile=submitted))
+ after = snapshot(database)
+ assert isinstance(run_id, int) and run_id > 0
+ assert all(after[table] == rows for table, rows in before.items() if table != "CvExtractionRuns"), "Seeder changed existing source/user/operation data"
+ assert len(after["CvExtractionRuns"]) == len(before["CvExtractionRuns"]) + 1
+ with closing(sqlite3.connect(database)) as connection, connection:
+ connection.row_factory = sqlite3.Row
+ row = dict(connection.execute('SELECT * FROM "CvExtractionRuns" WHERE "Id" = ?', (run_id,)).fetchone())
+ assert row["OwnerUserId"] == quoted_id and row["Status"] == "pending_review"
+ assert row["Trigger"] == "upload" and row["ArtifactId"] is None
+ assert row["ErrorMessage"] is None and row["AppliedAtUtc"] is None
+ assert row["ParserVersion"] == row["NormalizerVersion"] == row["LlmPromptVersion"] == "native-offline-fixture"
+ assert row["RawExtractedText"] == "Synthetic raw — æøå" and row["NormalizedText"] == "French\nNorwegian B1"
+ assert json.loads(row["StructuredProfileJson"]) == submitted
+ assert datetime.fromisoformat(row["StartedAtUtc"]).utcoffset().total_seconds() == 0
+ assert row["CompletedAtUtc"] == row["StartedAtUtc"]
+ passed.extend(("parameterized_exact_insert", "null_artifact_and_no_operation", "existing_source_user_history_unchanged", "existing_schema_unchanged"))
+ result = subprocess.run(
+ [sys.executable, "-X", "utf8", str(Path(__file__).resolve())],
+ input=json.dumps(payload_for(root, ownerId=quoted_id, ownerEmail=quoted_email, profile=submitted), ensure_ascii=False),
+ text=True, encoding="utf-8", capture_output=True, check=False,
+ )
+ assert result.returncode == 0 and result.stderr == "", result.stderr
+ returned = json.loads(result.stdout)
+ assert set(returned) == {"runId"} and returned["runId"] > run_id
+ final = snapshot(database)
+ assert final["CvExtractionRuns"][:-1] == after["CvExtractionRuns"], "CLI modified an existing run"
+ assert len(final["CvExtractionRuns"]) == len(after["CvExtractionRuns"]) + 1
+ assert all(final[table] == rows for table, rows in after.items() if table != "CvExtractionRuns")
+ assert json.loads(final["CvExtractionRuns"][-1][10]) == submitted
+ passed.extend(("stdin_json_returns_only_run_id", "cli_preserves_existing_run_and_source_rows"))
+ return {"selfCheck": "PASS", "checks": len(passed), "passed": passed, "databaseScope": "own temporary SQLite only"}
+
+
+def main() -> int:
+ try:
+ if sys.argv[1:] == ["--self-check"]:
+ print(json.dumps(self_check(), ensure_ascii=False))
+ elif sys.argv[1:]:
+ raise SeedDenied("Only stdin JSON or --self-check is supported")
+ else:
+ print(json.dumps({"runId": seed_review(json.load(sys.stdin))}))
+ return 0
+ except (SeedDenied, json.JSONDecodeError, sqlite3.Error) as error:
+ print(json.dumps({"error": str(error)}, ensure_ascii=False), file=sys.stderr)
+ return 1
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/job-tracker-ui/e2e/phase7-career-import-review.spec.ts b/job-tracker-ui/e2e/phase7-career-import-review.spec.ts
new file mode 100644
index 0000000..b8fd565
--- /dev/null
+++ b/job-tracker-ui/e2e/phase7-career-import-review.spec.ts
@@ -0,0 +1,532 @@
+import { expect, test as base, type APIRequestContext, type APIResponse, type Locator, type Page, type TestInfo } from '@playwright/test';
+import AxeBuilder from '@axe-core/playwright';
+import { realpathSync } from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { spawnSync } from 'node:child_process';
+import { translations } from '../src/i18n/translations';
+import { emptyStructuredCv, type StructuredCvProfile } from '../src/profileCv';
+
+const apiUrl = 'http://localhost:5302/api';
+const password = 'E2ePassword123!';
+type Owner = { id: string; email: string; headers: Record };
+type Sample = { language: 'en' | 'nb'; theme: 'light' | 'dark'; width: number; height: number };
+type CareerReadback = { profile: StructuredCvProfile; completeness: unknown; cvText: string | null };
+type Version = { version: number; source: string; isCurrent: boolean; createdAtUtc: string };
+type Run = { id: number; status: string; artifactFileName: string | null; operation: unknown };
+type ReviewDiff = { runId: number; status: string; diff: { categories: { category: string;
+ updated: { id: string; label: string; confidence: string; fieldChanges: { field: string; oldValue: string | null; newValue: string | null }[] }[] }[] } };
+type CvVariant = { id: number; [key: string]: unknown };
+
+async function json(response: APIResponse, status = 200): Promise {
+ expect(response.status(), `${response.url()} must return ${status}`).toBe(status);
+ return response.json();
+}
+
+async function login(api: APIRequestContext, email: string): Promise {
+ expect((await api.post(`${apiUrl}/auth/login`, { data: { email, password } })).status()).toBe(200);
+ const me = await json<{ id: string; email: string; sessionContext: string }>(await api.get(`${apiUrl}/auth/me`));
+ const csrf = (await api.storageState()).cookies.find(cookie => cookie.name === 'XSRF-TOKEN');
+ expect(csrf).toBeDefined();
+ expect(me.email).toBe(email);
+ return { id: me.id, email: me.email, headers: { 'X-CSRF-TOKEN': csrf!.value, 'X-Session-Context': me.sessionContext } };
+}
+
+async function createOwner(admin: APIRequestContext, owner: Owner) {
+ const email = `p7-career-review-${Date.now()}-${Math.random().toString(36).slice(2)}@example.test`;
+ expect((await admin.post(`${apiUrl}/users`, { headers: owner.headers, data: { email, password, roles: [] } })).status()).toBe(200);
+ return email;
+}
+
+const test = base.extend<{ owner: Owner }>({
+ owner: async ({ page, context, playwright }, provide) => {
+ const admin = await playwright.request.newContext();
+ try {
+ const adminOwner = await login(admin, 'e2e@example.test');
+ const owner = await login(page.request, await createOwner(admin, adminOwner));
+ await context.route('**/*', route => {
+ const url = new URL(route.request().url());
+ return ['localhost', '127.0.0.1'].includes(url.hostname) || ['data:', 'blob:', 'about:'].includes(url.protocol)
+ ? route.continue() : route.abort();
+ });
+ await provide(owner);
+ } finally { await admin.dispose(); }
+ },
+});
+
+function source(headline = 'Reviewed canonical professional context') {
+ return { ...emptyStructuredCv(),
+ contact: { ...emptyStructuredCv().contact, fullName: 'Åse Nordlys — recorded professional identity with a deliberately long owner-reviewed name',
+ headline, phone: '+47 900 00 001', email: 'recorded-professional-contact@example.test',
+ location: 'Trondheim, Trøndelag, Norge — recorded remote and hybrid collaboration' },
+ summary: ['Reviewed canonical summary.'],
+ jobs: [{ id: 'review-job-source', title: 'Senior engineer with recorded responsibility for professional delivery and reliable Scandinavian services',
+ company: 'Nordlys programvare og dokumenterte tjenester AS', bullets: ['Original reviewed job evidence.'], skills: ['C#'] }],
+ education: [{ id: 'review-education-source', qualification: 'Recorded computer science qualification', institution: 'Recorded university', details: ['Reviewed education detail.'] }],
+ projects: [{ id: 'review-project-source', name: 'Reviewed project', bullets: ['Recorded project evidence.'], skills: ['React'] }],
+ certifications: [{ id: 'review-certification-source', name: 'Recorded certification', issuer: 'Fixture Academy', details: ['Reviewed certification detail.'] }],
+ languages: [{ name: 'Norwegian', level: 'A2', notes: 'Owner-reviewed language note.' }],
+ skills: ['C#', 'Norsk'], awards: ['Recorded award'], publications: ['Recorded publication'],
+ organisations: ['Recorded organisation'], references: ['Available by owner agreement'],
+ otherSections: [{ title: 'Owner-reviewed custom information with a deliberately long descriptive heading', items: ['A custom fact retained during review.'] }],
+ };
+}
+
+const importedBullet = 'Imported recorded implementation detail with deliberately long professional context, retained only after explicit acceptance and never presented as a qualified model result.';
+const importedContactEmail = 'pending-reviewed-contact@example.test';
+function incoming() {
+ const current = source();
+ return { version: '1', contact: { email: importedContactEmail },
+ jobs: [{ title: current.jobs[0].title, company: current.jobs[0].company, bullets: [importedBullet], skills: ['C#'] }],
+ languages: [{ name: 'Norwegian', level: 'B1' }],
+ };
+}
+
+async function assertReachableLowContact(api: APIRequestContext, runId: number, currentEmail: string | null | undefined) {
+ const review = await json(await api.get(`${apiUrl}/profile-cv/runs/${runId}/diff`));
+ expect(review).toMatchObject({ runId, status: 'pending_review' });
+ const contact = review.diff.categories.find(category => category.category === 'Contact');
+ expect(contact?.updated).toEqual([expect.objectContaining({ id: 'Contact', label: 'Contact details', confidence: 'Low',
+ fieldChanges: [{ field: 'Email', oldValue: currentEmail, newValue: importedContactEmail }] })]);
+ return review;
+}
+
+async function readSource(api: APIRequestContext) {
+ return { canonical: await json(await api.get(`${apiUrl}/career/profile`)),
+ history: await json(await api.get(`${apiUrl}/career/profile/versions`)) };
+}
+
+async function seedSource(page: Page, owner: Owner, twoVersions = false) {
+ const raw = 'Exact CURRENT original career source — æøå\nReviewed work and qualifications.\n';
+ await json(await page.request.put(`${apiUrl}/career/profile`, { headers: owner.headers, data: { profile: source(), cvText: raw } }));
+ if (twoVersions) await json(await page.request.put(`${apiUrl}/career/profile`, { headers: owner.headers,
+ data: { profile: source('Second reviewed canonical context'), cvText: raw } }));
+ return readSource(page.request);
+}
+
+function seedPending(info: TestInfo, owner: Owner) {
+ expect(process.env.PLAYWRIGHT_REUSE_SERVERS).not.toBe('true');
+ const metadataRoot = info.config.metadata.isolatedDataRoot;
+ if (typeof metadataRoot !== 'string') throw new Error('Review seeding requires explicit isolatedDataRoot metadata from a non-reused native server');
+ expect(path.isAbsolute(metadataRoot)).toBe(true);
+ const dataRoot = realpathSync(metadataRoot);
+ expect(path.dirname(dataRoot)).toBe(realpathSync(os.tmpdir()));
+ expect(path.basename(dataRoot)).toMatch(/^jobtracker-e2e-[A-Za-z0-9][A-Za-z0-9_-]*$/);
+ const helper = path.resolve('e2e/helpers/seed-career-review.py');
+ const result = spawnSync('rtk', ['proxy', process.env.PLAYWRIGHT_PYTHON_PATH || 'python', '-X', 'utf8', helper], {
+ input: JSON.stringify({ dataRoot, ownerId: owner.id, ownerEmail: owner.email, profile: incoming(),
+ rawText: 'Synthetic pending extraction text — æøå', normalizedText: 'Synthetic pending normalized text; pending contact email; Norwegian B1.' }),
+ encoding: 'utf8', timeout: 15_000, maxBuffer: 1024 * 1024,
+ });
+ expect(result.error, 'guarded helper must start').toBeUndefined();
+ expect(result.status, result.stderr).toBe(0);
+ const output = JSON.parse(result.stdout) as { runId: number };
+ expect(Object.keys(output)).toEqual(['runId']);
+ expect(Number.isInteger(output.runId) && output.runId > 0).toBe(true);
+ return output.runId;
+}
+
+async function enter(page: Page, owner: Owner, sample: Sample, section: 'profile' | 'import') {
+ const initialNavigation = page.url() === 'about:blank';
+ expect((await page.request.put(`${apiUrl}/auth/preferences/language`, { headers: owner.headers,
+ data: { language: sample.language === 'nb' ? 'nb-NO' : 'en' } })).status()).toBe(204);
+ if (initialNavigation) {
+ await page.addInitScript(({ language, theme }) => {
+ if (!localStorage.getItem('uiLanguage')) localStorage.setItem('uiLanguage', language);
+ if (!localStorage.getItem('jobtracker.themeMode')) localStorage.setItem('jobtracker.themeMode', theme);
+ }, sample);
+ }
+ await page.setViewportSize({ width: sample.width, height: sample.height });
+ await page.emulateMedia({ reducedMotion: 'reduce' });
+ await page.goto(`/career?section=${section}&source=phase7-review#preserved`);
+ if (!initialNavigation) {
+ await page.evaluate(({ language, theme }) => {
+ localStorage.setItem('uiLanguage', language);
+ localStorage.setItem('jobtracker.themeMode', theme);
+ }, sample);
+ await page.reload();
+ }
+ await expect(page.locator('html')).toHaveAttribute('lang', sample.language === 'nb' ? 'nb-NO' : 'en');
+ await expect(page.locator('html')).toHaveAttribute('data-color-scheme', sample.theme);
+}
+
+async function navigateSection(page: Page, language: Sample['language'], section: 'profile' | 'import') {
+ const t = translations[language];
+ const label = section === 'profile' ? t.careerWorkspaceProfileTab : t.careerWorkspaceImportTab;
+ const selector = page.getByRole('combobox', { name: t.careerWorkspaceNavigation, exact: true });
+ if (await selector.isVisible()) {
+ await selector.click();
+ await page.getByRole('option', { name: label, exact: true }).click();
+ } else await page.getByRole('tab', { name: label, exact: true }).click();
+ const url = new URL(page.url());
+ expect(url.searchParams.get('section')).toBe(section);
+ expect(url.searchParams.get('source')).toBe('phase7-review');
+ expect(url.hash).toBe('#preserved');
+}
+
+function runArticle(page: Page, language: Sample['language'], id: number) {
+ return page.getByRole('article', { name: `${translations[language].careerImportUpload} ${id}`, exact: true });
+}
+
+function lowContactCheckbox(article: Locator, language: Sample['language']) {
+ const t = translations[language];
+ return article.getByRole('checkbox', { name: t.profileCvIncludeLowConfidence
+ .replace('{category}', t.careerProfileContactSection).replace('{label}', t.careerImportContactDetails), exact: true });
+}
+
+async function ready(article: Locator, language: Sample['language']) {
+ const t = translations[language];
+ await expect(article).toBeVisible();
+ await expect(article.getByText(t.careerImportPendingReview, { exact: true })).toBeVisible();
+ await expect(lowContactCheckbox(article, language)).toBeVisible();
+ await expect(article.getByText(t.careerImportCurrentValue.replace('{value}', 'A2'), { exact: true })).toBeVisible();
+ await expect(article.getByText(t.careerImportIncomingValue.replace('{value}', 'B1'), { exact: true })).toBeVisible();
+ await expect(article.getByText(t.careerImportComparisonScope, { exact: true })).toBeVisible();
+ await expect(article.getByRole('button', { name: t.profileCvApplyChanges, exact: true })).toBeEnabled();
+}
+
+async function openRaw(page: Page, language: Sample['language']) {
+ const t = translations[language];
+ const disclosure = page.getByRole('button', { name: new RegExp(t.profileCvRawPanelTitle) });
+ if (await disclosure.getAttribute('aria-expanded') !== 'true') await disclosure.click();
+ const field = page.getByLabel(t.profileCvTextLabel, { exact: true });
+ await expect(field).toBeVisible();
+ return field;
+}
+
+async function openHistory(page: Page, language: Sample['language'], count: number) {
+ const label = translations[language].profileCvVersionHistory.replace('{count}', String(count));
+ await expect(page.getByRole('heading', { level: 2, name: label, exact: true })).toBeVisible();
+ const section = page.getByRole('region', { name: label, exact: true });
+ if (count > 1) {
+ const toggle = section.getByRole('button', { name: label, exact: true });
+ if (await toggle.getAttribute('aria-expanded') !== 'true') await toggle.click();
+ await expect(toggle).toHaveAttribute('aria-expanded', 'true');
+ }
+ return section;
+}
+
+function sourceWrites(page: Page) {
+ const writes: string[] = [];
+ page.on('request', request => {
+ const url = request.url();
+ if (!['GET', 'HEAD', 'OPTIONS'].includes(request.method()) &&
+ (url === `${apiUrl}/career/profile` || url.startsWith(`${apiUrl}/career/profile/versions/`) || url.startsWith(`${apiUrl}/profile-cv/`))) {
+ writes.push(`${request.method()} ${url}`);
+ }
+ });
+ return writes;
+}
+
+async function capture(page: Page, info: TestInfo, sample: Sample, state: string) {
+ await page.evaluate(async () => { await document.fonts.ready; await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))); });
+ const geometry = await page.evaluate(() => ({ width: innerWidth, height: innerHeight,
+ rootOverflow: Math.max(0, document.documentElement.scrollWidth - document.documentElement.clientWidth),
+ overflowElements: [...document.querySelectorAll('body *')]
+ .filter(element => element.getClientRects().length > 0 && getComputedStyle(element).visibility !== 'hidden' && !element.closest('[hidden],[aria-hidden="true"]'))
+ .map(element => { const rect = element.getBoundingClientRect(); return { tag: element.tagName, text: (element.textContent ?? '').slice(0, 100), left: rect.left, right: rect.right, width: rect.width }; })
+ .filter(element => element.width > 0 && (element.left < -1 || element.right > innerWidth + 1)).slice(0, 20),
+ }));
+ const axe = await new AxeBuilder({ page }).options({ rules: { 'target-size': { enabled: true } } }).analyze();
+ const name = `p7-career-review-${sample.language}-${sample.theme}-${sample.width}-${state}`;
+ await info.attach(`${name}-audit`, { body: JSON.stringify({ sample, state, geometry, ariaSnapshot: await page.getByRole('main').ariaSnapshot(),
+ axe: { violations: axe.violations, incomplete: axe.incomplete, passes: axe.passes.map(rule => ({ id: rule.id, nodes: rule.nodes.length })) },
+ qualification: 'Automated Chromium/seeded stored-review presentation only. All enabled axe results retained; incomplete results require triage. No actual extraction/model qualification, provider calls, physical touch/software keyboard, human screen reader, actual browser zoom, production font/photo or PDF/render-fidelity acceptance.' }), contentType: 'application/json' });
+ await info.attach(name, { body: await page.screenshot({ fullPage: true, animations: 'disabled' }), contentType: 'image/png' });
+ expect(geometry.rootOverflow).toBe(0);
+ expect(axe.violations).toEqual([]);
+}
+
+async function preservedDocuments(page: Page, owner: Owner, canonical: CareerReadback) {
+ const company = await json<{ id: number }>(await page.request.post(`${apiUrl}/companies`, { headers: owner.headers, data: { name: 'Import preservation fixture AS' } }), 201);
+ const job = await json<{ id: number }>(await page.request.post(`${apiUrl}/jobapplications`, { headers: owner.headers,
+ data: { companyId: company.id, jobTitle: 'Recorded import preservation', status: 'Saved' } }), 201);
+ const selected = await json(await page.request.post(`${apiUrl}/cv/variants`, { headers: owner.headers,
+ data: { name: 'Selected import preservation CV', jobApplicationId: job.id, settings: { themeId: 'minimal',
+ overrides: { [canonical.profile.jobs[0].id!]: { title: 'CV-specific reviewed title', bullets: ['CV-specific reviewed evidence.'] } } } } }));
+ const sibling = await json(await page.request.post(`${apiUrl}/cv/variants`, { headers: owner.headers,
+ data: { name: 'Untouched import sibling CV', settings: { themeId: 'minimal' } } }));
+ expect((await page.request.put(`${apiUrl}/jobapplications/${job.id}/cv`, { headers: owner.headers, data: { variantId: selected.id } })).status()).toBe(200);
+ const frozen = await json<{ id: number }>(await page.request.post(`${apiUrl}/jobapplications/${job.id}/submitted-packages`, { headers: owner.headers }));
+ const urls = [`${apiUrl}/cv/variants/${selected.id}`, `${apiUrl}/cv/variants/${selected.id}/versions`,
+ `${apiUrl}/cv/variants/${sibling.id}`, `${apiUrl}/cv/variants/${sibling.id}/versions`,
+ `${apiUrl}/jobapplications/${job.id}/submitted-packages/${frozen.id}`];
+ const before = await Promise.all(urls.map(async url => json(await page.request.get(url))));
+ return { urls, before };
+}
+
+test('[P7-03 PRES-C01 C02 C03 C04 C05 W07] explicit select/deselect acceptance uses stable IDs and preserves raw, CV siblings and frozen snapshots', async ({ page, owner }, info) => {
+ test.setTimeout(120_000);
+ const before = await seedSource(page, owner);
+ const documents = await preservedDocuments(page, owner, before.canonical);
+ const firstRun = seedPending(info, owner);
+ const firstDiff = await assertReachableLowContact(page.request, firstRun, before.canonical.profile.contact.email);
+ expect(await readSource(page.request)).toEqual(before);
+ const firstStored = (await json(await page.request.get(`${apiUrl}/profile-cv/runs`))).find(run => run.id === firstRun)!;
+ expect(firstStored.artifactFileName).toBeNull();
+ expect(firstStored.operation).toBeNull();
+ const sample: Sample = { language: 'en', theme: 'light', width: 390, height: 844 };
+ await enter(page, owner, sample, 'import');
+ const article = runArticle(page, 'en', firstRun);
+ await ready(article, 'en');
+ await expect(await openRaw(page, 'en')).toHaveValue(before.canonical.cvText!);
+ const contact = lowContactCheckbox(article, 'en');
+ await expect(contact).not.toBeChecked();
+ await contact.check();
+ await expect(contact).toBeChecked();
+ await contact.uncheck();
+ const firstResponse = page.waitForResponse(response => response.url() === `${apiUrl}/profile-cv/runs/${firstRun}/accept` && response.request().method() === 'POST');
+ await article.getByRole('button', { name: translations.en.profileCvApplyChanges, exact: true }).focus();
+ await page.keyboard.press('Enter');
+ const firstAccepted = await firstResponse;
+ expect(firstAccepted.status()).toBe(200);
+ expect(firstAccepted.request().postDataJSON()).toEqual({ acceptedLowConfidenceIds: [] });
+ await expect(article.getByText(translations.en.careerImportApplied, { exact: true })).toBeVisible();
+ await expect(article).toBeFocused();
+ const afterFirst = await readSource(page.request);
+ expect(afterFirst.canonical.profile.contact.email).toBe(before.canonical.profile.contact.email);
+ expect((await json<{ email: string }>(await page.request.get(`${apiUrl}/auth/me`))).email).toBe(owner.email);
+ expect(afterFirst.canonical.profile.languages.find(language => language.name === 'Norwegian')?.level).toBe('B1');
+ expect(afterFirst.canonical.cvText).toBe(before.canonical.cvText);
+ expect(afterFirst.history).toHaveLength(before.history.length + 1);
+ expect(afterFirst.history[0].source).toBe('upload:accepted');
+ expect(afterFirst.canonical.profile.jobs[0].id).toBe(before.canonical.profile.jobs[0].id);
+ for (const key of ['education', 'projects', 'certifications', 'otherSections', 'awards', 'publications', 'organisations', 'references'] as const) {
+ expect(afterFirst.canonical.profile[key]).toEqual(before.canonical.profile[key]);
+ }
+ const secondRun = seedPending(info, owner);
+ const secondDiff = await assertReachableLowContact(page.request, secondRun, afterFirst.canonical.profile.contact.email);
+ await enter(page, owner, { language: 'nb', theme: 'dark', width: 360, height: 800 }, 'import');
+ const secondArticle = runArticle(page, 'nb', secondRun);
+ await expect(secondArticle.getByText(translations.nb.careerImportPendingReview, { exact: true })).toBeVisible();
+ const selected = lowContactCheckbox(secondArticle, 'nb');
+ await expect(selected).not.toBeChecked();
+ await selected.check();
+ const secondResponse = page.waitForResponse(response => response.url() === `${apiUrl}/profile-cv/runs/${secondRun}/accept` && response.request().method() === 'POST');
+ await secondArticle.getByRole('button', { name: translations.nb.profileCvApplyChanges, exact: true }).click();
+ const secondAccepted = await secondResponse;
+ expect(secondAccepted.status()).toBe(200);
+ expect(secondAccepted.request().postDataJSON()).toEqual({ acceptedLowConfidenceIds: ['Contact'] });
+ await expect(secondArticle).toBeFocused();
+ const afterSecond = await readSource(page.request);
+ expect(afterSecond.canonical.profile.contact.email).toBe(importedContactEmail);
+ expect(afterSecond.canonical.profile.contact.fullName).toBe(before.canonical.profile.contact.fullName);
+ expect((await json<{ email: string }>(await page.request.get(`${apiUrl}/auth/me`))).email).toBe(owner.email);
+ expect(afterSecond.canonical.cvText).toBe(before.canonical.cvText);
+ expect(afterSecond.history).toHaveLength(afterFirst.history.length + 1);
+ expect((await page.request.post(`${apiUrl}/profile-cv/runs/${secondRun}/accept`, { headers: owner.headers, data: { acceptedLowConfidenceIds: ['Contact'] } })).status()).toBe(409);
+ expect(await readSource(page.request)).toEqual(afterSecond);
+ const afterDocuments = await Promise.all(documents.urls.map(async url => json(await page.request.get(url))));
+ expect(afterDocuments).toEqual(documents.before);
+ await info.attach('native-offline-review-acceptance', { body: JSON.stringify({ firstRun, secondRun, firstStored, firstDiff, secondDiff, before, afterFirst, afterSecond,
+ acceptedSelections: [firstAccepted.request().postDataJSON(), secondAccepted.request().postDataJSON()], documentsUnchanged: true,
+ qualification: 'Synthetic pending extraction rows seeded in isolated SQLite; all accept/history/source/document reads are actual HTTP. Null incoming artifact is intentional. CURRENT original raw is preserved; no pending-run raw or real extraction qualification is claimed. No explicit preview/render/PDF endpoint or model/provider request.' }), contentType: 'application/json' });
+});
+
+test('[P7-03 PRES-C01 C02 C04] discarding stored review retains dirty structured and CURRENT raw drafts without a source write', async ({ page, owner }, info) => {
+ const before = await seedSource(page, owner);
+ const runId = seedPending(info, owner);
+ await assertReachableLowContact(page.request, runId, before.canonical.profile.contact.email);
+ const sample: Sample = { language: 'en', theme: 'dark', width: 390, height: 844 };
+ await enter(page, owner, sample, 'profile');
+ const writes = sourceWrites(page);
+ const draftPhone = '+47 900 00 009';
+ await page.getByLabel(translations.en.profileCvContactPhone, { exact: true }).fill(draftPhone);
+ await navigateSection(page, 'en', 'import');
+ const raw = await openRaw(page, 'en');
+ const draftRaw = 'Unsaved CURRENT raw draft — æøå\nKept when the stored extraction is discarded.';
+ await raw.fill(draftRaw);
+ const article = runArticle(page, 'en', runId);
+ await expect(lowContactCheckbox(article, 'en')).toBeVisible();
+ await expect(article.getByRole('button', { name: translations.en.profileCvApplyChanges, exact: true })).toBeDisabled();
+ const response = page.waitForResponse(result => result.url() === `${apiUrl}/profile-cv/runs/${runId}/discard` && result.request().method() === 'POST');
+ await article.getByRole('button', { name: translations.en.profileCvDiscard, exact: true }).click();
+ expect((await response).status()).toBe(204);
+ await expect(article.getByText(translations.en.careerImportDiscarded, { exact: true })).toBeVisible();
+ await expect(article).toBeFocused();
+ await expect(raw).toHaveValue(draftRaw);
+ await navigateSection(page, 'en', 'profile');
+ await expect(page.getByLabel(translations.en.profileCvContactPhone, { exact: true })).toHaveValue(draftPhone);
+ expect(await readSource(page.request)).toEqual(before);
+ expect(writes).toEqual([`POST ${apiUrl}/profile-cv/runs/${runId}/discard`]);
+ expect((await page.request.post(`${apiUrl}/profile-cv/runs/${runId}/discard`, { headers: owner.headers })).status()).toBe(409);
+ expect(await readSource(page.request)).toEqual(before);
+ await info.attach('native-offline-review-discard-drafts', { body: JSON.stringify({ runId, writes, draftPhone, draftRaw, canonicalAndHistoryUnchanged: true,
+ qualification: 'Discard is actual bodyless HTTP204; no profile save or browser reload occurred. Draft retention is session-local, not a persistence claim.' }), contentType: 'application/json' });
+});
+
+test('[P7-03 PRES-C02 C04 E09] stored reviews are owner scoped and foreign/anonymous review actions cannot mutate source', async ({ page, owner, playwright }, info) => {
+ const beforeA = await seedSource(page, owner);
+ const runA = seedPending(info, owner);
+ await assertReachableLowContact(page.request, runA, beforeA.canonical.profile.contact.email);
+ const admin = await playwright.request.newContext();
+ const other = await playwright.request.newContext();
+ const anonymous = await playwright.request.newContext();
+ try {
+ const adminOwner = await login(admin, 'e2e@example.test');
+ const ownerB = await login(other, await createOwner(admin, adminOwner));
+ await json(await other.put(`${apiUrl}/career/profile`, { headers: ownerB.headers, data: { profile: source('Owner B reviewed context'), cvText: 'Owner B exact raw' } }));
+ const beforeB = await readSource(other);
+ const runB = seedPending(info, ownerB);
+ await assertReachableLowContact(other, runB, beforeB.canonical.profile.contact.email);
+ expect((await json(await page.request.get(`${apiUrl}/profile-cv/runs`))).map(run => run.id)).toEqual([runA]);
+ expect((await json(await other.get(`${apiUrl}/profile-cv/runs`))).map(run => run.id)).toEqual([runB]);
+ for (const [api, foreign, headers] of [[page.request, runB, owner.headers], [other, runA, ownerB.headers]] as const) {
+ expect((await api.get(`${apiUrl}/profile-cv/runs/${foreign}/diff`)).status()).toBe(404);
+ expect((await api.post(`${apiUrl}/profile-cv/runs/${foreign}/accept`, { headers, data: { acceptedLowConfidenceIds: ['Contact'] } })).status()).toBe(404);
+ expect((await api.post(`${apiUrl}/profile-cv/runs/${foreign}/discard`, { headers })).status()).toBe(404);
+ }
+ expect((await anonymous.get(`${apiUrl}/profile-cv/runs`)).status()).toBe(401);
+ expect((await anonymous.get(`${apiUrl}/profile-cv/runs/${runA}/diff`)).status()).toBe(401);
+ expect((await anonymous.post(`${apiUrl}/profile-cv/runs/${runA}/accept`, { data: { acceptedLowConfidenceIds: [] } })).status()).toBe(401);
+ expect((await anonymous.post(`${apiUrl}/profile-cv/runs/${runA}/discard`)).status()).toBe(401);
+ expect(await readSource(page.request)).toEqual(beforeA);
+ expect(await readSource(other)).toEqual(beforeB);
+ await enter(page, owner, { language: 'nb', theme: 'light', width: 768, height: 1024 }, 'import');
+ await ready(runArticle(page, 'nb', runA), 'nb');
+ await expect(runArticle(page, 'nb', runB)).toHaveCount(0);
+ await info.attach('native-offline-review-owner-contract', { body: JSON.stringify({ runA, runB, owners: [owner.id, ownerB.id],
+ bidirectionalForeignReadAcceptDiscard404: true, anonymousReadAcceptDiscard401: true, canonicalAndHistoryUnchanged: true }), contentType: 'application/json' });
+ } finally { await Promise.all([admin.dispose(), other.dispose(), anonymous.dispose()]); }
+});
+
+test('[P7-03 PRES-C01 C02] version Restore appends a new structured version and preserves CURRENT raw text', async ({ page, owner }, info) => {
+ const before = await seedSource(page, owner, true);
+ const sample: Sample = { language: 'nb', theme: 'dark', width: 360, height: 800 };
+ await enter(page, owner, sample, 'profile');
+ await expect(page.getByLabel(translations.nb.profileCvContactPhone, { exact: true })).toHaveValue('+47 900 00 001');
+ const section = await openHistory(page, 'nb', before.history.length);
+ const restore = section.getByRole('button', { name: translations.nb.careerRestoreVersion.replace('{version}', '1'), exact: true });
+ await expect(restore).toBeEnabled();
+ const response = page.waitForResponse(result => result.url() === `${apiUrl}/career/profile/versions/1/restore` && result.request().method() === 'POST');
+ await restore.focus();
+ await page.keyboard.press('Enter');
+ expect((await response).status()).toBe(200);
+ const after = await readSource(page.request);
+ expect(after.history).toHaveLength(before.history.length + 1);
+ expect(after.history[0]).toMatchObject({ version: 3, source: 'restore:v1', isCurrent: true });
+ expect(after.history.slice(1).map(version => ({ ...version, isCurrent: false }))).toEqual(before.history.map(version => ({ ...version, isCurrent: false })));
+ expect(after.canonical.profile.contact.headline).toBe('Reviewed canonical professional context');
+ expect(after.canonical.cvText).toBe(before.canonical.cvText);
+ await expect(page.getByLabel(translations.nb.profileCvContactHeadline, { exact: true })).toHaveValue('Reviewed canonical professional context');
+ await page.reload();
+ await expect(page.getByLabel(translations.nb.profileCvContactHeadline, { exact: true })).toHaveValue('Reviewed canonical professional context');
+ await navigateSection(page, 'nb', 'import');
+ await expect(await openRaw(page, 'nb')).toHaveValue(before.canonical.cvText!);
+ await info.attach('native-offline-review-restore', { body: JSON.stringify({ before, after,
+ qualification: 'Existing unconditional structured Restore contract; current raw text is not historical raw and is retained. No ExpectedVersion or stale-write protection is claimed.' }), contentType: 'application/json' });
+});
+
+test('[P7-03 PRES-C02 C04 E08] comparison GET failure has scoped retry and held loading without source mutation', async ({ page, owner }, info) => {
+ test.setTimeout(90_000);
+ const before = await seedSource(page, owner);
+ const runId = seedPending(info, owner);
+ await assertReachableLowContact(page.request, runId, before.canonical.profile.contact.email);
+ let reads = 0;
+ let release!: () => void;
+ const held = new Promise(resolve => { release = resolve; });
+ const endpoint = `${apiUrl}/profile-cv/runs/${runId}/diff`;
+ await page.route(endpoint, async route => {
+ expect(route.request().method()).toBe('GET');
+ reads += 1;
+ if (reads === 1) await route.fulfill({ status: 500, contentType: 'text/plain', body: 'Controlled comparison read unavailable' });
+ else { await held; const response = await route.fetch(); await route.fulfill({ response }); }
+ });
+ const sample: Sample = { language: 'en', theme: 'light', width: 320, height: 844 };
+ const writes = sourceWrites(page);
+ try {
+ await enter(page, owner, sample, 'import');
+ const article = runArticle(page, 'en', runId);
+ await expect(article.getByRole('alert')).toContainText(translations.en.careerImportComparisonFailed);
+ await expect(article.getByRole('alert')).toContainText('Controlled comparison read unavailable');
+ await expect(article.getByRole('button', { name: translations.en.profileCvApplyChanges, exact: true })).toBeDisabled();
+ expect(reads).toBe(1);
+ await capture(page, info, sample, 'comparison-failure');
+ await article.getByRole('button', { name: translations.en.retry, exact: true }).focus();
+ await page.keyboard.press('Enter');
+ await expect.poll(() => reads).toBe(2);
+ await expect(article).toBeFocused();
+ await expect(article.getByRole('progressbar', { name: translations.en.careerImportComparisonLoading, exact: true })).toBeVisible();
+ await expect(article.getByRole('button', { name: translations.en.profileCvApplyChanges, exact: true })).toBeDisabled();
+ expect(await readSource(page.request)).toEqual(before);
+ expect(writes).toEqual([]);
+ } finally { release(); }
+ const article = runArticle(page, 'en', runId);
+ await ready(article, 'en');
+ const contact = lowContactCheckbox(article, 'en');
+ await contact.check();
+ await expect(contact).toBeChecked();
+ await contact.uncheck();
+ expect(reads).toBe(2);
+ expect(await readSource(page.request)).toEqual(before);
+ expect(writes).toEqual([]);
+ await info.attach('native-offline-review-comparison-recovery', { body: JSON.stringify({ runId, reads, writes, canonicalAndHistoryUnchanged: true,
+ qualification: 'Only the first diff GET500 and second GET delay are controlled; successful comparison uses actual route.fetch HTTP and stored source.' }), contentType: 'application/json' });
+});
+
+const matrix: Sample[] = [
+ { language: 'nb', theme: 'dark', width: 320, height: 844 },
+ { language: 'en', theme: 'light', width: 360, height: 800 },
+ { language: 'nb', theme: 'light', width: 390, height: 844 },
+ { language: 'en', theme: 'dark', width: 768, height: 1024 },
+ { language: 'nb', theme: 'dark', width: 1024, height: 768 },
+ { language: 'en', theme: 'light', width: 1280, height: 320 },
+ { language: 'nb', theme: 'light', width: 1440, height: 900 },
+ { language: 'en', theme: 'dark', width: 1920, height: 1080 },
+];
+
+test('[P7-03 PRES-C01 C02 C04 E08] history read retry and settled review/history presentation across eight widths', async ({ page, owner }, info) => {
+ test.setTimeout(180_000);
+ const before = await seedSource(page, owner, true);
+ const runId = seedPending(info, owner);
+ await assertReachableLowContact(page.request, runId, before.canonical.profile.contact.email);
+ const endpoint = `${apiUrl}/career/profile/versions`;
+ let reads = 0;
+ let release!: () => void;
+ const held = new Promise(resolve => { release = resolve; });
+ await page.route(endpoint, async route => {
+ expect(route.request().method()).toBe('GET');
+ reads += 1;
+ if (reads === 1) await route.fulfill({ status: 500, contentType: 'text/plain', body: 'Controlled version read unavailable' });
+ else { await held; const response = await route.fetch(); await route.fulfill({ response }); }
+ });
+ const sample: Sample = { language: 'en', theme: 'light', width: 390, height: 844 };
+ const writes = sourceWrites(page);
+ try {
+ await enter(page, owner, sample, 'profile');
+ await expect(page.getByLabel(translations.en.profileCvContactPhone, { exact: true })).toHaveValue('+47 900 00 001');
+ const failure = page.getByRole('main').getByRole('alert').filter({ hasText: translations.en.careerHistoryLoadFailed });
+ await expect(failure).toContainText('Controlled version read unavailable');
+ expect(reads).toBe(1);
+ await failure.getByRole('button', { name: translations.en.retry, exact: true }).focus();
+ await page.keyboard.press('Enter');
+ await expect.poll(() => reads).toBe(2);
+ await expect(page.getByRole('group', { name: translations.en.profileCvVersionHistory.replace('{count}', '0'), exact: true })).toBeFocused();
+ await expect(page.getByRole('progressbar', { name: translations.en.careerHistoryLoading, exact: true })).toBeVisible();
+ expect(await readSource(page.request)).toEqual(before);
+ expect(writes).toEqual([]);
+ } finally { release(); }
+ const recovered = await openHistory(page, 'en', before.history.length);
+ await expect(recovered.getByRole('button', { name: translations.en.careerRestoreVersion.replace('{version}', '1'), exact: true })).toBeEnabled();
+ expect(reads).toBe(2);
+ await page.unroute(endpoint);
+ for (const visual of matrix) {
+ const t = translations[visual.language];
+ await enter(page, owner, visual, 'import');
+ const article = runArticle(page, visual.language, runId);
+ await ready(article, visual.language);
+ const raw = await openRaw(page, visual.language);
+ await expect(raw).toHaveValue(before.canonical.cvText!);
+ await expect(article.getByText(t.profileCvNoStoredArtifact, { exact: true })).toBeVisible();
+ await capture(page, info, visual, 'settled-stored-review');
+ await navigateSection(page, visual.language, 'profile');
+ await expect(page.getByLabel(t.profileCvContactHeadline, { exact: true })).toHaveValue('Second reviewed canonical context');
+ const history = await openHistory(page, visual.language, before.history.length);
+ await expect(history.getByRole('button', { name: t.careerRestoreVersion.replace('{version}', '1'), exact: true })).toBeEnabled();
+ await capture(page, info, visual, 'settled-version-history');
+ expect(await readSource(page.request)).toEqual(before);
+ }
+ expect(writes).toEqual([]);
+ await info.attach('native-offline-review-history-recovery-and-matrix', { body: JSON.stringify({ runId, initialControlledReads: 2, samples: matrix, writes,
+ canonicalAndHistoryUnchanged: true, qualification: 'Eight paired automated viewport samples, not physical-device, software-keyboard, zoom or human screen-reader acceptance. Stored CURRENT raw is shown, not pending extraction raw.' }), contentType: 'application/json' });
+});
diff --git a/job-tracker-ui/e2e/phase7-career-overview.spec.ts b/job-tracker-ui/e2e/phase7-career-overview.spec.ts
index 5bd347b..83b02fb 100644
--- a/job-tracker-ui/e2e/phase7-career-overview.spec.ts
+++ b/job-tracker-ui/e2e/phase7-career-overview.spec.ts
@@ -350,7 +350,7 @@ test('[P7-02 PRES-C01 C02] existing raw source copy and history entry remain rea
await navigateSection(page, 'en', 'profile');
const label = t.profileCvVersionHistory.replace('{count}', String(history.length));
await page.getByRole('button', { name: label, exact: true }).click();
- await expect(page.getByRole('button', { name: t.profileCvVersionRestore, exact: true }).first()).toBeVisible();
+ await expect(page.getByRole('button', { name: new RegExp(`^${t.careerRestoreVersion.replace('{version}', '\\d+')}$`) }).first()).toBeVisible();
expect(await (await page.request.get(`${apiUrl}/career/profile`)).json()).toEqual(before);
expect(await (await page.request.get(`${apiUrl}/career/profile/versions`)).json()).toEqual(history);
await info.attach('native-career-source-history-entry', { body: JSON.stringify({ clipboardContentPreservedWithExplicitWindowsLineEndingNormalization: true, historyEntryVisible: true,
diff --git a/job-tracker-ui/playwright.config.ts b/job-tracker-ui/playwright.config.ts
index 6690e45..e075d7b 100644
--- a/job-tracker-ui/playwright.config.ts
+++ b/job-tracker-ui/playwright.config.ts
@@ -19,6 +19,7 @@ export default defineConfig({
fullyParallel: false,
workers: 1,
retries: process.env.CI ? 1 : 0,
+ metadata: { isolatedDataRoot: reuseServers ? null : dataRoot },
reporter: process.env.CI ? "github" : "list",
use: {
baseURL: appUrl,
@@ -44,6 +45,7 @@ export default defineConfig({
App__CommitSha: "e2e1234",
Cors__Origins__0: appUrl,
Data__Root: dataRoot,
+ Workers__AiOperationsEnabled: "false",
HttpsRedirection__Enabled: "false",
CV_PDF_BROWSER_PATH: chromium.executablePath(),
},
diff --git a/job-tracker-ui/src/career-editor.test.tsx b/job-tracker-ui/src/career-editor.test.tsx
index 9e04795..3ff873f 100644
--- a/job-tracker-ui/src/career-editor.test.tsx
+++ b/job-tracker-ui/src/career-editor.test.tsx
@@ -154,7 +154,7 @@ test("a held Save locks every editor mutation, raw input and history restore unt
expect(snapshot.profile.contact.fullName).toBe("Snapshot owner");
expect(snapshot.cvText).toBe(rawText);
expect(screen.getAllByRole("textbox").filter((field) => !(field as HTMLInputElement).disabled).map((field) => field.getAttribute("aria-label") || field.id)).toEqual([]);
- for (const name of [en.profileCvAddLink, en.profileCvStructuredAddLanguage, en.profileCvStructuredAddJob, en.profileCvStructuredAddEducation, en.profileCvStructuredAddOtherSection, en.profileCvVersionRestore]) {
+ for (const name of [en.profileCvAddLink, en.profileCvStructuredAddLanguage, en.profileCvStructuredAddJob, en.profileCvStructuredAddEducation, en.profileCvStructuredAddOtherSection, en.careerRestoreVersion.replace("{version}", "3")]) {
expect(screen.getByRole("button", { name })).toBeDisabled();
}
for (const button of screen.getAllByRole("button", { name: /^(Remove|Delete custom link|Bold|Italic|Underline|Link$)/ })) expect(button).toBeDisabled();
@@ -218,7 +218,9 @@ test("a failed Save retains a scoped localized error and draft for retry through
await waitFor(() => expect(editor().queryByRole("alert")).not.toBeInTheDocument());
expect(screen.getByLabelText(nb.profileCvContactFullName)).toHaveValue("Beholdt utkast");
expect(screen.queryByText(nb.assetsUnsavedChanges)).not.toBeInTheDocument();
- expect(mockedApi.get).toHaveBeenCalledTimes(reads);
+ expect(mockedApi.get).toHaveBeenCalledTimes(reads + 1);
+ expect(readCount("/career/profile/versions")).toBe(2);
+ expect(readCount("/career/profile")).toBe(1);
expect(mockedApi.post).not.toHaveBeenCalled();
});
@@ -269,7 +271,7 @@ test("a read-only provider cannot edit canonical fields or trigger canonical wri
await waitFor(() => expect(screen.getByLabelText(en.profileCvContactFullName)).toHaveValue("Recorded owner"));
fireEvent.click(screen.getByRole("button", { name: /Version history/ }));
expect(screen.getAllByRole("textbox").filter((field) => !(field as HTMLInputElement).disabled)).toEqual([]);
- for (const name of [en.profileSaveChanges, en.profileCvVersionRestore, en.profileCvAddLink, en.profileCvStructuredAddLanguage, en.profileCvStructuredAddJob, en.profileCvStructuredAddEducation, en.profileCvStructuredAddOtherSection]) {
+ for (const name of [en.profileSaveChanges, en.careerRestoreVersion.replace("{version}", "3"), en.profileCvAddLink, en.profileCvStructuredAddLanguage, en.profileCvStructuredAddJob, en.profileCvStructuredAddEducation, en.profileCvStructuredAddOtherSection]) {
const control = screen.getByRole("button", { name });
expect(control).toBeDisabled();
control.click();
diff --git a/job-tracker-ui/src/career-history-view.test.tsx b/job-tracker-ui/src/career-history-view.test.tsx
new file mode 100644
index 0000000..b5c311c
--- /dev/null
+++ b/job-tracker-ui/src/career-history-view.test.tsx
@@ -0,0 +1,161 @@
+import React from "react";
+import "@testing-library/jest-dom";
+import { fireEvent, render, screen, within } from "@testing-library/react";
+import { I18nProvider } from "./i18n/I18nProvider";
+import { translations } from "./i18n/translations";
+import ProfileCompleteness, { CareerVersionView } from "./views/career/ProfileCompleteness";
+
+type HistoryProps = React.ComponentProps & {
+ versionsLoading?: boolean;
+ versionsError?: string | null;
+ onRetryVersions?: () => void;
+ restoreDisabled?: boolean;
+ restoreError?: string | null;
+};
+type HistoryKey = "careerHistoryLoading" | "careerHistoryLoadFailed" | "careerHistoryEmpty"
+ | "careerSaveBeforeRestore" | "careerRestoreVersion" | "careerRestoreFailed";
+const en = translations.en as typeof translations.en & Record;
+const nb = translations.nb as typeof translations.nb & Record;
+const versions: CareerVersionView[] = [
+ { version: 4, source: "manual", createdAtUtc: "2026-10-12T01:00:00Z", isCurrent: true },
+ { version: 3, source: "import", createdAtUtc: "2026-10-11T01:00:00Z", isCurrent: false },
+];
+
+function historyTitle(count: number, language: "en" | "nb" = "en") {
+ return translations[language].profileCvVersionHistory.replace("{count}", String(count));
+}
+
+function view(props: Partial = {}) {
+ const defaults: HistoryProps = {
+ completeness: null, versions, loading: false, onRestore: jest.fn(), showSummary: false,
+ };
+ return ;
+}
+
+function expand(count = 2) {
+ fireEvent.click(screen.getByRole("button", { name: historyTitle(count) }));
+}
+
+beforeEach(() => window.localStorage.removeItem("uiLanguage"));
+afterEach(() => window.localStorage.removeItem("uiLanguage"));
+
+test("the first history read announces progress without claiming an empty history", () => {
+ const restore = jest.fn();
+ render(view({ versions: [], versionsLoading: true, onRestore: restore }));
+ expect(screen.getByRole("progressbar", { name: en.careerHistoryLoading })).toBeInTheDocument();
+ expect(screen.getByRole("heading", { name: historyTitle(0), level: 2 })).toBeInTheDocument();
+ expect(screen.queryByText(en.careerHistoryEmpty)).not.toBeInTheDocument();
+ expect(screen.queryByRole("button", { name: /^Restore/ })).not.toBeInTheDocument();
+ expect(restore).not.toHaveBeenCalled();
+});
+
+test("a failed history read retains known rows and retries only through its history owner", () => {
+ const retry = jest.fn();
+ const restore = jest.fn();
+ const rendered = render(view({ versionsError: "History service unavailable", onRetryVersions: retry, onRestore: restore }));
+ expand();
+ const failure = screen.getByRole("alert");
+ expect(failure).toHaveTextContent(en.careerHistoryLoadFailed);
+ expect(failure).toHaveTextContent("History service unavailable");
+ expect(screen.getByText(/^v4 · manual ·/)).toBeVisible();
+ expect(screen.getByText(/^v3 · import ·/)).toBeVisible();
+ const retryControl = within(failure).getByRole("button", { name: en.retry });
+ retryControl.focus(); fireEvent.click(retryControl);
+ expect(screen.getByRole("group", { name: historyTitle(2) })).toHaveFocus();
+ expect(retry).toHaveBeenCalledTimes(1);
+ expect(restore).not.toHaveBeenCalled();
+
+ rendered.rerender(view({ versionsLoading: true, versionsError: "History service unavailable", onRetryVersions: retry, onRestore: restore }));
+ expect(screen.getByRole("alert")).toHaveTextContent("History service unavailable");
+ expect(screen.getByRole("button", { name: en.retry })).toBeDisabled();
+ expect(screen.getByRole("progressbar", { name: en.careerHistoryLoading })).toBeInTheDocument();
+ expect(screen.getByText(/^v3 · import ·/)).toBeVisible();
+ expect(retry).toHaveBeenCalledTimes(1);
+});
+
+test("a settled zero-version history is a named empty section rather than a hidden capability", () => {
+ render(view({ versions: [] }));
+ const history = screen.getByRole("region", { name: historyTitle(0) });
+ expect(within(history).getByRole("heading", { name: historyTitle(0), level: 2 })).toBeInTheDocument();
+ expect(within(history).getByText(en.careerHistoryEmpty)).toBeVisible();
+ expect(within(history).queryByRole("progressbar")).not.toBeInTheDocument();
+ expect(within(history).queryByRole("button", { name: /^Restore/ })).not.toBeInTheDocument();
+});
+
+test("one current version remains visible in Bokmål without offering a restore of the current source", () => {
+ window.localStorage.setItem("uiLanguage", "nb");
+ render(view({ versions: [versions[0]] }));
+ const row = screen.getByText(/^v4 · manual ·/);
+ expect(row).toBeVisible();
+ expect(row).toHaveTextContent(nb.profileCvVersionCurrent);
+ expect(screen.getByRole("region", { name: historyTitle(1, "nb") })).toBeInTheDocument();
+ expect(screen.queryByRole("button", { name: /^Gjenopprett/ })).not.toBeInTheDocument();
+});
+
+test("the collapsed history keeps twelve rows and contextual restore actions pass the exact selected version", () => {
+ const restore = jest.fn();
+ const many = Array.from({ length: 13 }, (_, index) => ({
+ version: 13 - index, source: "manual", createdAtUtc: "2026-10-12T01:00:00Z", isCurrent: index === 0,
+ }));
+ render(view({ versions: many, onRestore: restore }));
+ const disclosure = screen.getByRole("button", { name: historyTitle(13) });
+ expect(disclosure).toHaveAttribute("aria-expanded", "false");
+ expect(screen.queryByRole("button", { name: /^Restore v/ })).not.toBeInTheDocument();
+ fireEvent.click(disclosure);
+ expect(disclosure).toHaveAttribute("aria-expanded", "true");
+ expect(screen.getAllByText(/^v\d+ · manual ·/)).toHaveLength(12);
+ expect(screen.queryByText(/^v1 · manual ·/)).not.toBeInTheDocument();
+ expect(screen.getAllByRole("button", { name: /^Restore v/ })).toHaveLength(11);
+ expect(screen.queryByRole("button", { name: "Restore v13" })).not.toBeInTheDocument();
+ fireEvent.click(screen.getByRole("button", { name: "Restore v12" }));
+ expect(restore).toHaveBeenCalledTimes(1);
+ expect(restore).toHaveBeenCalledWith(12);
+});
+
+test("dirty source state explains the restore guard and re-enables the same version after the parent clears it", () => {
+ const restore = jest.fn();
+ const rendered = render(view({ restoreDisabled: true, onRestore: restore }));
+ expand();
+ const guarded = screen.getByRole("button", { name: /^Restore/ });
+ expect(guarded).toBeDisabled();
+ expect(screen.getByText(en.careerSaveBeforeRestore)).toBeVisible();
+ fireEvent.click(guarded);
+ expect(restore).not.toHaveBeenCalled();
+
+ rendered.rerender(view({ restoreDisabled: false, onRestore: restore }));
+ expect(screen.queryByText(en.careerSaveBeforeRestore)).not.toBeInTheDocument();
+ const available = screen.getByRole("button", { name: "Restore v3" });
+ expect(available).toBeEnabled();
+ fireEvent.click(available);
+ expect(restore).toHaveBeenCalledWith(3);
+ expect(restore).toHaveBeenCalledTimes(1);
+});
+
+test("the existing overall loading guard still blocks history restores", () => {
+ const restore = jest.fn();
+ render(view({ loading: true, onRestore: restore }));
+ expand();
+ const action = screen.getByRole("button", { name: /^Restore/ });
+ expect(action).toBeDisabled();
+ fireEvent.click(action);
+ expect(restore).not.toHaveBeenCalled();
+});
+
+test("restore failure stays visible with the known history until the parent clears it and retry is explicit", () => {
+ const restore = jest.fn();
+ const rendered = render(view({ restoreError: "Restore service unavailable", onRestore: restore }));
+ expand();
+ expect(screen.getByRole("alert")).toHaveTextContent(en.careerRestoreFailed);
+ expect(screen.getByRole("alert")).toHaveTextContent("Restore service unavailable");
+ expect(screen.getByText(/^v3 · import ·/)).toBeVisible();
+ expect(restore).not.toHaveBeenCalled();
+ fireEvent.click(screen.getByRole("button", { name: "Restore v3" }));
+ expect(restore).toHaveBeenCalledTimes(1);
+ expect(restore).toHaveBeenCalledWith(3);
+ expect(screen.getByRole("alert")).toBeInTheDocument();
+
+ rendered.rerender(view({ restoreError: null, onRestore: restore }));
+ expect(screen.queryByRole("alert")).not.toBeInTheDocument();
+ expect(screen.getByText(/^v4 · manual ·/)).toBeVisible();
+ expect(restore).toHaveBeenCalledTimes(1);
+});
diff --git a/job-tracker-ui/src/career-import-review.test.tsx b/job-tracker-ui/src/career-import-review.test.tsx
new file mode 100644
index 0000000..a32eb27
--- /dev/null
+++ b/job-tracker-ui/src/career-import-review.test.tsx
@@ -0,0 +1,273 @@
+import React from "react";
+import "@testing-library/jest-dom";
+import { act, fireEvent, render, screen, waitFor, within } from "@testing-library/react";
+import { api } from "./api";
+import { I18nProvider } from "./i18n/I18nProvider";
+import { translations } from "./i18n/translations";
+import { emptyStructuredCv } from "./profileCv";
+import { ToastProvider } from "./toast";
+import CareerProfilePage from "./views/CareerProfilePage";
+
+jest.mock("./api", () => ({
+ getApiErrorMessage: jest.requireActual("./api").getApiErrorMessage,
+ api: { get: jest.fn(), post: jest.fn(), put: jest.fn(), patch: jest.fn(), delete: jest.fn() },
+}));
+jest.mock("./components/CropImageDialog", () => () => null);
+
+const mockedApi = api as jest.Mocked;
+const en = translations.en;
+const nb = translations.nb;
+const profile = { ...emptyStructuredCv(), contact: { fullName: "Recorded owner" }, languages: [{ name: "Norwegian", level: "A2" }] };
+const source = { data: { profile, cvText: "Retained canonical raw", completeness: { percent: 50, missing: [], sections: [] } } };
+const versions = [
+ { version: 2, source: "manual", createdAtUtc: "2026-10-12T01:00:00Z", isCurrent: true },
+ { version: 1, source: "manual", createdAtUtc: "2026-10-11T01:00:00Z", isCurrent: false },
+];
+const run = { id: 41, trigger: "upload", status: "pending_review", startedAtUtc: "2026-10-12T01:00:00Z", parserVersion: "offline-fixture", normalizerVersion: "offline-fixture", llmPromptVersion: "offline-fixture" };
+const diff = {
+ totalAdded: 1, totalUpdated: 1, totalLowConfidence: 1, hasChanges: true,
+ categories: [{ category: "Languages", unchangedCount: 0, lowConfidenceCount: 1,
+ added: [{ id: "Languages|french", label: "French", confidence: "Low", fieldChanges: [] }],
+ updated: [{ id: "Languages|norwegian", label: "Norwegian", confidence: "Medium", fieldChanges: [{ field: "Level", oldValue: "A2", newValue: "B1" }] }],
+ }],
+};
+let runs: unknown[];
+
+function deferred() {
+ let resolve!: (value: T) => void;
+ let reject!: (reason: unknown) => void;
+ const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
+ return { promise, resolve, reject };
+}
+function readCount(url: string) { return mockedApi.get.mock.calls.filter(([requested]) => requested === url).length; }
+function renderPage() { return render(); }
+async function ready() { await waitFor(() => expect(screen.getByLabelText(en.profileCvContactFullName)).toBeEnabled()); }
+function navigate(name: string) { fireEvent.click(screen.getByRole("tab", { name })); }
+function importView() { return within(document.getElementById("career-cv-import")!); }
+function historyView() { return within(screen.getByRole("region", { name: /Version history/ })); }
+async function failure(view: ReturnType, message: string) {
+ await waitFor(() => expect(view.queryAllByRole("alert").filter((alert: HTMLElement) => alert.textContent?.includes(message))).toHaveLength(1));
+ return view.getAllByRole("alert").find((alert: HTMLElement) => alert.textContent?.includes(message))!;
+}
+async function importReady() {
+ await ready();
+ await waitFor(() => expect(screen.getByRole("button", { name: en.profileCvApplyChanges })).toBeEnabled());
+}
+function chooseLow() { return screen.getByRole("checkbox", { name: /French/ }); }
+function editDraft() {
+ navigate(en.careerWorkspaceProfileTab);
+ fireEvent.change(screen.getByLabelText(en.profileCvContactFullName), { target: { value: "Unsaved owner" } });
+}
+
+beforeEach(() => {
+ jest.resetAllMocks();
+ window.localStorage.clear();
+ window.history.replaceState({}, "", "/career?section=import");
+ runs = [run];
+ mockedApi.get.mockImplementation((url: string) => {
+ if (url === "/career/profile") return Promise.resolve(source as any);
+ if (url === "/auth/me") return Promise.resolve({ data: { id: "owner", provider: "local", email: "owner@example.test" } } as any);
+ if (url === "/career/profile/versions") return Promise.resolve({ data: versions } as any);
+ if (url === "/profile-cv/runs") return Promise.resolve({ data: runs } as any);
+ if (url.endsWith("/diff")) return Promise.resolve({ data: { runId: Number(url.split("/")[3]), status: "pending_review", diff } } as any);
+ return Promise.reject(new Error(`Unexpected GET ${url}`));
+ });
+ mockedApi.put.mockResolvedValue(source as any);
+ mockedApi.post.mockResolvedValue(source as any);
+});
+
+test("failed history reads have a scoped Retry that preserves unsaved source fields", async () => {
+ const read = mockedApi.get.getMockImplementation()!;
+ let failHistory = true;
+ mockedApi.get.mockImplementation((url: string) => url === "/career/profile/versions" && failHistory ? Promise.reject(new Error("History unavailable")) : read(url));
+ renderPage(); await importReady(); editDraft();
+ const alert = await failure(historyView(), en.careerHistoryLoadFailed);
+ expect(alert).toHaveTextContent(en.careerHistoryLoadFailed);
+ const reads = readCount("/career/profile");
+ failHistory = false;
+ fireEvent.click(within(alert).getByRole("button", { name: en.retry }));
+ await waitFor(() => expect(readCount("/career/profile/versions")).toBe(2));
+ expect(screen.getByLabelText(en.profileCvContactFullName)).toHaveValue("Unsaved owner");
+ expect(readCount("/career/profile")).toBe(reads);
+ expect(mockedApi.put).not.toHaveBeenCalled(); expect(mockedApi.post).not.toHaveBeenCalled();
+});
+
+test("a dirty canonical profile cannot be replaced through history restore", async () => {
+ renderPage(); await importReady(); editDraft();
+ fireEvent.click(screen.getByRole("button", { name: /Version history/ }));
+ expect(screen.getByRole("button", { name: "Restore v1" })).toBeDisabled();
+ expect(screen.getByText(en.careerSaveBeforeRestore)).toBeVisible();
+ fireEvent.click(screen.getByRole("button", { name: "Restore v1" }));
+ expect(mockedApi.post).not.toHaveBeenCalled();
+ expect(screen.getByLabelText(en.profileCvContactFullName)).toHaveValue("Unsaved owner");
+});
+
+test("each failed comparison can retry its own run without refetching canonical data or losing another comparison", async () => {
+ runs = [run, { ...run, id: 42 }];
+ const read = mockedApi.get.getMockImplementation()!;
+ let fail = true;
+ mockedApi.get.mockImplementation((url: string) => url === "/profile-cv/runs/41/diff" && fail ? Promise.reject(new Error("Comparison unavailable")) : read(url));
+ renderPage(); await ready();
+ const error = await failure(importView(), en.careerImportComparisonFailed);
+ expect(error).toHaveTextContent(en.careerImportComparisonFailed);
+ expect(screen.getAllByRole("button", { name: en.profileCvApplyChanges }).filter((b) => !(b as HTMLButtonElement).disabled)).toHaveLength(1);
+ fail = false;
+ const retry = within(error).getByRole("button", { name: en.retry });
+ retry.focus(); fireEvent.click(retry);
+ expect(screen.getByRole("article", { name: "File import 41" })).toHaveFocus();
+ await waitFor(() => expect(screen.getAllByRole("button", { name: en.profileCvApplyChanges }).every((b) => !(b as HTMLButtonElement).disabled)).toBe(true));
+ expect(readCount("/profile-cv/runs/41/diff")).toBe(2); expect(readCount("/profile-cv/runs/42/diff")).toBe(1);
+ expect(readCount("/career/profile")).toBe(1); expect(mockedApi.post).not.toHaveBeenCalled();
+});
+
+test("review shows actual current and imported values and discloses fields outside the comparison", async () => {
+ renderPage(); await importReady();
+ expect(screen.getByText(en.careerImportCurrentValue.replace("{value}", "A2"))).toBeVisible();
+ expect(screen.getByText(en.careerImportIncomingValue.replace("{value}", "B1"))).toBeVisible();
+ expect(screen.getByText(en.careerImportComparisonScope)).toBeVisible();
+ expect(screen.getByRole("heading", { name: en.profileCvExtractionHistory, level: 2 })).toBeVisible();
+ expect(mockedApi.post).not.toHaveBeenCalled();
+});
+
+test("selecting then deselecting low-confidence data sends the explicit empty selection", async () => {
+ renderPage(); await importReady();
+ expect(chooseLow()).not.toBeChecked(); fireEvent.click(chooseLow()); expect(chooseLow()).toBeChecked();
+ fireEvent.click(chooseLow()); expect(chooseLow()).not.toBeChecked();
+ runs = [{ ...run, status: "applied" }];
+ fireEvent.click(screen.getByRole("button", { name: en.profileCvApplyChanges }));
+ await waitFor(() => expect(mockedApi.post).toHaveBeenCalledWith("/profile-cv/runs/41/accept", { acceptedLowConfidenceIds: [] }));
+ expect(mockedApi.post).toHaveBeenCalledTimes(1);
+});
+
+test("held acceptance locks review choices and all canonical editors and prevents duplicate or overlapping writes", async () => {
+ const held = deferred(); mockedApi.post.mockReturnValue(held.promise);
+ renderPage(); await importReady(); fireEvent.click(chooseLow());
+ const apply = screen.getByRole("button", { name: en.profileCvApplyChanges }); apply.focus(); fireEvent.click(apply); fireEvent.click(apply);
+ expect(screen.getByRole("article", { name: "File import 41" })).toHaveFocus();
+ expect(mockedApi.post).toHaveBeenCalledTimes(1);
+ expect(mockedApi.post).toHaveBeenCalledWith("/profile-cv/runs/41/accept", { acceptedLowConfidenceIds: ["Languages|french"] });
+ expect(chooseLow()).toBeDisabled(); expect(screen.getByRole("button", { name: en.careerImportApplying })).toBeDisabled();
+ navigate(en.careerWorkspaceProfileTab);
+ expect(screen.getByLabelText(en.profileCvContactFullName)).toBeDisabled();
+ expect(screen.getByRole("button", { name: en.profileSaveChanges })).toBeDisabled();
+ fireEvent.click(screen.getByRole("button", { name: /Version history/ }));
+ expect(screen.getByRole("button", { name: "Restore v1" })).toBeDisabled();
+ fireEvent.click(screen.getByRole("button", { name: en.profileSaveChanges }));
+ expect(mockedApi.put).not.toHaveBeenCalled();
+ runs = [{ ...run, status: "applied" }];
+ await act(async () => held.resolve(source));
+ await waitFor(() => expect(screen.getByLabelText(en.profileCvContactFullName)).toBeEnabled());
+ expect(mockedApi.post).toHaveBeenCalledTimes(1);
+});
+
+test("failed acceptance keeps the chosen stable IDs and shows durable translated recovery without automatically resending", async () => {
+ mockedApi.post.mockRejectedValueOnce({ isAxiosError: true, message: "Request failed with status code 500", response: { status: 500, data: {} } });
+ renderPage(); await importReady(); fireEvent.click(chooseLow());
+ fireEvent.click(screen.getByRole("button", { name: en.profileCvApplyChanges }));
+ const error = await failure(importView(), en.profileCvApplyChangesFailed);
+ expect(error).toHaveTextContent(en.profileCvApplyChangesFailed);
+ expect(chooseLow()).toBeChecked(); expect(chooseLow()).toBeEnabled();
+ await act(async () => window.dispatchEvent(new StorageEvent("storage", { key: "uiLanguage", newValue: "nb" })));
+ await failure(importView(), nb.profileCvApplyChangesFailed);
+ expect(mockedApi.post).toHaveBeenCalledTimes(1); expect(readCount("/career/profile")).toBe(1);
+ runs = [{ ...run, status: "applied" }];
+ fireEvent.click(screen.getByRole("button", { name: nb.profileCvApplyChanges }));
+ await waitFor(() => expect(mockedApi.post).toHaveBeenCalledTimes(2));
+ expect(mockedApi.post.mock.calls[1]).toEqual(mockedApi.post.mock.calls[0]);
+});
+
+test("discarding an import preserves unsaved structured and raw drafts and does not reload the canonical profile", async () => {
+ renderPage(); await importReady(); editDraft(); navigate(en.careerWorkspaceImportTab);
+ fireEvent.click(screen.getByRole("button", { name: new RegExp(en.profileCvRawPanelTitle) }));
+ fireEvent.change(screen.getByLabelText(en.profileCvTextLabel), { target: { value: "Unsaved raw draft" } });
+ expect(screen.getByRole("button", { name: en.profileCvApplyChanges })).toBeDisabled();
+ runs = [{ ...run, status: "discarded" }];
+ fireEvent.click(screen.getByRole("button", { name: en.profileCvDiscard }));
+ await waitFor(() => expect(mockedApi.post).toHaveBeenCalledWith("/profile-cv/runs/41/discard"));
+ await waitFor(() => expect(readCount("/profile-cv/runs")).toBe(2));
+ expect(screen.getByLabelText(en.profileCvTextLabel)).toHaveValue("Unsaved raw draft");
+ navigate(en.careerWorkspaceProfileTab); expect(screen.getByLabelText(en.profileCvContactFullName)).toHaveValue("Unsaved owner");
+ expect(readCount("/career/profile")).toBe(1); expect(mockedApi.put).not.toHaveBeenCalled();
+});
+
+test("saving canonical changes refreshes history and comparisons and clears choices made against the earlier source", async () => {
+ renderPage(); await importReady(); fireEvent.click(chooseLow()); editDraft();
+ fireEvent.click(screen.getByRole("button", { name: en.profileSaveChanges }));
+ await waitFor(() => expect(mockedApi.put).toHaveBeenCalledTimes(1));
+ await waitFor(() => expect(readCount("/profile-cv/runs/41/diff")).toBe(2));
+ expect(readCount("/career/profile/versions")).toBe(2); expect(readCount("/career/profile")).toBe(1);
+ navigate(en.careerWorkspaceImportTab); expect(chooseLow()).not.toBeChecked(); expect(mockedApi.post).not.toHaveBeenCalled();
+});
+
+test("a failed restore keeps the original source and known history with an explicit retry", async () => {
+ mockedApi.post.mockRejectedValueOnce(new Error("Restore unavailable"));
+ renderPage(); await importReady(); navigate(en.careerWorkspaceProfileTab);
+ fireEvent.click(screen.getByRole("button", { name: /Version history/ }));
+ fireEvent.click(screen.getByRole("button", { name: "Restore v1" }));
+ const error = await failure(historyView(), en.careerRestoreFailed);
+ expect(error).toHaveTextContent(en.careerRestoreFailed); expect(error).toHaveTextContent("Restore unavailable");
+ expect(screen.getByLabelText(en.profileCvContactFullName)).toHaveValue("Recorded owner");
+ expect(readCount("/career/profile")).toBe(1); expect(mockedApi.post).toHaveBeenCalledTimes(1);
+ fireEvent.click(screen.getByRole("button", { name: "Restore v1" }));
+ await waitFor(() => expect(mockedApi.post).toHaveBeenCalledTimes(2));
+ expect(mockedApi.post.mock.calls[1]).toEqual(mockedApi.post.mock.calls[0]);
+});
+
+test("an operation cancellation is guarded while pending and leaves an unsaved source draft intact", async () => {
+ runs = [{ ...run, status: "queued", operation: { id: "op-81", status: "queued", canCancel: true, canRetry: false } }];
+ const held = deferred(); mockedApi.post.mockReturnValue(held.promise);
+ renderPage(); await ready(); editDraft(); navigate(en.careerWorkspaceImportTab);
+ const cancel = screen.getByRole("button", { name: en.profileCvCancelProcessing }); cancel.focus(); fireEvent.click(cancel); fireEvent.click(cancel);
+ expect(screen.getByRole("article", { name: "File import 41" })).toHaveFocus();
+ expect(cancel).toBeDisabled(); expect(mockedApi.post).toHaveBeenCalledTimes(1);
+ expect(mockedApi.post).toHaveBeenCalledWith("/operations/op-81/cancel");
+ await act(async () => held.resolve({ data: {} }));
+ navigate(en.careerWorkspaceProfileTab); expect(screen.getByLabelText(en.profileCvContactFullName)).toHaveValue("Unsaved owner");
+ expect(readCount("/career/profile")).toBe(1); expect(mockedApi.put).not.toHaveBeenCalled();
+});
+
+test("a failed operation retry stays scoped and only resends the same operation on explicit user retry", async () => {
+ runs = [{ ...run, status: "failed", operation: { id: "op-81", status: "failed", canCancel: false, canRetry: true } }];
+ mockedApi.post.mockRejectedValueOnce(new Error("Retry unavailable"));
+ renderPage(); await ready(); fireEvent.click(screen.getByRole("button", { name: en.profileCvRetryProcessing }));
+ const error = await failure(importView(), en.profileCvRetryFailed);
+ expect(error).toHaveTextContent(en.profileCvRetryFailed); expect(error).toHaveTextContent("Retry unavailable");
+ expect(mockedApi.post).toHaveBeenCalledTimes(1); expect(readCount("/career/profile")).toBe(1);
+ fireEvent.click(screen.getByRole("button", { name: en.profileCvRetryProcessing }));
+ await waitFor(() => expect(mockedApi.post).toHaveBeenCalledTimes(2));
+ expect(mockedApi.post.mock.calls).toEqual([["/operations/op-81/retry"], ["/operations/op-81/retry"]]);
+});
+
+test("Bokmål localizes comparison labels while preserving imported facts named like UI labels or object properties", async () => {
+ localStorage.setItem("uiLanguage", "nb");
+ const read = mockedApi.get.getMockImplementation()!;
+ mockedApi.get.mockImplementation((url: string) => url.endsWith("/diff") ? Promise.resolve({ data: { runId: 41, diff: {
+ totalAdded: 2, totalUpdated: 0, totalLowConfidence: 1, hasChanges: true, categories: [
+ { category: "Projects", added: [{ id: "Projects|references", label: "References", confidence: "Medium", fieldChanges: [] }], updated: [], unchangedCount: 0, lowConfidenceCount: 0 },
+ { category: "Languages", added: [{ id: "Languages|constructor", label: "constructor", confidence: "Low", fieldChanges: [] }], updated: [], unchangedCount: 0, lowConfidenceCount: 1 },
+ ],
+ } } } as any) : read(url));
+ renderPage();
+ await waitFor(() => expect(screen.getByRole("button", { name: nb.profileCvApplyChanges })).toBeEnabled());
+ expect(screen.getByText(`References · ${nb.careerImportAdded}`)).toBeVisible();
+ expect(screen.getByText(`constructor · ${nb.careerImportAdded}`)).toBeVisible();
+ expect(screen.getByRole("checkbox", { name: nb.profileCvIncludeLowConfidence.replace("{category}", nb.cvSectionLanguages).replace("{label}", "constructor") })).toBeEnabled();
+ expect(screen.getByRole("heading", { name: nb.cvSectionProjects })).toBeVisible();
+ expect(mockedApi.post).not.toHaveBeenCalled();
+});
+
+test("the known low-confidence contact placeholder is localized", async () => {
+ localStorage.setItem("uiLanguage", "nb");
+ const read = mockedApi.get.getMockImplementation()!;
+ mockedApi.get.mockImplementation((url: string) => url.endsWith("/diff") ? Promise.resolve({ data: { runId: 41, diff: {
+ totalAdded: 0, totalUpdated: 1, totalLowConfidence: 1, hasChanges: true, categories: [
+ { category: "Contact", added: [], updated: [{ id: "Contact", label: "Contact details", confidence: "Low", fieldChanges: [{ field: "Email", oldValue: "current@example.test", newValue: "pending@example.test" }] }], unchangedCount: 0, lowConfidenceCount: 1 },
+ ],
+ } } } as any) : read(url));
+ renderPage();
+ await waitFor(() => expect(screen.getByRole("button", { name: nb.profileCvApplyChanges })).toBeEnabled());
+ expect(screen.getByRole("checkbox", { name: nb.profileCvIncludeLowConfidence.replace("{category}", nb.careerProfileContactSection).replace("{label}", nb.careerImportContactDetails) })).toBeEnabled();
+ expect(screen.getByText(`${nb.careerImportContactDetails} · ${nb.careerImportUpdated}`)).toBeVisible();
+ expect(screen.getByText(nb.careerImportIncomingValue.replace("{value}", "pending@example.test"))).toBeVisible();
+ expect(mockedApi.post).not.toHaveBeenCalled();
+});
diff --git a/job-tracker-ui/src/i18n/translations.ts b/job-tracker-ui/src/i18n/translations.ts
index b99af8e..43749d5 100644
--- a/job-tracker-ui/src/i18n/translations.ts
+++ b/job-tracker-ui/src/i18n/translations.ts
@@ -1290,6 +1290,43 @@ export const translations = {
careerProfileRemoveEducation: "Remove education {index}",
careerProfileRemoveLanguage: "Remove language {index}",
careerProfileRemoveOtherSection: "Remove custom section {index}",
+ careerHistoryLoading: "Loading career history",
+ careerHistoryLoadFailed: "Failed to load career history.",
+ careerHistoryEmpty: "No saved career versions yet.",
+ careerSaveBeforeRestore: "Save your career changes before restoring a version.",
+ careerRestoreVersion: "Restore v{version}",
+ careerRestoreFailed: "Failed to restore the career version.",
+ careerImportComparison: "Compared changes",
+ careerImportComparisonLoading: "Loading imported changes",
+ careerImportComparisonFailed: "Failed to load imported changes.",
+ careerImportComparisonScope: "This comparison shows field summaries. Acceptance also merges imported custom sections and may replace parsed source sections and review metadata. These are not compared here.",
+ careerImportRawSourceHelp: "Source text in this editor belongs to your Career Profile. Pending import text is not shown here.",
+ careerImportNoComparedChanges: "No changes in the compared fields.",
+ careerImportAdded: "Added",
+ careerImportUpdated: "Updated",
+ careerImportCurrentValue: "Current: {value}",
+ careerImportIncomingValue: "Imported: {value}",
+ careerImportEmptyValue: "Not set",
+ careerImportApplying: "Applying changes",
+ careerImportDiscarding: "Discarding import",
+ careerImportParseWarning: "Parsing saves directly to your Career Profile. Save any edits first; this action is not an import preview.",
+ careerImportQueued: "Queued",
+ careerImportProcessing: "Processing locally",
+ careerImportWaitingRetry: "Waiting to retry",
+ careerImportWaitingFallback: "Waiting for approved fallback",
+ careerImportPendingReview: "Ready to review",
+ careerImportApplied: "Applied",
+ careerImportDiscarded: "Discarded",
+ careerImportFailed: "Failed",
+ careerImportCancelled: "Cancelled",
+ careerImportUpload: "File import",
+ careerImportRebuild: "Rebuild",
+ careerImportImprove: "Text improvement",
+ careerImportReprocess: "Reprocessing",
+ careerImportDates: "Dates",
+ careerImportDetails: "Details",
+ careerImportIssuer: "Issuer",
+ careerImportContactDetails: "Contact details",
profileCvTextLabel: "Profile CV / master resume text",
profileCvTextHelp: "Keep this updated and specific. Include recent roles, tools, achievements, measurable outcomes, and the work you want to be hired for next. If extraction misses something, edit it here manually.",
profileCvStructuredDefaultHint: "Career information is the main view. Open the original import to check what was read from your file.",
@@ -3885,6 +3922,43 @@ export const translations = {
careerProfileRemoveEducation: "Fjern utdanning {index}",
careerProfileRemoveLanguage: "Fjern språk {index}",
careerProfileRemoveOtherSection: "Fjern egendefinert seksjon {index}",
+ careerHistoryLoading: "Laster karrierehistorikk",
+ careerHistoryLoadFailed: "Kunne ikke laste karrierehistorikken.",
+ careerHistoryEmpty: "Ingen lagrede versjoner av karriereprofilen ennå.",
+ careerSaveBeforeRestore: "Lagre karriereendringene før du gjenoppretter en versjon.",
+ careerRestoreVersion: "Gjenopprett v{version}",
+ careerRestoreFailed: "Kunne ikke gjenopprette versjonen av karriereprofilen.",
+ careerImportComparison: "Sammenlignede endringer",
+ careerImportComparisonLoading: "Laster importerte endringer",
+ careerImportComparisonFailed: "Kunne ikke laste importerte endringer.",
+ careerImportComparisonScope: "Sammenligningen viser feltoppsummeringer. Godkjenning fletter også inn importerte egendefinerte seksjoner og kan erstatte tolkede kildeseksjoner og metadata for gjennomgang. Disse sammenlignes ikke her.",
+ careerImportRawSourceHelp: "Kildeteksten i denne editoren tilhører karriereprofilen. Teksten fra importer som venter på gjennomgang, vises ikke her.",
+ careerImportNoComparedChanges: "Ingen endringer i feltene som er sammenlignet.",
+ careerImportAdded: "Lagt til",
+ careerImportUpdated: "Oppdatert",
+ careerImportCurrentValue: "Nåværende: {value}",
+ careerImportIncomingValue: "Importert: {value}",
+ careerImportEmptyValue: "Ikke angitt",
+ careerImportApplying: "Tar i bruk endringer",
+ careerImportDiscarding: "Forkaster import",
+ careerImportParseWarning: "Tolking lagrer direkte i karriereprofilen. Lagre eventuelle endringer først; dette er ikke en forhåndsvisning av importen.",
+ careerImportQueued: "I kø",
+ careerImportProcessing: "Behandles lokalt",
+ careerImportWaitingRetry: "Venter på nytt forsøk",
+ careerImportWaitingFallback: "Venter på godkjent alternativ",
+ careerImportPendingReview: "Klar til gjennomgang",
+ careerImportApplied: "Tatt i bruk",
+ careerImportDiscarded: "Forkastet",
+ careerImportFailed: "Mislyktes",
+ careerImportCancelled: "Avbrutt",
+ careerImportUpload: "Filimport",
+ careerImportRebuild: "Gjenoppbygging",
+ careerImportImprove: "Tekstforbedring",
+ careerImportReprocess: "Ny behandling",
+ careerImportDates: "Datoer",
+ careerImportDetails: "Detaljer",
+ careerImportIssuer: "Utsteder",
+ careerImportContactDetails: "Kontaktopplysninger",
profileCvTextLabel: "Profil-CV / hovedtekst for CV",
profileCvTextHelp: "Hold denne oppdatert og konkret. Ta med nylige roller, verktøy, prestasjoner, målbare resultater og arbeidet du vil bli ansatt for neste gang. Hvis tekstuttrekket mangler noe, kan du redigere manuelt her.",
profileCvStructuredDefaultHint: "Karriereprofilen er hovedvisningen. Åpne originalimporten når du vil kontrollere det som ble lest fra filen din.",
diff --git a/job-tracker-ui/src/profile-page.test.tsx b/job-tracker-ui/src/profile-page.test.tsx
index 0a042de..bd62bf2 100644
--- a/job-tracker-ui/src/profile-page.test.tsx
+++ b/job-tracker-ui/src/profile-page.test.tsx
@@ -493,7 +493,7 @@ test('profile page shows durable CV operation state and retries a failed run', a
}];
renderPage('import');
- expect(await screen.findByText('failed')).toBeInTheDocument();
+ expect(await screen.findByText('Failed')).toBeInTheDocument();
fireEvent.click(screen.getByRole('button', { name: /retry processing/i }));
await waitFor(() => {
diff --git a/job-tracker-ui/src/views/CareerProfilePage.tsx b/job-tracker-ui/src/views/CareerProfilePage.tsx
index 8f47101..abb2760 100644
--- a/job-tracker-ui/src/views/CareerProfilePage.tsx
+++ b/job-tracker-ui/src/views/CareerProfilePage.tsx
@@ -26,6 +26,7 @@ import {
import { useToast } from "../toast";
import { useI18n } from "../i18n/I18nProvider";
import { useAccountPlan } from "../accountPlan";
+import type { TranslationKey } from "../i18n/translations";
import ProFeatureNotice from "../components/ProFeatureNotice";
import { PageSection } from "../layout/PageLayout";
import type { UserOperation } from "../types";
@@ -52,6 +53,7 @@ type ExtractionRun = {
operation?: UserOperation | null;
};
+type CvImportChange = { id: string; label: string; confidence: string; fieldChanges?: Array<{ field: string; oldValue?: string | null; newValue?: string | null }> };
type CvImportDiff = {
totalAdded: number;
totalUpdated: number;
@@ -59,8 +61,8 @@ type CvImportDiff = {
hasChanges: boolean;
categories: Array<{
category: string;
- added: Array<{ id: string; label: string; confidence: string }>;
- updated: Array<{ id: string; label: string; confidence: string }>;
+ added: CvImportChange[];
+ updated: CvImportChange[];
unchangedCount: number;
lowConfidenceCount: number;
}>;
@@ -92,6 +94,21 @@ function cvRunStatus(run: ExtractionRun) {
}
}
+const importLabelKeys: Record = {
+ Contact: "careerProfileContactSection", Summary: "profileCvStructuredSummary", "Professional summary": "profileCvStructuredSummary",
+ Experience: "cvSectionExperience", Education: "cvSectionEducation", Projects: "cvSectionProjects", Certifications: "cvSectionCertifications",
+ Languages: "cvSectionLanguages", Skills: "cvSectionSkills", Interests: "cvSectionInterests", Awards: "cvSectionAwards",
+ Publications: "cvSectionPublications", Organisations: "cvSectionOrganisations", References: "cvSectionReferences",
+ "Full name": "profileCvContactFullName", Headline: "profileCvContactHeadline", Email: "profileCvContactEmail", Phone: "profileCvContactPhone",
+ Location: "profileCvContactLocation", Website: "profileCvContactWebsite", LinkedIn: "profileCvContactLinkedIn", Level: "profileCvLanguageLevel",
+ Dates: "careerImportDates", Date: "careerImportDates", Bullets: "careerImportDetails", Details: "careerImportDetails", Issuer: "careerImportIssuer",
+ queued: "careerImportQueued", running: "careerImportProcessing", "processing locally": "careerImportProcessing",
+ "waiting to retry": "careerImportWaitingRetry", "waiting for approved fallback": "careerImportWaitingFallback",
+ "cancellation requested": "operationsCancellationRequested", pending_review: "careerImportPendingReview", applied: "careerImportApplied",
+ discarded: "careerImportDiscarded", failed: "careerImportFailed", cancelled: "careerImportCancelled",
+ upload: "careerImportUpload", rebuild: "careerImportRebuild", improve: "careerImportImprove", reprocess: "careerImportReprocess",
+};
+
type MeResponse = {
provider?: "local" | "google" | "external";
id?: string;
@@ -173,6 +190,10 @@ export default function CareerProfilePage() {
const [profileDirty, setProfileDirty] = useState(false);
const [completeness, setCompleteness] = useState(null);
const [versions, setVersions] = useState([]);
+ const [versionsLoading, setVersionsLoading] = useState(true);
+ const [versionsError, setVersionsError] = useState(null);
+ const versionsReadId = useRef(0);
+ const [restoreError, setRestoreError] = useState(null);
// The raw import/section parser remains available as an advanced recovery tool.
const [showAdvancedCvTools, setShowAdvancedCvTools] = useState(false);
const [workspaceSection, setWorkspaceSection] = useState(initialWorkspaceSection);
@@ -189,41 +210,87 @@ export default function CareerProfilePage() {
}, []);
const loadVersions = useCallback(async () => {
+ const readId = ++versionsReadId.current;
+ setVersionsLoading(true);
try {
const r = await api.get("/career/profile/versions");
- setVersions(r.data ?? []);
- } catch {
- setVersions([]);
+ if (readId === versionsReadId.current) {
+ setVersions(r.data ?? []);
+ setVersionsError(null);
+ }
+ } catch (error) {
+ if (readId === versionsReadId.current) setVersionsError(getApiErrorMessage(error, ""));
+ } finally {
+ if (readId === versionsReadId.current) setVersionsLoading(false);
}
}, []);
const restoreVersion = useCallback(async (version: number) => {
- if (profileMutationPending.current || me?.provider !== "local" || loading) return;
+ if (profileMutationPending.current || me?.provider !== "local" || loading || profileDirty) return;
profileMutationPending.current = true;
setLoading(true);
+ setRestoreError(null);
try {
const r = await api.post(`/career/profile/versions/${version}/restore`);
setStructuredCv(normalizeStructuredCv(r.data?.profile ?? emptyStructuredCv()));
setCompleteness(r.data?.completeness ?? null);
setProfileDirty(false);
+ invalidateImportComparisons();
await loadVersions();
toast(t("profileUpdated"), "success");
- } catch (e: any) {
- toast(String(e?.response?.data || e?.message || t("profileUpdateFailed")), "error");
+ } catch (error) {
+ const message = getApiErrorMessage(error, "");
+ setRestoreError(message);
+ toast(message || translationRef.current("careerRestoreFailed"), "error");
} finally {
profileMutationPending.current = false;
setLoading(false);
}
- }, [loadVersions, loading, me?.provider, t, toast]);
+ }, [loadVersions, loading, me?.provider, profileDirty, t, toast]);
const [extractionRuns, setExtractionRuns] = useState([]);
const [runsLoading, setRunsLoading] = useState(true);
const [runsLoadError, setRunsLoadError] = useState(null);
const runsReadId = useRef(0);
const [runDiffs, setRunDiffs] = useState>({});
+ const [runDiffErrors, setRunDiffErrors] = useState>({});
+ const [runDiffLoading, setRunDiffLoading] = useState>({});
+ const diffReadGeneration = useRef(0);
+ const diffReadIds = useRef>({});
const [reviewingRunId, setReviewingRunId] = useState(null);
+ const [reviewAction, setReviewAction] = useState<"accept" | "discard" | null>(null);
+ const reviewPending = useRef(false);
+ const [runActionErrors, setRunActionErrors] = useState>({});
+ const operationPending = useRef(new Set());
+ const [pendingOperations, setPendingOperations] = useState([]);
const [acceptedLowConfidenceIds, setAcceptedLowConfidenceIds] = useState>({});
const runStatusRef = useRef>({});
+ function invalidateImportComparisons() {
+ // A comparison and its choices refer to the source that was current when it was read.
+ ++diffReadGeneration.current;
+ setRunDiffs({});
+ setRunDiffErrors({});
+ setRunDiffLoading({});
+ setAcceptedLowConfidenceIds({});
+ }
+
+ const loadRunDiff = useCallback(async (runId: number) => {
+ const generation = diffReadGeneration.current;
+ const readId = (diffReadIds.current[runId] ?? 0) + 1;
+ diffReadIds.current[runId] = readId;
+ const isCurrent = () => generation === diffReadGeneration.current && readId === diffReadIds.current[runId];
+ setRunDiffLoading((current) => ({ ...current, [runId]: true }));
+ setRunDiffErrors((current) => { const next = { ...current }; delete next[runId]; return next; });
+ try {
+ const response = await api.get(`/profile-cv/runs/${runId}/diff`);
+ if (isCurrent()) setRunDiffs((current) => ({ ...current, [runId]: response.data.diff }));
+ } catch (error) {
+ if (isCurrent()) setRunDiffErrors((current) => ({ ...current, [runId]: getApiErrorMessage(error, "") }));
+ } finally {
+ if (isCurrent()) setRunDiffLoading((current) => ({ ...current, [runId]: false }));
+ }
+ }, []);
+
const editStructuredCv = useCallback((next: React.SetStateAction) => {
setStructuredCv(next);
setProfileDirty(true);
@@ -306,15 +373,64 @@ export default function CareerProfilePage() {
}, [extractionRuns, loadExtractionRuns]);
useEffect(() => {
- const pending = extractionRuns.filter((run) => run.status === "pending_review" && !runDiffs[run.id]);
- if (pending.length === 0) return;
- void Promise.all(pending.map((run) => api.get(`/profile-cv/runs/${run.id}/diff`)))
- .then((responses) => setRunDiffs((current) => Object.fromEntries([
- ...Object.entries(current),
- ...responses.map((response) => [response.data.runId, response.data.diff]),
- ])))
- .catch(() => undefined);
- }, [extractionRuns, runDiffs]);
+ for (const run of extractionRuns) {
+ if (run.status === "pending_review" && !runDiffs[run.id] && !runDiffLoading[run.id] && runDiffErrors[run.id] === undefined) void loadRunDiff(run.id);
+ }
+ }, [extractionRuns, loadRunDiff, runDiffErrors, runDiffLoading, runDiffs]);
+
+ const changeRunOperation = async (run: ExtractionRun, action: "cancel" | "retry") => {
+ const operation = run.operation;
+ if (!isLocal || !operation || operationPending.current.has(operation.id)) return;
+ const runRegion = document.getElementById(`career-import-run-${run.id}`);
+ if (runRegion?.contains(document.activeElement)) runRegion.focus();
+ operationPending.current.add(operation.id);
+ setPendingOperations([...operationPending.current]);
+ setRunActionErrors((current) => { const next = { ...current }; delete next[run.id]; return next; });
+ try {
+ await api.post(`/operations/${operation.id}/${action}`);
+ await loadExtractionRuns();
+ toast(translationRef.current(action === "cancel" ? "profileCvCancelRequested" : "profileCvRetryQueued"), "info");
+ } catch (error) {
+ const key = action === "cancel" ? "profileCvCancelFailed" : "profileCvRetryFailed";
+ const message = getApiErrorMessage(error, "");
+ setRunActionErrors((current) => ({ ...current, [run.id]: { key, message } }));
+ toast(message || translationRef.current(key), "error");
+ } finally {
+ operationPending.current.delete(operation.id);
+ setPendingOperations([...operationPending.current]);
+ }
+ };
+
+ const reviewRun = async (runId: number, action: "accept" | "discard") => {
+ if (!isLocal || loading || saving || reviewPending.current || profileMutationPending.current || (action === "accept" && (profileDirty || !runDiffs[runId]))) return;
+ const runRegion = document.getElementById(`career-import-run-${runId}`);
+ if (runRegion?.contains(document.activeElement)) runRegion.focus();
+ reviewPending.current = true;
+ if (action === "accept") profileMutationPending.current = true;
+ setReviewingRunId(runId);
+ setReviewAction(action);
+ setRunActionErrors((current) => { const next = { ...current }; delete next[runId]; return next; });
+ try {
+ if (action === "accept") await api.post(`/profile-cv/runs/${runId}/accept`, { acceptedLowConfidenceIds: acceptedLowConfidenceIds[runId] ?? [] });
+ else await api.post(`/profile-cv/runs/${runId}/discard`);
+ setExtractionRuns((current) => current.map((run) => run.id === runId ? { ...run, status: action === "accept" ? "applied" : "discarded" } : run));
+ if (action === "accept") {
+ invalidateImportComparisons();
+ await Promise.all([loadProfile(), loadExtractionRuns(), loadVersions()]);
+ } else await loadExtractionRuns();
+ toast(translationRef.current(action === "accept" ? "profileCvChangesApplied" : "profileCvExtractionDiscarded"), action === "accept" ? "success" : "info");
+ } catch (error) {
+ const key = action === "accept" ? "profileCvApplyChangesFailed" : "profileCvDiscardFailed";
+ const message = getApiErrorMessage(error, "");
+ setRunActionErrors((current) => ({ ...current, [runId]: { key, message } }));
+ toast(message || translationRef.current(key), "error");
+ } finally {
+ if (action === "accept") profileMutationPending.current = false;
+ reviewPending.current = false;
+ setReviewingRunId(null);
+ setReviewAction(null);
+ }
+ };
useEffect(() => {
const previous = runStatusRef.current;
@@ -337,7 +453,7 @@ export default function CareerProfilePage() {
const initials = useMemo(() => initialsFrom([me?.displayName, me?.firstName, me?.lastName, me?.userName, me?.email]), [me]);
const isLocal = me?.provider === "local";
- const editorDisabled = !isLocal || loading || saving;
+ const editorDisabled = !isLocal || loading || saving || parsingCvSections || (reviewingRunId !== null && reviewAction === "accept");
const loadErrorMessage = loadError === null ? null : loadError || t("profileLoadFailed");
const fullName = [me?.firstName, me?.lastName].filter(Boolean).join(" ");
const cvWordCount = profileCvText.trim() ? profileCvText.trim().split(/\s+/).length : 0;
@@ -355,8 +471,11 @@ export default function CareerProfilePage() {
: run.status === "queued" || run.status === "running");
const pendingCvRun = extractionRuns.find((run) => run.status === "pending_review");
const extractionProgress = activeCvRun?.operation?.progressPercent;
+ const importLabel = (value: string) => Object.hasOwn(importLabelKeys, value) ? t(importLabelKeys[value]) : value;
+ const importChangeLabel = (change: CvImportChange, category: string) => category === "Professional summary" ? importLabel(category)
+ : change.id === "Contact" && change.confidence === "Low" && change.label === "Contact details" ? t("careerImportContactDetails") : change.label;
return (
-
+
{t("careerWorkspaceNavigation")}
@@ -389,12 +508,12 @@ export default function CareerProfilePage() {
void loadExtractionRuns()}
- onRetryProfile={() => { if (!profileDirty) void loadProfile(); }}
+ onRetryProfile={() => { if (!profileDirty && !profileMutationPending.current) void loadProfile(); }}
profileDirty={profileDirty}
onNavigate={navigateWorkspace}
/>
@@ -402,7 +521,7 @@ export default function CareerProfilePage() {
{evidenceVisited ? : null}
- {workspaceSection === "profile" || workspaceSection === "import" ?
+ {workspaceSection === "profile" || workspaceSection === "import" ?
void restoreVersion(version)}
showSummary={false}
+ versionsLoading={versionsLoading}
+ versionsError={versionsError}
+ onRetryVersions={() => void loadVersions()}
+ restoreDisabled={profileDirty}
+ restoreError={restoreError}
/> : null}
{workspaceSection === "profile" ? : null}
{loadErrorMessage ? (
- { if (!profileDirty && !saving) void loadProfile(); }}>{t("retry")}}>
+ { if (!profileDirty && !profileMutationPending.current) void loadProfile(); }}>{t("retry")}}>
{t("profileLoadFailed")}
{loadError ? {loadError} : null}
@@ -487,7 +611,7 @@ export default function CareerProfilePage() {
{pendingCvRun ? navigateWorkspace("import")}>{t("careerProfileImportReview")}}>
{t("careerProfileImportReady")}
: null}
- {!canUseAi ? {t("profileProImportBody")} : null}
+ {!canUseAi ? {t("profileProImportBody")} : null}
: null}
{workspaceSection === "profile" ?
@@ -552,10 +676,10 @@ export default function CareerProfilePage() {
: null}
-
+
-
+
{!canUseAi && (
@@ -573,12 +697,12 @@ export default function CareerProfilePage() {
- }>
+ {t("careerImportComparisonFailed")}
+ {runDiffErrors[run.id] ? {runDiffErrors[run.id]} : null}
+ : }
{runDiffs[run.id]?.categories.flatMap((category) => [...category.added, ...category.updated].map((change) => ({ ...change, category: category.category }))).filter((change) => change.confidence === "Low").map((change) => (
setAcceptedLowConfidenceIds((current) => ({
+ sx={{ display: "flex", mt: 0.5, mr: 0, "& .MuiFormControlLabel-label.Mui-disabled": { color: "text.secondary" } }}
+ control={ setAcceptedLowConfidenceIds((current) => ({
...current,
[run.id]: event.target.checked
? [...(current[run.id] ?? []), change.id]
: (current[run.id] ?? []).filter((id) => id !== change.id),
}))} />}
- label={t("profileCvIncludeLowConfidence", { category: change.category, label: change.label })}
+ label={t("profileCvIncludeLowConfidence", { category: importLabel(change.category), label: importChangeLabel(change, change.category) })}
/>
))}
{profileDirty ? (
@@ -749,44 +871,25 @@ export default function CareerProfilePage() {
) : null}
- {
- setReviewingRunId(run.id);
- try {
- await api.post(`/profile-cv/runs/${run.id}/accept`, { acceptedLowConfidenceIds: acceptedLowConfidenceIds[run.id] ?? [] });
- setRunDiffs((current) => { const next = { ...current }; delete next[run.id]; return next; });
- await Promise.all([loadProfile(), loadExtractionRuns(), loadVersions()]);
- toast(t("profileCvChangesApplied"), "success");
- } catch (error) {
- toast(getApiErrorMessage(error, t("profileCvApplyChangesFailed")), "error");
- } finally { setReviewingRunId(null); }
- }}>{t("profileCvApplyChanges")}
- {
- setReviewingRunId(run.id);
- try {
- await api.post(`/profile-cv/runs/${run.id}/discard`);
- setRunDiffs((current) => { const next = { ...current }; delete next[run.id]; return next; });
- await loadExtractionRuns();
- toast(t("profileCvExtractionDiscarded"), "info");
- } catch (error) {
- toast(getApiErrorMessage(error, t("profileCvDiscardFailed")), "error");
- } finally { setReviewingRunId(null); }
- }}>{t("profileCvDiscard")}
+ void reviewRun(run.id, "accept")}>{reviewingRunId === run.id && reviewAction === "accept" ? t("careerImportApplying") : t("profileCvApplyChanges")}
+ void reviewRun(run.id, "discard")}>{reviewingRunId === run.id && reviewAction === "discard" ? t("careerImportDiscarding") : t("profileCvDiscard")}
) : null}
))}
- ) : (
+ ) : !runsLoading && runsLoadError === null ? (
{t("profileCvExtractionHistoryEmpty")}
- )}
-
+ ) : null}
+
setShowAdvancedCvTools((v) => !v)}>
{showAdvancedCvTools ? t("profileCvHideAdvancedTools") : t("profileCvAdvancedTools")}
-
+
+ {t("careerImportParseWarning")}
{t("profileCvStructureOverview")}
@@ -794,16 +897,21 @@ export default function CareerProfilePage() {
{
+ if (profileMutationPending.current || editorDisabled || profileDirty) return;
+ profileMutationPending.current = true;
setParsingCvSections(true);
try {
const res = await api.post<{ structuredCv?: StructuredCvProfile }>("/profile-cv/parse", { text: profileCvText });
editStructuredCv(normalizeStructuredCv(res.data?.structuredCv));
+ invalidateImportComparisons();
+ void loadVersions();
toast(t("profileCvStructureParsed"), "success");
} catch (e: any) {
toast(String(e?.response?.data || e?.message || t("profileCvStructureParseFailed")), "error");
} finally {
+ profileMutationPending.current = false;
setParsingCvSections(false);
}
}}
@@ -892,6 +1000,8 @@ export default function CareerProfilePage() {
setStructuredCv(normalizeStructuredCv(saved.data?.profile ?? structuredCv));
setCompleteness(saved.data?.completeness ?? null);
setProfileDirty(false);
+ invalidateImportComparisons();
+ void loadVersions();
toast(t("profileUpdated"), "success");
} catch (error) {
const message = getApiErrorMessage(error, "");
diff --git a/job-tracker-ui/src/views/career/ProfileCompleteness.tsx b/job-tracker-ui/src/views/career/ProfileCompleteness.tsx
index f2a85c6..0fb747b 100644
--- a/job-tracker-ui/src/views/career/ProfileCompleteness.tsx
+++ b/job-tracker-ui/src/views/career/ProfileCompleteness.tsx
@@ -1,8 +1,9 @@
import React from "react";
-import { Accordion, AccordionDetails, AccordionSummary, Box, Button, Chip, LinearProgress, Typography } from "@mui/material";
+import { Accordion, AccordionDetails, AccordionSummary, Alert, Box, Button, Chip, LinearProgress, Typography } from "@mui/material";
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
import { useI18n } from "../../i18n/I18nProvider";
import { localizeCompletenessLabel } from "./careerCompletenessLabels";
+import { PageSection } from "../../layout/PageLayout";
// Display-only slice of the Career Profile page: the completeness meter, the "missing" chips, and the
// version-history accordion. Extracted from CareerProfilePage as the first step of the Phase 1
@@ -26,20 +27,41 @@ export default function ProfileCompleteness({
loading,
onRestore,
showSummary = true,
+ versionsLoading = false,
+ versionsError = null,
+ onRetryVersions,
+ restoreDisabled = false,
+ restoreError = null,
}: {
completeness: CareerCompletenessView | null;
versions: CareerVersionView[];
loading: boolean;
onRestore: (version: number) => void;
showSummary?: boolean;
+ versionsLoading?: boolean;
+ versionsError?: string | null;
+ onRetryVersions?: () => void;
+ restoreDisabled?: boolean;
+ restoreError?: string | null;
}) {
const { language, t } = useI18n();
- if ((!showSummary || !completeness) && versions.length <= 1) return null;
+ const restoreHelpId = React.useId();
+ const historyRef = React.useRef(null);
const locale = language === "nb" ? "nb-NO" : "en";
+ const rows = versions.slice(0, 12).map((v) => (
+
+
+ v{v.version} · {v.source} · {new Date(v.createdAtUtc).toLocaleString(locale)}{v.isCurrent ? ` · ${t("profileCvVersionCurrent")}` : ""}
+
+ {!v.isCurrent ? (
+ { historyRef.current?.focus(); onRestore(v.version); }}>{t("careerRestoreVersion", { version: v.version })}
+ ) : null}
+
+ ));
return (
-
+
{showSummary && completeness ? (
<>
@@ -47,6 +69,7 @@ export default function ProfileCompleteness({
{completeness.percent}%
= 80 ? "success" : completeness.percent >= 40 ? "primary" : "warning"}
@@ -64,27 +87,31 @@ export default function ProfileCompleteness({
)}
>
) : null}
- {versions.length > 1 ? (
+
+ {versionsLoading ? : null}
+ {versionsError !== null ? { historyRef.current?.focus(); onRetryVersions(); }}>{t("retry")} : undefined}>
+ {t("careerHistoryLoadFailed")}
+ {versionsError ? {versionsError} : null}
+ : null}
+ {restoreError !== null ?
+ {t("careerRestoreFailed")}
+ {restoreError ? {restoreError} : null}
+ : null}
+ {restoreDisabled ? {t("careerSaveBeforeRestore")} : null}
+ {versions.length > 1 ? (
} sx={{ px: 0, minHeight: 0 }}>
{t("profileCvVersionHistory", { count: versions.length })}
- {versions.slice(0, 12).map((v) => (
-
-
- v{v.version} · {v.source} · {new Date(v.createdAtUtc).toLocaleString(locale)}{v.isCurrent ? ` · ${t("profileCvVersionCurrent")}` : ""}
-
- {!v.isCurrent ? (
- onRestore(v.version)}>{t("profileCvVersionRestore")}
- ) : null}
-
- ))}
+ {rows}
- ) : null}
+ ) : rows}
+ {versions.length === 0 && !versionsLoading && versionsError === null ? {t("careerHistoryEmpty")} : null}
+
);
}