From 8b4d5c21125e800199d3ecc2d9c059a80ac5125d Mon Sep 17 00:00:00 2001 From: cesnimda Date: Mon, 12 Oct 2026 07:50:32 +0200 Subject: [PATCH] feat(career): migrate overview and factual evidence --- docs/redesign/phase-7/COMMITS.md | 4 +- docs/redesign/phase-7/DEBT.md | 12 +- docs/redesign/phase-7/PRESERVATION.md | 14 + docs/redesign/phase-7/README.md | 6 +- docs/redesign/phase-7/p7-02/README.md | 40 +- .../p7-02/evidence/career-results.json | 7965 +++++++++++++++++ .../p7-02/evidence/career-static-checks.json | 104 + .../p7-02/evidence/evidence-list-repair.json | 32 +- docs/roadmap/todo.md | 4 +- .../e2e/phase7-career-overview.spec.ts | 358 + job-tracker-ui/src/career-evidence.test.tsx | 183 +- .../src/career-workspace-page.test.tsx | 150 +- job-tracker-ui/src/i18n/translations.ts | 12 +- .../src/views/CareerProfilePage.tsx | 26 +- .../src/views/career/CareerEvidenceBank.tsx | 116 +- .../views/career/CareerWorkspaceOverview.tsx | 96 +- 16 files changed, 9006 insertions(+), 116 deletions(-) create mode 100644 docs/redesign/phase-7/p7-02/evidence/career-results.json create mode 100644 docs/redesign/phase-7/p7-02/evidence/career-static-checks.json create mode 100644 job-tracker-ui/e2e/phase7-career-overview.spec.ts diff --git a/docs/redesign/phase-7/COMMITS.md b/docs/redesign/phase-7/COMMITS.md index 0995f9d..2e05e05 100644 --- a/docs/redesign/phase-7/COMMITS.md +++ b/docs/redesign/phase-7/COMMITS.md @@ -10,7 +10,9 @@ Entry is the completed Phase6 successor receipt `b5319981ad3d1bd635daff861453d23 | P7-01 public authentication sub-slice | `8ad720da5db5999ecda787575dc45621d18a5498` | [Public report](p7-01/README.md#public-authentication-implementation-and-acceptance), [immutable-source/runtime evidence](p7-01/evidence/public-auth-results.json): affected61/61, native22/22, isolated SMTP2/2, SMTP helper6/6 and unchanged-backend auth subset87/87; final types/lint/build pass. Public slice CONDITIONAL GO with31 contrast incompletes/manual/provider conditions. Normal push verified2026-10-11 18:50:24UTC: localHEAD=origin=live development8ad720d; local/origin/live main27657f3 unchanged. No completed public work remains uncommitted; independent account work in flight. Whole P7-01 remains PENDING | | P7-01 account identity/security and final checkpoint outcome | `ad7b4196af638f3a8c79e261ffd96507bd002835` | [Account report](p7-01/README.md#account-identity-and-security-implementation), [frozen account source/runtime](p7-01/evidence/account-results.json): full573/89 (+52/+4 from521/85), native account6/public22/auth-boundaries10, types/lint/build all pass; actual eight final PNGs inspected. Implemented P7-01 scope CONDITIONAL GO, account85/public31 incompletes and manual/provider/production gates retained;57/32 statuses unchanged. Final staged secret/whitespace/docs/matrix checks PASS (303 local links,57 groups/32 routes); normal push verified2026-10-11 19:16:15UTC: localHEAD=origin=live developmentad7b419, local/origin/live main27657f3 unchanged, worktree clean at observation. Actual receipt appended by successor; P7-02 entry satisfied. Source/export frozen independently from public8ad720d | | P7-02 onboarding guidance sub-slice | `d21501aa7e5f9040937fa821d6a77d823b7e08eb` | [Report](p7-02/README.md), [frozen source/runtime](p7-02/evidence/onboarding-results.json): affected32/2 (+23 net over nine inherited subset cases), ordinary native13/regression4, app/browser types/lint/build and actual13-image review pass. BuildbwZtqlczGqVRJ0J01IxVK; thirteen all-enabled scans0/13 incompletes with M11/manual/provider conditions. Retry-focus unit/native RED and earlier12-pass history retained; latest full573/89 inherited,596 derived only. Implemented onboarding CONDITIONAL GO; slice-specific hygiene PASS (four commands0,9docs/329links/0errors,57/32 retained) and normal development push directly verified2026-10-11 23:55:12.614723UTC: localHEAD=origin=live developmentd21501aa; local/origin/live main27657f3 unchanged; clean worktree at observation. Actual receipt appended by successor. Career overview/evidence and whole P7-02 pending;57/32 unchanged/main NO-GO | -| P7-02 SQLite evidence-list compatibility repair | PENDING actual commit/push | [Separate repair](p7-02/README.md#separate-evidence-list-provider-repair), [frozen backend/HTTP evidence](p7-02/evidence/evidence-list-repair.json): actual SQLite/HTTP RED0/1 each; new SQLite1/1, fresh guards91/91 and Release0warnings/errors plus ordinary HTTP1/1 GREEN. SQL owner filter/other-provider ordering unchanged; no schema/action/payload change, owned list remainsO(N). Fullbackend1,034 derived only from inherited1,033+1. Bounded local repair GO; slice-specific hygiene PASS00:05:02UTC (9docs337links/0errors,57/32 retained), direct normal push pending; Career UI/whole P7-02 pending; in-flight frontend excluded | +| P7-02 SQLite evidence-list compatibility repair | `01281f52d9279ecdbd3363a11d2e9cb71230bf49` | [Separate repair](p7-02/README.md#separate-evidence-list-provider-repair), [frozen backend/HTTP evidence](p7-02/evidence/evidence-list-repair.json): actual SQLite/HTTP RED0/1 each; new SQLite1/1, fresh guards91/91 and Release0warnings/errors plus ordinary HTTP1/1 GREEN. SQL owner filter/other-provider ordering unchanged; no schema/action/payload change, owned list remainsO(N). Fullbackend1,034 derived only from inherited1,033+1. Bounded local repair GO; slice-specific hygiene PASS00:05:02UTC (9docs337links/0errors,57/32 retained), normal push directly verified2026-10-12 00:06:47.145743UTC: localHEAD=origin=live development01281f52, local/origin/live main27657f3 unchanged; five unfinished Career paths retained/worktree not clean. Actual receipt appended by successor; Career UI/whole P7-02 pending; in-flight frontend excluded | + +| P7-02 Career overview/evidence and final implemented checkpoint outcome | PENDING normal commit/push | [Report](p7-02/README.md#career-overviewevidence-commit), [frozen finite evidence](p7-02/evidence/career-results.json): affected46/3 (+14 cases), native14 and fresh ordinary P2-D01/mobile-override2, types/lint/build pass; all22 final PNGs actually inspected. BuildqG82wPnFf-IsAkFvXkmn6,75-file export;0 violations/99 incompletes and M09/M11/manual/provider qualifications retained. Actual Delete-cancel RED/repair and Windows CRLF test correction retained. Implemented P7-02 CONDITIONAL GO; [final Career hygiene](p7-02/evidence/career-static-checks.json) PASS05:48:32UTC (four commands0,9docs347links0errors/57+32 retained); normal push pending. Fullfrontend610/backend1,034 derived only;57/32 unchanged/main NO-GO | 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. diff --git a/docs/redesign/phase-7/DEBT.md b/docs/redesign/phase-7/DEBT.md index 791e965..3dca96e 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 owner expansion; P7-03 retains current presentation-only behavior | +| 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 | | 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 | @@ -83,7 +83,7 @@ Copy fixes following actual visual review truthfully describe stored profile CV ## Evidence and production limits -The [separate P7-02 SQLite evidence-list repair](p7-02/evidence/evidence-list-repair.json) reproduces actual provider/HTTP failures and passes the new ordinary SQLite case,91 affected guards, Release build and HTTP readback after owner-local materialization/sort. It changes no schema, SQL owner filter or other-provider ordering. Fullbackend1,034 is derived only; full regression remains P7-12. The list remains O(N), and HTTP proof does not establish Career presentation/reader/production acceptance. Source/DLL/RED/GREEN/spec/raw traces are frozen with34 references verified; slice-specific hygiene PASS00:05:02UTC (9docs337links/0errors,57/32 retained), normal push pending. No RD production/manual/concurrency/provider closure follows from this bounded compatibility repair. +The [separate P7-02 SQLite evidence-list repair](p7-02/evidence/evidence-list-repair.json) reproduces actual provider/HTTP failures and passes the new ordinary SQLite case,91 affected guards, Release build and HTTP readback after owner-local materialization/sort. It changes no schema, SQL owner filter or other-provider ordering. Fullbackend1,034 is derived only; full regression remains P7-12. The list remains O(N), and HTTP proof does not establish Career presentation/reader/production acceptance. Source/DLL/RED/GREEN/spec/raw traces are frozen with34 references verified; slice-specific hygiene PASS00:05:02UTC (9docs337links/0errors,57/32 retained), normal push01281f52 directly verified00:06:47UTC/main unchanged, five unfinished Career paths retained. No RD production/manual/concurrency/provider closure follows from this bounded compatibility repair. ### P7-02 onboarding conditional disposition @@ -91,6 +91,14 @@ The [separate P7-02 SQLite evidence-list repair](p7-02/evidence/evidence-list-re Actual review demonstrated lost focus when Retry disappeared. Five strengthened existing unit cases and one focused native case reproduced it before the bounded Dismiss-ref/focus correction; final native13 proves retry focus and next action after dismissal/complete recovery. Existing Dashboard summary Retry recovery still captures focus on the shell Skip link with altered scroll; its owner focus restoration remains unqualified. Presentation retry does not diagnose historical Dashboard/Board500 causes or close RD08–RD14. Latest full573/89 is inherited;596/89 is derived573+23 only. Exact source/test/build/export/runner/raw/unit/history are frozen under `.artifacts/phase7/p7-02/onboarding-final/`,154 file-reference hashes verified; initial pre-focus source/export observations are historical identities rather than claimed snapshots. Implemented onboarding CONDITIONAL GO is final hygiene PASS and normal pushd21501aa/direct receipt23:55:12UTC; Career overview/evidence and whole P7-02 remain pending,57/32 statuses unchanged. +### P7-02 Career conditional disposition and P7-03 dependency + +[Career results](p7-02/evidence/career-results.json) retain affected46/3, native14 and fresh existing P2-D01/mobile-override2, types/lint/build and actual22-image review passing. Delete-cancel focus loss was reproduced in native and strengthened unit cases before a minimal state-order correction; the shared confirmation and duplicate guard remain. The separate clipboard failure was native Windows LF→CRLF conversion, with only CRLF→LF test normalization and raw codepoint retention. All prior failures stay in immutable history; no product clipboard or byte-exact OS claim is made. + +Twenty-two all-enabled scans retain0 violations/**99 incompletes**: contrast74 `bgOverlap`+22 invisiblebadge `shortTextContent`, plus3 hidden-focus `#menu-` MUI select portals. Actual section/form keyboard and corrected cancel/retry focus pass; M09/M11 contextual contrast/reader and RD06/RD07 human/device/zoom remain open. Error captures retain inherited shell Skip-link/scroll focus qualification and controlled English server-fixture detail. No density/provider/production acceptance is inferred. Source/test/export/runner/raw/unit history is frozen in `.artifacts/phase7/p7-02/career-final/`,152 refs verified; final buildqG82wPnFf-IsAkFvXkmn6. Implemented P7-02 is CONDITIONAL GO; [Career final hygiene](p7-02/evidence/career-static-checks.json) PASS (four commands0,9docs347links0errors), normal push pending. Latest full573/89 remains inherited;610/89 and backend1,034 are derived expectations only. + +Two independent read reviews identify the existing normalizer dropping job/education/certification/project stable IDs while overrides reference those IDs. P7-03 must separately reproduce and repair optional-ID preservation before structured presentation, with canonical/sibling native and payload proof. This inherited risk is distinct from RD21 stale-save/idempotency and is neither introduced nor closed by P7-02. No date-loss claim is made. Prove dirty-locale/pending-write draft ownership and recovery, and resolve or explicitly bound RD21 before changing save/history owners. Other manual/provider/production and C11/Phase8 gates remain unchanged. + 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. diff --git a/docs/redesign/phase-7/PRESERVATION.md b/docs/redesign/phase-7/PRESERVATION.md index a603d0e..6057e10 100644 --- a/docs/redesign/phase-7/PRESERVATION.md +++ b/docs/redesign/phase-7/PRESERVATION.md @@ -99,6 +99,20 @@ The22 public native cases and two isolated recovery cases are new separate packs Full frontend521→573 adds52 cases across four new suites with no removed/renamed cases: public23 and account29 (providers12, card presentation7, flows5, Profile5). Focused subsets and native packs overlap and are not added to that total. Earlier571 frontend and pre-copy native runs remain historical; the exact post-copy build/source identity is in the account manifest. P2-D01/sidecar/backend/rendering execution remains inherited here. +### P7-02 reconciliation, no full-group upgrade + +The [onboarding](p7-02/evidence/onboarding-results.json), [separate provider repair](p7-02/evidence/evidence-list-repair.json) and [Career](p7-02/evidence/career-results.json) records retain distinct executed scopes and failures. All57 remain **56 PARTIAL /1 DEFERRED**, with0 PASS/FAIL, and all32 routes remain retained. Career runtime/actual visual review is conditional; [final slice hygiene](p7-02/evidence/career-static-checks.json) PASS (9docs347links0errors/four commands0); normal push pending. + +| Protected groups | Fresh finite P7-02 proof | Remaining boundary | +|---|---|---| +| S02/E08/E09 | Onboarding affected32/native13/regression4; four observable steps, nullable unknown, five read-only source facts, existing per-user key and ownerA/B dismiss/reload/settled no-read proof. Existing four destinations/Back, retry and next-action focus pass; no forced guidance | Real grants/human/device/zoom, notification/full flags and historical Dashboard500 causes; Phase8 customization separate | +| C01/C02/C05/E08/E09 | Career affected46/native14: independent known/unknown/error reads, overview provenance, source/raw-copy/history destinations, three unique existing CV links and canonical/sibling readback/no unintended writes | Structured save/import/history and full library/publication migration remain P7-03/04; Windows clipboard content is LF-normalized with raw codepoints, not exact OS bytes | +| C04/E08/E09 | Actual evidence create/delete/readback, canceled confirmation/no write, retained draft/row after failures, scoped requests, explicit retry/reconfirm, keyboard and corrected cancel-focus. Twenty-two inspected geometry/axe states retain0 violations/99 incompletes | Full reader/contextual contrast/device/zoom, all metadata/long-tail combinations and production/provider qualification | +| C04 | Separate real SQLite/HTTP RED→GREEN repair; owner SQL filter/AsNoTracking and foreign-owner denial preserved; differently-offset instants sorted correctly;91 affected guards/Release pass | No live MySQL/production proof; owner-local list remainsO(N), no scaling/schema/payload/auth change | +| W05/W07/C07/E09 | Existing ordinary P2-D01 frozen-workspace and mobile-override cases freshly pass2/2 on final Career export, without skip/retry/expected failure | Broader frozen/render/CV revision/manual/deployed combinations remain their original gates | + +Stable job/education/certification/project IDs dropped by the existing normalizer are an inherited **P7-03 entry risk** requiring separate RED/payload/native proof and optional-ID repair before structured editing. This is distinct from RD21 concurrency and is not a P7-02 repair claim. Dirty-locale and pending-write ownership/recovery must also be qualified before save/history expansion. + [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. diff --git a/docs/redesign/phase-7/README.md b/docs/redesign/phase-7/README.md index 0bfef8c..09c6968 100644 --- a/docs/redesign/phase-7/README.md +++ b/docs/redesign/phase-7/README.md @@ -10,8 +10,8 @@ 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 GO: affected32/native13/regression4, types/lint/build and13 actual PNG inspections pass; final hygiene PASS/pushedd21501aa, direct receipt23:55:12UTC/main unchanged. Career overview/evidence and whole checkpoint remain pending | -| P7-03 | Career structured editing and import review | P7-02 fixtures; resolve or explicitly bound concurrency before changing save/history ownership; planned | +| [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); normal push pending; main unchanged | +| P7-03 | Career structured editing and import review | P7-02 normal push; separately reproduce/repair stable source-ID preservation before structured presentation, then prove dirty-locale/pending-write ownership and resolve or bound RD21 concurrency; planned | | 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 | @@ -39,7 +39,7 @@ The separate [account runtime manifest](p7-01/evidence/account-results.json) rec ## 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 overview/evidence remains pending,57 groups/32 routes unchanged and production NO-GO. +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; normal push pending. 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. Use the current MUI/Emotion theme, PageLayout/section primitives, ViewStateNotice/useViewResource, Router, i18n, notification and save owners. Preserve query/history/aliases, account/tenant/role boundaries, canonical Career facts versus CV overrides, revision recovery, frozen packages and original PDF pagination/oracles. Do not infer new Documents/Notifications/aggregate Admin routes from illustrative navigation. No new hard-coded user-facing strings. diff --git a/docs/redesign/phase-7/p7-02/README.md b/docs/redesign/phase-7/p7-02/README.md index 23ccf2b..b83a3c8 100644 --- a/docs/redesign/phase-7/p7-02/README.md +++ b/docs/redesign/phase-7/p7-02/README.md @@ -1,6 +1,6 @@ # P7-02 — Onboarding and Career overview/evidence -**Status: implemented onboarding guidance CONDITIONAL GO; final hygiene PASS, normally pushed d21501aa with direct receipt. Career overview/evidence and whole P7-02 remain pending.** Follow the exact [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries). This checkpoint has two bounded commits: onboarding guidance first, then Career overview/evidence. Structured Career editing/import/history remains P7-03; no alternative checkpoint order or new route is introduced. +**Status: implemented P7-02 scope CONDITIONAL GO. Onboarding and the separate SQLite repair are pushed; Career runtime/visual acceptance and final slice hygiene PASS; normal push pending.** Follow the exact [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries). This checkpoint has two bounded commits: onboarding guidance first, then Career overview/evidence. Structured Career editing/import/history remains P7-03; no alternative checkpoint order or new route is introduced. ## Accepted entry baseline @@ -52,31 +52,45 @@ The bounded [controller](../../../../JobTrackerApi/Controllers/CareerEvidenceCon Dedicated SQLite1/1 and fresh affected guards91/91 passed with zero failed/not-executed cases. Release test-project/API build passed00:01:26–00:01:28UTC with zero warnings/errors. Actual real-HTTP GREEN passed1/1 at00:01:48–00:01:58UTC, zero skip/flaky/unexpected/retry. The added ordinary backend case makes1,034 the **derived** future full expectation; only the91 affected guards have freshly executed. The dedicated1/HTTP1 overlap this coverage and later Career native coverage; do not add them to full totals. -Source/DLL, backend command/log/TRX and HTTP RED/GREEN report/log/result/trace/spec snapshots are immutable under `.artifacts/phase7/p7-02/evidence-list-repair/`, with34 file/hash references verified. The HTTP case executes local API contracts only; its uncommitted native-spec snapshot will be committed and rerun in the later Career slice. Existing onboarding frontend export is not a Career build or UI acceptance. Slice-specific [repair static checks](evidence/evidence-list-repair-static-checks.json) passed2026-10-12 00:04:59–00:05:02UTC: all four secret/working/staged/entry-whitespace commands exit0, nine Markdown documents/337 local links checked with0errors,57 groups/32routes retained, main unchanged. **Bounded local repair GO; final hygiene PASS, separate commit/push pending. Career UI/whole P7-02 remain pending.** This repair is committed separately before Career UI; no in-flight frontend implementation is included. A repair push observation may include the independent unfinished Career worktree; it must not claim that work complete or clean. +Source/DLL, backend command/log/TRX and HTTP RED/GREEN report/log/result/trace/spec snapshots are immutable under `.artifacts/phase7/p7-02/evidence-list-repair/`, with34 file/hash references verified. The HTTP case executes local API contracts only; its uncommitted native-spec snapshot will be committed and rerun in the later Career slice. Existing onboarding frontend export is not a Career build or UI acceptance. Slice-specific [repair static checks](evidence/evidence-list-repair-static-checks.json) passed2026-10-12 00:04:59–00:05:02UTC: all four secret/working/staged/entry-whitespace commands exit0, nine Markdown documents/337 local links checked with0errors,57 groups/32routes retained, main unchanged. **Bounded local repair GO; final hygiene PASS, normally pushed01281f52 and directly verified. Career UI acceptance was pending at this repair gate; its successor result follows.** This repair is committed separately before Career UI; no in-flight frontend implementation is included. Actual receipt2026-10-12 00:06:47.145743UTC records development localHEAD=origin=live01281f52, local/origin/live main27657f3 unchanged and five independent unfinished Career paths. The worktree was explicitly not clean; the completed repair was normally pushed without discarding that work. ## Career overview/evidence commit -Entry is the normally pushed onboarding `d21501aa7e5f9040937fa821d6a77d823b7e08eb`, directly verified23:55:12.614723UTC with development local/origin/live equality, main unchanged and clean worktree. Its final32/13/4/source/build/axe evidence remains frozen and historical at that commit; later Career translation changes cannot be validated against the earlier workspace. Latest fresh full frontend remains inherited573/89; onboarding adds23 verified affected cases, giving only a derived596/89 expectation. In the frozen573 report, the existing Career workspace suite has7 cases and evidence suite1, **eight-case affected baseline**. This is inherited baseline evidence, not a new Career execution. +Entry includes the normally pushed onboarding `d21501aa7e5f9040937fa821d6a77d823b7e08eb` and subsequent separate provider repair `01281f52d9279ecdbd3363a11d2e9cb71230bf49`. Each has its actual direct development/main receipt above. Onboarding's final32/13/4/source/build/axe evidence remains frozen and historical atd215; later Career translation changes cannot be validated against the earlier workspace. Latest fresh full frontend remains inherited573/89; onboarding adds23 verified affected cases, giving only a derived596/89 expectation. In the frozen573 report, the existing Career workspace suite has7 cases and evidence suite1, **eight-case affected baseline**. This is inherited baseline evidence, not a new Career execution. Fresh backend91 affected guards/Release/HTTP1 are from the separately pushed repair; fullbackend1,034 is derived only. Existing [CareerWorkspacePage](../../../../job-tracker-ui/src/views/CareerWorkspacePage.tsx) delegates to [CareerProfilePage](../../../../job-tracker-ui/src/views/CareerProfilePage.tsx). Preserve the actual Overview/Profile/Evidence/Import section owner and query/history behavior, including removal of the default overview query. Scope the residual presentation to [CareerWorkspaceOverview](../../../../job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx) and [CareerEvidenceBank](../../../../job-tracker-ui/src/views/career/CareerEvidenceBank.tsx), with existing [workspace](../../../../job-tracker-ui/src/career-workspace-page.test.tsx) and [evidence](../../../../job-tracker-ui/src/career-evidence.test.tsx) tests. Keep canonical `/career/profile` data and existing server-provided completeness labels/provenance, source/raw-copy/history links, `/career/evidence` list/create and owned delete contracts. Evidence creation keeps existing category/title/statement/tags/source semantics and explicit manual review; presentation does not invent achievements or change persistence. Improve bounded headings/state/form/retry/reflow using existing owners after reproduction. No structured editor/save/import/history owner or CV renderer change belongs here. -Required native evidence covers populated/empty/loading/error/retry, raw-copy/source/history destinations, actual evidence create/delete confirmation/no-write cancellation/readback, long/many items and keyboard/EN/NB/theme/narrow-screen states. Canonical/sibling/frozen boundaries and foreign-owner denial remain applicable. Any concurrency/save-owner change requires the separate P7-03 disposition; unavailable human/device evidence is carried explicitly. **Implementation/results/commit/push for this second boundary are PENDING.** +The [finite Career manifest](evidence/career-results.json) records actual affected **46/46 in three suites**, ordinary Career **14/14** and separate existing preservation **2/2** passing, with zero skipped/flaky/unexpected/retry native cases. Final app/browser TypeScript, lint and build passed2026-10-12 00:18:30–00:19:05UTC. Career14 executed00:19:05–00:20:04UTC; the ordinary P2-D01 frozen-workspace and mobile-override cases executed00:20:04–00:20:19UTC. These two are freshly executed preservation proof, not inherited acceptance. The API-only provider case overlaps the separate repair HTTP case and is not added to totals. -| Career proof | Current evidence / required outcome | +The source-worker RED passed8/22 and failed14 added assertions. First affected GREEN passed45/46; its remaining required-label selector harness error was corrected without changing the product contract or removing assertions. The initial native pack passed12/14 on build `KKwBMDeMkaRLM-O5e2Fb-`. One failure exposed genuine Delete-cancel focus loss: disabling the trigger before confirmation prevented restoration. The stronger unit RED passed7/8, then the minimal state-order correction passed46/46 at00:13:56UTC; the duplicate-operation guard and shared confirmation owner remain. The earlier jsdom focus-only8/8 diagnostic did not reproduce native disabled-element blur and stays historical. The other native failure was Windows clipboard LF→CRLF conversion. The final assertion normalizes only CRLF→LF and retains actual code points; no clipboard product change, trimming or byte-identical platform output claim follows. + +Final workspace14/evidence8 replace inherited7+1, adding **14 net cases**; the existing Profile24 consumer cases also pass unchanged. Onboarding adds23 separately. Latest fresh full frontend remains P7-01 **573/89**; **610/89 is derived573+23+14**, not a new full run. Full backend1,034 is likewise derived from1,033+the new SQLite case; the fresh affected91 guard run is separate. Final full regression remains P7-12. + +| Career proof | Actual finite outcome / remaining boundary | |---|---| -| Reproduced presentation defects | Source-owner RED cases and exact failure causes **PENDING**; retain original operation/save/navigation semantics | -| Affected unit regressions | Fresh workspace/evidence packet **PENDING**; reconcile names and net case changes against inherited7+1 without treating derived totals as a fresh full run | -| Real local workflows and boundaries | Native actual create/delete/readback/cancel/retry/source/history/section-query flows and canonical/sibling/frozen no-write/foreign-owner assertions **PENDING**; provider/model execution excluded | -| Finite responsive/localised/accessibility proof | EN/NB, light/dark, narrow/tablet/wide/short landscape, long/many items, semantic headings/forms, keyboard trap/restore, geometry and all axe findings **PENDING**; density only if an actual control exists | -| Backend constraints | Targeted existing Career/evidence authorization and real SQLite endpoint guards **PENDING**; no schema/endpoint/data-save expansion implied | -| Final source/export and exit | Fresh app/browser types/lint/build, exact measured source/export identity, actual image inspection, compact raw-report/hash evidence and slice-specific `career-static-checks.json` **PENDING**; normal push after passing bounded checks | +| Truthful resource states and navigation | Populated/empty/pending/failed independent profile/run/variant reads, deliberate retry, section query/Back, existing source/history destinations and three unique CV links pass; structured editor/import/history remains P7-03 | +| Evidence CRUD and isolation | Actual create, canceled delete/no write, failed save retaining draft, failed delete retaining row, deliberate retry/reconfirm and successful readback pass. Canonical Career and sibling CV readback after writes, owner denial and scoped requests remain asserted | +| Keyboard/focus | Retry focus, actual section selection/subsequent form traversal and corrected cancel-trigger restoration pass. Failed-save/delete captures retain inherited shell Skip-link/scroll context; complete human focus/spoken-state acceptance remains unverified | +| Responsive/localised visual review | Parent actually opened all22 final raw PNGs: eight EN/NB/theme samples320/360/390/768/1024/1280 short landscape/1440/1920 plus six pending/error states. Fields, titles and actions wrap without observed clipping; all22 recorded root-overflow values are0; the1440 many-item fixture has11 rows | +| Accessibility | Twenty-two all-enabled scans retain0 violation nodes/99 incomplete occurrences. No automated result establishes reader/device/zoom conformance; density was not varied and Career has no global density control | +| Exit | Runtime and actual22-image review support implemented-scope CONDITIONAL GO. Slice-specific final hygiene PASS; normal commit/push remains pending; main/production stays NO-GO | -Record final compact outcomes in `evidence/career-results.json` only after actual executions. Full axe node/check vectors remain in the identified immutable raw report; the portable record must retain every rule count and contextual triage, including incomplete results and errors. Keep source-worker/native failures, fixture corrections and exact count deltas; no skips/expected failures/assertion relaxation. The accepted onboarding evidence and `onboarding-static-checks.json` remain independent. Career/whole P7-02 acceptance, source/build identity and push are not claimed by this plan. +All99 incomplete contexts remain recorded:96 `color-contrast` (74 `bgOverlap` plus22 invisible notification-badge `0`/`shortTextContent`) and3 `aria-hidden-focus` targeting `#menu-`, the hidden MUI section-select portal in narrow evidence states. The actual section and subsequent form keyboard workflows pass; **M09/M11** reader/contextual contrast/forced-colors requirements remain pending. Complete HTML/data/related-node/check vectors remain in the exact hashed raw report, with every rule/target/check context summarized in the portable manifest. Controlled English500 details are server-fixture text, distinct from translated product fallback. Sticky appbar/Skip-link placement in error captures reflects recorded scroll/focus context, not a new demonstrated overflow defect. + +Final four-source LF digest is `190d0a24368bfc3cc76550ff0f74c272200d3a30f61218a86628449ac83735ce`; build `qG82wPnFf-IsAkFvXkmn6`; **75 exported files**, digest `50896e8ad6934b909b83cc487eaf3579516921fde54b19e50a9039db68e04869`. Final native report SHA256 is `f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360`. Source/test/build/export/runner/config, whole runtime/attempt tree, unit history and entry manifests are frozen under `.artifacts/phase7/p7-02/career-final/`:152 file-reference hashes verified,428 runtime files and81 unit files retained. Parent independently verified152 references/84 unique referenced files with0 errors. Raw hashes/counts remain measured bytes; portable JSON/source canonical-LF policies are explicit. Earlier first-build75-file export/report and failed unit/native attempts stay historical; the first source had already been corrected before export archival, so no original-source snapshot is claimed. + +Slice-specific [Career static checks](evidence/career-static-checks.json) passed2026-10-12 05:48:28–05:48:32UTC: four secret/working/staged/entry-whitespace commands exit0; nine Markdown documents/347 local links checked with0errors at that observation;57 qualified groups/32 routes retained and main27657f3 unchanged. Canonical UTF-8/LF static SHA256 is `f575a6304bb4d00e11ee77270d60ebdee11f1cd8faf9692adb4c473961b4d8f4`. Final hygiene PASS; normal commit/push receipt remains pending. Runtime/source/export/manual qualifications are unchanged. ## Preservation and exit -S02/C02/C04/E09 and shared E08/S03 are the finite scope in the [57 matrix](../PRESERVATION.md). Retain all [debt](../DEBT.md), established auth/private-tree behavior, original routes and semantic action boundaries. Scoped truthful loading/retry does not establish the root cause of historical Dashboard/Board500 observations. +S02/C01/C02/C04/C05/E09 and shared E08/S03 are the finite scope in the [57 matrix](../PRESERVATION.md). Retain all [debt](../DEBT.md), established auth/private-tree behavior, original routes and semantic action boundaries. Scoped truthful loading/retry does not establish the root cause of historical Dashboard/Board500 observations. Each completed logical boundary must include reproduction/baseline, actual changes, automated and visual evidence, exact count explanation, source/export identity, manual qualifications and normal commit/push with remote=HEAD. Record observed results here after execution; no skips, expected failures or relaxed assertions can substitute for passing ordinary cases. P7-03 starts only after the applicable P7-02 fixtures/entry are verified. Production main/deployment, P5-13 activation and Phase8 Dashboard customization remain outside this checkpoint. + +### Mandatory P7-03 entry conditions + +Two independent source reviews identify an inherited stable-ID risk in [normalizeStructuredCv](../../../../job-tracker-ui/src/profileCv.ts): job/education/certification/project IDs are dropped, while CV overrides refer to source IDs and the API may assign replacements. **Before structured-edit presentation, separately reproduce and repair optional-ID preservation with normalizer/payload/native canonical-and-sibling proof.** This is a P7-03 entry condition, not a P7-02 regression or completed repair. No date-loss claim is made; server StartDate derives from Start. + +Retain RD21 concurrency as a separate obligation. Prove dirty drafts survive locale/navigation/read-retry boundaries and held-PUT/pending-write ownership/recovery before changing save/history behavior; resolve or explicitly bound stale profile/job saves and creation-intent behavior using the existing contracts. Known canonical/sibling fixtures and actual server IDs remain the basis; no guessed revision/schema/provider behavior. P7-03 begins after this slice's successful normal push. Import/history remains its approved second boundary; P5-13 and Phase8 remain deferred. diff --git a/docs/redesign/phase-7/p7-02/evidence/career-results.json b/docs/redesign/phase-7/p7-02/evidence/career-results.json new file mode 100644 index 0000000..fa6bd5d --- /dev/null +++ b/docs/redesign/phase-7/p7-02/evidence/career-results.json @@ -0,0 +1,7965 @@ +{ + "schemaVersion": 1, + "checkpoint": "P7-02", + "slice": "Career overview/evidence", + "collectedUtc": "2026-10-12T05:38:42.288348+00:00", + "acceptance": "CONDITIONAL GO", + "entry": { + "onboardingCommit": "d21501aa7e5f9040937fa821d6a77d823b7e08eb", + "evidence": { + "path": ".artifacts/phase7/p7-02/career-final/entry-onboarding-results.json", + "sha256": "e7cd700b34ac3c18086303cad770e68502b388286dec371a4ca5a8b9b6cfb1cf", + "bytes": 427470, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "latestDevelopmentCommit": "01281f52d9279ecdbd3363a11d2e9cb71230bf49", + "repairEvidence": { + "path": ".artifacts/phase7/p7-02/career-final/entry-repair-results.json", + "sha256": "57a311629bebb49a6ff31078a8f730224e21e93a05ac65dd067f3542c6937645", + "bytes": 27865, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "latestFullFrontend": "Inherited573/89;596/89 is derived after onboarding, not a fresh full run" + }, + "identity": { + "sourceFiles": [ + { + "path": "job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx", + "sha256": "20b01d7e6c16045cf87c19d7b259a77b4dd6a319dc11f71857bd82306774d2e0", + "bytes": 11537, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + { + "path": "job-tracker-ui/src/views/career/CareerEvidenceBank.tsx", + "sha256": "51cab7289717c9f26006a9d34ac1f8aac9e09d19e549a3666a15adc41d5d4724", + "bytes": 7455, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + { + "path": "job-tracker-ui/src/views/CareerProfilePage.tsx", + "sha256": "961f992fe9684766abb253f939bf64ca28bd4e671ba3f6efb98904aba6dea091", + "bytes": 47815, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + { + "path": "job-tracker-ui/src/i18n/translations.ts", + "sha256": "fea1eb8ba58a5b4ff86c33fa651ec542fe6df46dcbade226790737dc5994d30c", + "bytes": 308555, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + } + ], + "sourceSha256Lf": "190d0a24368bfc3cc76550ff0f74c272200d3a30f61218a86628449ac83735ce", + "sourceHashPolicy": "Ordered original path TAB canonical-LF source SHA LF records", + "buildId": "qG82wPnFf-IsAkFvXkmn6", + "buildIdRaw": { + "path": ".artifacts/phase7/p7-02/career-final/BUILD_ID", + "sha256": "9ac86cb69de1c8cc79ae66e9d10349496b629607f6de0f7fb26edfbbdb593a04", + "bytes": 21, + "hashPolicy": "Exact measured raw bytes" + }, + "exportFiles": 75, + "exportSha256": "50896e8ad6934b909b83cc487eaf3579516921fde54b19e50a9039db68e04869", + "exportHashPolicy": "Sorted original export path TAB exact raw file SHA LF records", + "sourceSnapshots": [ + { + "originalSourcePath": "job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx", + "path": ".artifacts/phase7/p7-02/career-final/source/job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx", + "sha256": "e7ff8bdd8e541cf972f448298cc22e435a741e60a85222a85aafc12cf6536f5e", + "bytes": 11720, + "hashPolicy": "Exact measured raw bytes", + "canonicalLfSha256": "20b01d7e6c16045cf87c19d7b259a77b4dd6a319dc11f71857bd82306774d2e0" + }, + { + "originalSourcePath": "job-tracker-ui/src/views/career/CareerEvidenceBank.tsx", + "path": ".artifacts/phase7/p7-02/career-final/source/job-tracker-ui/src/views/career/CareerEvidenceBank.tsx", + "sha256": "fc85ccfc1addd48af3a29bc263b089858765b2ac3ec7db3b66dedc55ddfab625", + "bytes": 7559, + "hashPolicy": "Exact measured raw bytes", + "canonicalLfSha256": "51cab7289717c9f26006a9d34ac1f8aac9e09d19e549a3666a15adc41d5d4724" + }, + { + "originalSourcePath": "job-tracker-ui/src/views/CareerProfilePage.tsx", + "path": ".artifacts/phase7/p7-02/career-final/source/job-tracker-ui/src/views/CareerProfilePage.tsx", + "sha256": "a70c1f6aba86da0c34621b7812b30525dc5f96a67a983c6bf42826c116ad07b4", + "bytes": 48634, + "hashPolicy": "Exact measured raw bytes", + "canonicalLfSha256": "961f992fe9684766abb253f939bf64ca28bd4e671ba3f6efb98904aba6dea091" + }, + { + "originalSourcePath": "job-tracker-ui/src/i18n/translations.ts", + "path": ".artifacts/phase7/p7-02/career-final/source/job-tracker-ui/src/i18n/translations.ts", + "sha256": "39e0a94d7f9d465bee4739a347fe15589cf34cc6dd99455d2284273654a42fd6", + "bytes": 313741, + "hashPolicy": "Exact measured raw bytes", + "canonicalLfSha256": "fea1eb8ba58a5b4ff86c33fa651ec542fe6df46dcbade226790737dc5994d30c" + } + ], + "testSnapshots": [ + { + "originalTestPath": "job-tracker-ui/e2e/phase7-career-overview.spec.ts", + "path": ".artifacts/phase7/p7-02/career-final/tests/job-tracker-ui/e2e/phase7-career-overview.spec.ts", + "sha256": "175e3081bb05c19675fb088b78f21e513b5f925848c4ab0a23272577cb59a169", + "bytes": 25884, + "hashPolicy": "Exact measured raw bytes" + }, + { + "originalTestPath": "job-tracker-ui/src/career-workspace-page.test.tsx", + "path": ".artifacts/phase7/p7-02/career-final/tests/job-tracker-ui/src/career-workspace-page.test.tsx", + "sha256": "0060297d6bf7b0d2ef6045b5103d25ba6513697b7dd007f9d38684a04b10a43d", + "bytes": 14842, + "hashPolicy": "Exact measured raw bytes" + }, + { + "originalTestPath": "job-tracker-ui/src/career-evidence.test.tsx", + "path": ".artifacts/phase7/p7-02/career-final/tests/job-tracker-ui/src/career-evidence.test.tsx", + "sha256": "511341eec5e6dcdad7d0f9f63e959b7fb8ac7fdf43aa2dfcfa32fcff33540985", + "bytes": 10946, + "hashPolicy": "Exact measured raw bytes" + }, + { + "originalTestPath": "job-tracker-ui/src/profile-page.test.tsx", + "path": ".artifacts/phase7/p7-02/career-final/tests/job-tracker-ui/src/profile-page.test.tsx", + "sha256": "2f3f2a583962351be93c4b1dcf08ec8db80b2eed87b5684b10ddbdb6a5c422a7", + "bytes": 29406, + "hashPolicy": "Exact measured raw bytes" + } + ], + "historicalSourceApplicability": "Original sourceFiles/sourceSha256Lf identify this frozen Career slice. Verify future source identities against sourceSnapshots canonicalLfSha256 or the eventual slice commit, not a later workspace. Measured hashes and original digest order remain unchanged.", + "staticExportSnapshot": { + "root": ".artifacts/phase7/p7-02/career-final/export", + "qualification": "Exact raw measured files from job-tracker-ui/out; original export digest paths/algorithm unchanged" + } + }, + "environment": { + "appliedRunnerEnvironment": { + "NEXT_PUBLIC_API_BASE_URL": "http://localhost:5302/api", + "NEXT_TELEMETRY_DISABLED": "1", + "DOTNET_ROOT": "C:/Users/Connor/.dotnet", + "DOTNET_HOST_PATH": "C:/Users/Connor/.dotnet/dotnet.exe", + "PLAYWRIGHT_STATIC_EXPORT": "true", + "PLAYWRIGHT_PREBUILT_EXPORT": "true", + "PLAYWRIGHT_REUSE_SERVERS": "false", + "Workers__SavedJobSearchAlertsEnabled": "false", + "CV_FIDELITY_OUTPUT": ".artifacts/phase7/current/ui/fidelity", + "CV_SETTINGS_FIDELITY_OUTPUT": ".artifacts/phase7/current/ui/settings-fidelity" + }, + "runner": { + "path": ".artifacts/phase7/p7-02/career-final/run-ui.py", + "sha256": "b7872368768d8b8e81b531250de524860e780c23b020a0655d31f525e43e7815", + "bytes": 4494, + "hashPolicy": "Exact measured raw bytes" + }, + "browserTypeScriptConfig": { + "path": ".artifacts/phase7/p7-02/career-final/e2e-tsconfig.json", + "sha256": "55fa6fffaed1e76a32657edfffcc501cd8bd87330bda2c3a3944f8f89d4019e2", + "bytes": 572, + "hashPolicy": "Exact measured raw bytes" + } + }, + "commands": { + "typecheck": { + "record": { + "name": "typecheck", + "command": [ + "rtk", + "proxy", + "npm.cmd", + "run", + "typecheck" + ], + "startedUtc": "2026-10-12T00:18:30.013963+00:00", + "finishedUtc": "2026-10-12T00:18:39.153178+00:00", + "exitCode": 0 + }, + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/typecheck-command.json", + "sha256": "1a4236152e5fe91df07c492089027debfacf1544866e84ab020bc6e55c2e3a14", + "bytes": 247, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/typecheck.log", + "sha256": "89b0ec97b537eca6560c13ca2dfea9e3a97dd1bb35580c4ff39d2462db25e080", + "bytes": 148, + "hashPolicy": "Exact measured raw bytes" + } + }, + "browser-typecheck": { + "record": { + "name": "browser-typecheck", + "command": [ + "rtk", + "proxy", + "npm.cmd", + "exec", + "tsc", + "--", + "--project", + "../.artifacts/phase7/e2e-tsconfig.json", + "--noEmit" + ], + "startedUtc": "2026-10-12T00:18:39.154678+00:00", + "finishedUtc": "2026-10-12T00:18:42.791299+00:00", + "exitCode": 0 + }, + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/browser-typecheck-command.json", + "sha256": "95463d53e197d240fa00cbfda967277a870a2a9f34a323b8e6522b2007c199b7", + "bytes": 343, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/browser-typecheck.log", + "sha256": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6", + "bytes": 78, + "hashPolicy": "Exact measured raw bytes" + } + }, + "lint": { + "record": { + "name": "lint", + "command": [ + "rtk", + "proxy", + "npm.cmd", + "run", + "lint" + ], + "startedUtc": "2026-10-12T00:18:42.792291+00:00", + "finishedUtc": "2026-10-12T00:18:59.009976+00:00", + "exitCode": 0 + }, + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/lint-command.json", + "sha256": "27e1db6dfca0f79240baf9d3e37e19afc06f6e41fd2b56c13f8ab7d33938250b", + "bytes": 237, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/lint.log", + "sha256": "b040dbeca9b4adb3f6f4c25ac49de0d37e921375b2d9b57e87b542a10f599913", + "bytes": 136, + "hashPolicy": "Exact measured raw bytes" + } + }, + "build": { + "record": { + "name": "build", + "command": [ + "rtk", + "proxy", + "npm.cmd", + "run", + "build" + ], + "startedUtc": "2026-10-12T00:18:59.012500+00:00", + "finishedUtc": "2026-10-12T00:19:05.740903+00:00", + "exitCode": 0 + }, + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/build-command.json", + "sha256": "e2ef838f050551c0b6939c161ed513ac818f1559e346fa204bb6cd8a44624793", + "bytes": 239, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/build.log", + "sha256": "702b79054382d442670530e29fbb785f3e59905f364e297e8aa18032e6acbbc7", + "bytes": 670, + "hashPolicy": "Exact measured raw bytes" + } + } + }, + "affectedFrontend": { + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-cancel-green-20261012T001337Z.json", + "sha256": "9d69964106739a0e92f0782a016585574cd4d263d79f392693a2edd47860a8a2", + "bytes": 19284, + "hashPolicy": "Exact measured raw bytes" + }, + "startedUnixMs": 1791764018196, + "passed": 46, + "failed": 0, + "pending": 0, + "total": 46, + "suites": 3, + "cases": [ + { + "name": "saves factual evidence with provenance and tags", + "status": "passed" + }, + { + "name": "pending evidence reads announce loading without claiming an empty bank or allowing a raced save", + "status": "passed" + }, + { + "name": "failed list reads remain distinct from empty state and retry only GET while preserving the draft", + "status": "passed" + }, + { + "name": "failed saves retain factual inputs and retry the same explicit save without reloading the list", + "status": "passed" + }, + { + "name": "a pending save prevents duplicate writes and prevents edits being cleared by the response", + "status": "passed" + }, + { + "name": "contextual deletion is named and cancellation performs no writes or draft loss", + "status": "passed" + }, + { + "name": "failed deletion keeps the row and draft, then reconfirms the same delete without list reload", + "status": "passed" + }, + { + "name": "evidence sections and factual fields have semantic headings and required labels in Bokmål", + "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": "overview retry cannot overwrite a dirty canonical draft after a failed source refresh", + "status": "passed" + }, + { + "name": "visited evidence keeps its draft across sections without an unvisited or repeated list request", + "status": "passed" + } + ] + }, + "affectedCommand": { + "record": { + "command": [ + "rtk", + "proxy", + "npm.cmd", + "test", + "--", + "--runInBand", + "--watchAll=false", + "--json", + "--outputFile=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\unit\\career-cancel-green-20261012T001337Z.json", + "src/career-workspace-page.test.tsx", + "src/career-evidence.test.tsx", + "src/profile-page.test.tsx" + ], + "startedUtc": "2026-10-12T00:13:37.273731+00:00", + "finishedUtc": "2026-10-12T00:13:56.197773+00:00", + "exitCode": 0, + "counts": { + "numPassedTests": 46, + "numFailedTests": 0, + "numPendingTests": 0, + "numTodoTests": 0, + "numPassedTestSuites": 3, + "numFailedTestSuites": 0 + } + }, + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-cancel-green-20261012T001337Z-command.json", + "sha256": "a3956d3c3d639366e64a392510ad982afb6af43d569aee448ff590253264ec02", + "bytes": 719, + "hashPolicy": "Exact measured raw bytes" + } + }, + "caseDeltas": { + "baselineRaw": { + "path": ".artifacts/phase7/p7-01/account-final/runtime/jest.json", + "sha256": "319679b96644fbde2ec466faa5055ac3dce0f85053f3c92c7dbfbc9d763186f0", + "bytes": 241073, + "hashPolicy": "Exact measured raw bytes" + }, + "files": [ + { + "file": "src/career-evidence.test.tsx", + "prior": 1, + "current": 8, + "added": [ + "a pending save prevents duplicate writes and prevents edits being cleared by the response", + "contextual deletion is named and cancellation performs no writes or draft loss", + "evidence sections and factual fields have semantic headings and required labels in Bokmål", + "failed deletion keeps the row and draft, then reconfirms the same delete without list reload", + "failed list reads remain distinct from empty state and retry only GET while preserving the draft", + "failed saves retain factual inputs and retry the same explicit save without reloading the list", + "pending evidence reads announce loading without claiming an empty bank or allowing a raced save" + ], + "removedOrRenamed": [] + }, + { + "file": "src/career-workspace-page.test.tsx", + "prior": 7, + "current": 14, + "added": [ + "a failed import read stays unknown and keeps its own retry separate from the profile read", + "a settled failed profile read hides the completeness score and retries only through its existing owner", + "an unknown import read cannot claim no imports, completion or first-run guidance", + "failed recent-CV reads do not imply first-run and retry the same list without writes", + "overview retry cannot overwrite a dirty canonical draft after a failed source refresh", + "the parent exposes failed import-read retry without canonical saves or history restores", + "visited evidence keeps its draft across sections without an unvisited or repeated list request" + ], + "removedOrRenamed": [] + }, + { + "file": "src/profile-page.test.tsx", + "prior": 24, + "current": 24, + "added": [], + "removedOrRenamed": [] + } + ], + "netAdded": 14 + }, + "native": { + "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-12T00:19:05.747473+00:00", + "finishedUtc": "2026-10-12T00:20:04.645972+00:00", + "exitCode": 0, + "stats": { + "startTime": "2026-10-12T00:19:06.252Z", + "duration": 58323.432, + "expected": 14, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + } + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career-command.json", + "sha256": "f29d3b312ee1faf6277a85b7168783ef86c800959132d407e4c808a12d490701", + "bytes": 642, + "hashPolicy": "Exact measured raw bytes" + }, + "reportRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.log", + "sha256": "9b9335a1de10142061f9c3e9b2b30ea64366f6e3abbbdb0bf7e0e9af5379f25e", + "bytes": 3266, + "hashPolicy": "Exact measured raw bytes" + }, + "stats": { + "startTime": "2026-10-12T00:19:06.252Z", + "duration": 58323.432, + "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": 954 + }, + { + "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": 4319 + }, + { + "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": 4201 + }, + { + "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": 4119 + }, + { + "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": 4029 + }, + { + "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": 4141 + }, + { + "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": 4566 + }, + { + "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": 4727 + }, + { + "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": 4434 + }, + { + "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": 2266 + }, + { + "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": 2224 + }, + { + "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": 2223 + }, + { + "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": 6683 + }, + { + "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": 2121 + } + ], + "attachments": [ + { + "test": "[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation", + "name": "native-evidence-owner-provider-contract", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "e4586eb2bd4f1c19fc742080a1f7a375238bc7baebf3516ca7f3c1d59cf6fe27", + "bytes": 267 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "06b9894b40df5b25aadfe47d380ffe29af49c9decc5c9b81a012049f2bd56736", + "bytes": 6792 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "46270abbe1bfd3f1d4c3d75a5feb3f536f31660725a7b00fff3335827e99a24d", + "bytes": 86185, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-dark-320-populated-overview.png", + "sha256": "46270abbe1bfd3f1d4c3d75a5feb3f536f31660725a7b00fff3335827e99a24d", + "bytes": 86185, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "a2288f6072ead891375093fa002407fce5c056845ea1d5ff99eb4d4c681368af", + "bytes": 11676 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "754ccbb181f061205466b9851ece8f7541ba487f3a1c1cfa4944316802775e10", + "bytes": 79872, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-dark-320-long-evidence.png", + "sha256": "754ccbb181f061205466b9851ece8f7541ba487f3a1c1cfa4944316802775e10", + "bytes": 79872, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "4967c67ec92d240fa20f82b2bc41c34fcb2e55d5b511e033f45f6407981a06b1", + "bytes": 6679 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "064f05f5bfaaebeeb314ff4f26fd7bd53c879d4f95377cd41520ef87520f73d9", + "bytes": 84594, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-360-populated-overview.png", + "sha256": "064f05f5bfaaebeeb314ff4f26fd7bd53c879d4f95377cd41520ef87520f73d9", + "bytes": 84594, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "7ecb060300192a0c5b9827b24ebab835fbdd5648215cf9eaa9aea4bc0b37fb4d", + "bytes": 11585 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "8090f7c66c4372689ee7e349bc37ba394d7e75addc689458fbd2d8e3924f7cc0", + "bytes": 70567, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-360-long-evidence.png", + "sha256": "8090f7c66c4372689ee7e349bc37ba394d7e75addc689458fbd2d8e3924f7cc0", + "bytes": 70567, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "c2c8a7cdb3177360635095b74bcd6cf5e881448133b357f38da9b8b8100461c5", + "bytes": 6796 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "0ddf1641e174ed0123e6a6a368cd4ddae02b7e16dd53088a28f7c74445cd79df", + "bytes": 86576, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-light-390-populated-overview.png", + "sha256": "0ddf1641e174ed0123e6a6a368cd4ddae02b7e16dd53088a28f7c74445cd79df", + "bytes": 86576, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "d73b176c5a2750dd55ea1ddbe49ac868c6c38ac07b9924af78c11b096bb1ea6d", + "bytes": 11677 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "05abccf36e7a8bf3a2ae5a82d34b59f1b68b9dd4f5b4d384101a04b0688b47f2", + "bytes": 71192, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-light-390-long-evidence.png", + "sha256": "05abccf36e7a8bf3a2ae5a82d34b59f1b68b9dd4f5b4d384101a04b0688b47f2", + "bytes": 71192, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "79e22aff21539affadbdfeb0a37132d4624bae7bc6550eaceccd4f4b42b60b0e", + "bytes": 5998 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "20258c36363096d061444d6cdae229160244463fc2de75992348d3c006b56394", + "bytes": 94494, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-768-populated-overview.png", + "sha256": "20258c36363096d061444d6cdae229160244463fc2de75992348d3c006b56394", + "bytes": 94494, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "89d50b7618ebb51a50935bbbfc564f70b252b930e8974eea64ab72ff04a77df3", + "bytes": 10419 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "4cc481d28dfb9d0439dc6900ba57541ee663ebd12136b323b18a083dc8a82a71", + "bytes": 83945, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-768-long-evidence.png", + "sha256": "4cc481d28dfb9d0439dc6900ba57541ee663ebd12136b323b18a083dc8a82a71", + "bytes": 83945, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "9416274400aef9ef072254ba01914c44daa7324f876cd7b07273a3c62e485003", + "bytes": 6194 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "42cffa1a683373a40e66d11bdfb373e8bbf2528aecbebe9fc84f454ccd91fd49", + "bytes": 119730, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-dark-1024-populated-overview.png", + "sha256": "42cffa1a683373a40e66d11bdfb373e8bbf2528aecbebe9fc84f454ccd91fd49", + "bytes": 119730, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "ab06eb0e4f2ed956cd36c9328f2dc64d096e623d9ec076204207137fb99e12fa", + "bytes": 10595 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "e2b6fcbecf8ee35f3bf1d0fdd461901f466e1702f20d674641948131cd17cc8c", + "bytes": 110805, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-dark-1024-long-evidence.png", + "sha256": "e2b6fcbecf8ee35f3bf1d0fdd461901f466e1702f20d674641948131cd17cc8c", + "bytes": 110805, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "1147566317d407fa4f55a29daebd710a06b5e2ed6919d694706ded2f7d4f9add", + "bytes": 6086 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "c9d2e956cf79df51dff4fb3ca72dff44054e23d0bdce85ba220f37942ccf25b7", + "bytes": 103025, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-1280-populated-overview.png", + "sha256": "c9d2e956cf79df51dff4fb3ca72dff44054e23d0bdce85ba220f37942ccf25b7", + "bytes": 103025, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "09f2a02a6783ff589b05c4221cf3fdb73ed096ad649bdeb9514797224f9420ef", + "bytes": 10509 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "cd31e56c9c153784f2e5d65e5df49b075926a357d751387f5671a2df034960fd", + "bytes": 96501, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-1280-long-evidence.png", + "sha256": "cd31e56c9c153784f2e5d65e5df49b075926a357d751387f5671a2df034960fd", + "bytes": 96501, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "b17107c4aa02114c5f96d80b4e195a207b17cce2462cf047226de37c5baf81d6", + "bytes": 6195 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "760dd39a7567e0bf895d203402c34aa3cc7f4994a677aac2f15644df1e0a0534", + "bytes": 116544, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-light-1440-populated-overview.png", + "sha256": "760dd39a7567e0bf895d203402c34aa3cc7f4994a677aac2f15644df1e0a0534", + "bytes": 116544, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "140bdf86a0e3d8d95f4b409da4474b1d27942ea8899c11ee19a2e1601be94415", + "bytes": 15841 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "0f35646d6f793bac5556de7906d52be2a7dbc710267141615c969337572b2dd4", + "bytes": 247294, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-light-1440-long-evidence.png", + "sha256": "0f35646d6f793bac5556de7906d52be2a7dbc710267141615c969337572b2dd4", + "bytes": 247294, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "2a5f1935c4e8ddbd47be73964cb490dc32f3087d7230f7386ba6a7d469045d17", + "bytes": 6040 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "6a3abb5a7860d4cabd79155b6b14f31745b11460c738c6cc21e72c50dc157381", + "bytes": 120746, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-1920-populated-overview.png", + "sha256": "6a3abb5a7860d4cabd79155b6b14f31745b11460c738c6cc21e72c50dc157381", + "bytes": 120746, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "ff66cdef6a1c1427213380396fe09f603bdcdb5478cef1df1dd9dde33bb055e9", + "bytes": 10463 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "8379b4b53169217e7dec875f85336b78ba6a472bf99177a7fdeec61d7b7afad7", + "bytes": 114192, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-1920-long-evidence.png", + "sha256": "8379b4b53169217e7dec875f85336b78ba6a472bf99177a7fdeec61d7b7afad7", + "bytes": 114192, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "416a3fdf25bfe9631a29819d3060060a27811f3fbfb365ca0e6f43697508f663", + "bytes": 5945 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "91f4453c838cd8baafc3044df89894dd153557d1c4c32d45235fd4211c6a5f10", + "bytes": 73791, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-390-unavailable-profile.png", + "sha256": "91f4453c838cd8baafc3044df89894dd153557d1c4c32d45235fd4211c6a5f10", + "bytes": 73791, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "3395ba3449e5cb433bcce98ca25b44da3b82274b72f752130471522eb0f1c4e2", + "bytes": 6109 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "bb4505751989734b278d1d42440d7f4f2c306b7dcf7377e68a03e257ed36be1f", + "bytes": 74199, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-390-unavailable-runs.png", + "sha256": "bb4505751989734b278d1d42440d7f4f2c306b7dcf7377e68a03e257ed36be1f", + "bytes": 74199, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "bd70a06a950d5a9727cdcc47f38c6523848ff3b20c1c81feb898069920a7235f", + "bytes": 6107 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "aac568dda7beb3f13b284d196d6a3686970b2c03bde92189781e4198149bf769", + "bytes": 75557, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-390-unavailable-variants.png", + "sha256": "aac568dda7beb3f13b284d196d6a3686970b2c03bde92189781e4198149bf769", + "bytes": 75557, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "1cf61579d7e4b068a6637706d5c9c10ceee13b4d098768bc4cc6115b289b4b02", + "bytes": 9069 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "1708d2dcac2b554c77b840711183ede606958ab273e22861f9989f4d9d659449", + "bytes": 46901, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-390-pending-evidence-read.png", + "sha256": "1708d2dcac2b554c77b840711183ede606958ab273e22861f9989f4d9d659449", + "bytes": 46901, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "3c7cdfe93e72fecd2bd2e127bad501f151c44abbe5e005113f93b7270ea01c64", + "bytes": 10008 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "ecae840ca920c3b453e5fb6e1694bf06a4422dcec0f759999388a59a2c019d51", + "bytes": 50408, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-390-failed-save-retained-draft.png", + "sha256": "ecae840ca920c3b453e5fb6e1694bf06a4422dcec0f759999388a59a2c019d51", + "bytes": 50408, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "ac1472ace969c0ff3d8c3890fb77df067a0eda0c151fb8b7a5947e5f3c5bd75d", + "bytes": 10190 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "96e3c43398ff9bc99d16f874773fa454c27d736a3d724e4beefc4ecbd38fa2b1", + "bytes": 53220, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-390-failed-delete-retained-row.png", + "sha256": "96e3c43398ff9bc99d16f874773fa454c27d736a3d724e4beefc4ecbd38fa2b1", + "bytes": 53220, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[P7-02 PRES-C01 C02] existing raw source copy and history entry remain read-only", + "name": "native-clipboard-line-endings", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "cab6d7eba877f7301a6a35f692c9f7bf7b68c2561fd38645f2a307ff89ca0ff8", + "bytes": 707 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[P7-02 PRES-C01 C02] existing raw source copy and history entry remain read-only", + "name": "native-career-source-history-entry", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "b0830e51ce1705e603e9481594f0a8909991db954a5779c1d2f0ed292d39c769", + "bytes": 296 + }, + "manualReview": "No individual inspection claimed by collector" + } + ], + "reportErrors": [], + "configuration": { + "version": "1.62.1", + "workers": 1, + "projects": [ + { + "name": "chromium", + "retries": 0 + } + ] + }, + "accessibility": { + "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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "06b9894b40df5b25aadfe47d380ffe29af49c9decc5c9b81a012049f2bd56736", + "bytes": 6792 + }, + "sample": { + "language": "nb", + "theme": "dark", + "width": 320, + "height": 844 + }, + "state": "populated-overview", + "geometry": { + "width": 320, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "a2288f6072ead891375093fa002407fce5c056845ea1d5ff99eb4d4c681368af", + "bytes": 11676 + }, + "sample": { + "language": "nb", + "theme": "dark", + "width": 320, + "height": 844 + }, + "state": "long-evidence", + "geometry": { + "width": 320, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 8 + }, + { + "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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "4967c67ec92d240fa20f82b2bc41c34fcb2e55d5b511e033f45f6407981a06b1", + "bytes": 6679 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 360, + "height": 800 + }, + "state": "populated-overview", + "geometry": { + "width": 360, + "height": 800, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "7ecb060300192a0c5b9827b24ebab835fbdd5648215cf9eaa9aea4bc0b37fb4d", + "bytes": 11585 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 360, + "height": 800 + }, + "state": "long-evidence", + "geometry": { + "width": 360, + "height": 800, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 8 + }, + { + "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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "c2c8a7cdb3177360635095b74bcd6cf5e881448133b357f38da9b8b8100461c5", + "bytes": 6796 + }, + "sample": { + "language": "nb", + "theme": "light", + "width": 390, + "height": 844 + }, + "state": "populated-overview", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "d73b176c5a2750dd55ea1ddbe49ac868c6c38ac07b9924af78c11b096bb1ea6d", + "bytes": 11677 + }, + "sample": { + "language": "nb", + "theme": "light", + "width": 390, + "height": 844 + }, + "state": "long-evidence", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 8 + }, + { + "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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "79e22aff21539affadbdfeb0a37132d4624bae7bc6550eaceccd4f4b42b60b0e", + "bytes": 5998 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 768, + "height": 1024 + }, + "state": "populated-overview", + "geometry": { + "width": 768, + "height": 1024, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "89d50b7618ebb51a50935bbbfc564f70b252b930e8974eea64ab72ff04a77df3", + "bytes": 10419 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 768, + "height": 1024 + }, + "state": "long-evidence", + "geometry": { + "width": 768, + "height": 1024, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "9416274400aef9ef072254ba01914c44daa7324f876cd7b07273a3c62e485003", + "bytes": 6194 + }, + "sample": { + "language": "nb", + "theme": "dark", + "width": 1024, + "height": 768 + }, + "state": "populated-overview", + "geometry": { + "width": 1024, + "height": 768, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "ab06eb0e4f2ed956cd36c9328f2dc64d096e623d9ec076204207137fb99e12fa", + "bytes": 10595 + }, + "sample": { + "language": "nb", + "theme": "dark", + "width": 1024, + "height": 768 + }, + "state": "long-evidence", + "geometry": { + "width": 1024, + "height": 768, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "1147566317d407fa4f55a29daebd710a06b5e2ed6919d694706ded2f7d4f9add", + "bytes": 6086 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 1280, + "height": 320 + }, + "state": "populated-overview", + "geometry": { + "width": 1280, + "height": 320, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "09f2a02a6783ff589b05c4221cf3fdb73ed096ad649bdeb9514797224f9420ef", + "bytes": 10509 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 1280, + "height": 320 + }, + "state": "long-evidence", + "geometry": { + "width": 1280, + "height": 320, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "b17107c4aa02114c5f96d80b4e195a207b17cce2462cf047226de37c5baf81d6", + "bytes": 6195 + }, + "sample": { + "language": "nb", + "theme": "light", + "width": 1440, + "height": 900 + }, + "state": "populated-overview", + "geometry": { + "width": 1440, + "height": 900, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "140bdf86a0e3d8d95f4b409da4474b1d27942ea8899c11ee19a2e1601be94415", + "bytes": 15841 + }, + "sample": { + "language": "nb", + "theme": "light", + "width": 1440, + "height": 900 + }, + "state": "long-evidence", + "geometry": { + "width": 1440, + "height": 900, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "2a5f1935c4e8ddbd47be73964cb490dc32f3087d7230f7386ba6a7d469045d17", + "bytes": 6040 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 1920, + "height": 1080 + }, + "state": "populated-overview", + "geometry": { + "width": 1920, + "height": 1080, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "ff66cdef6a1c1427213380396fe09f603bdcdb5478cef1df1dd9dde33bb055e9", + "bytes": 10463 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 1920, + "height": 1080 + }, + "state": "long-evidence", + "geometry": { + "width": 1920, + "height": 1080, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "416a3fdf25bfe9631a29819d3060060a27811f3fbfb365ca0e6f43697508f663", + "bytes": 5945 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 390, + "height": 844 + }, + "state": "unavailable-profile", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "3395ba3449e5cb433bcce98ca25b44da3b82274b72f752130471522eb0f1c4e2", + "bytes": 6109 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 390, + "height": 844 + }, + "state": "unavailable-runs", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "bd70a06a950d5a9727cdcc47f38c6523848ff3b20c1c81feb898069920a7235f", + "bytes": 6107 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 390, + "height": 844 + }, + "state": "unavailable-variants", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "1cf61579d7e4b068a6637706d5c9c10ceee13b4d098768bc4cc6115b289b4b02", + "bytes": 9069 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 390, + "height": 844 + }, + "state": "pending-evidence-read", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "3c7cdfe93e72fecd2bd2e127bad501f151c44abbe5e005113f93b7270ea01c64", + "bytes": 10008 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 390, + "height": 844 + }, + "state": "failed-save-retained-draft", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "ac1472ace969c0ff3d8c3890fb77df067a0eda0c151fb8b7a5947e5f3c5bd75d", + "bytes": 10190 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 390, + "height": 844 + }, + "state": "failed-delete-retained-row", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 8 + } + ], + "ruleNodeCounts": [ + { + "kind": "incomplete", + "rule": "aria-hidden-focus", + "nodes": 3 + }, + { + "kind": "incomplete", + "rule": "color-contrast", + "nodes": 96 + } + ], + "contexts": [ + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "aria-hidden-focus", + "target": [ + "#menu-" + ], + "checks": [ + { + "vector": "all", + "id": "focusable-modal-open", + "message": "Check that focusable elements are not tabbable in the current state", + "messageKey": null + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".css-1f6076n > .MuiSelect-select.MuiSelect-outlined.css-1ehla7j" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1h_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1m_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "aria-hidden-focus", + "target": [ + "#menu-" + ], + "checks": [ + { + "vector": "all", + "id": "focusable-modal-open", + "message": "Check that focusable elements are not tabbable in the current state", + "messageKey": null + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".css-1f6076n > .MuiSelect-select.MuiSelect-outlined.css-1ehla7j" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1h_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1m_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "aria-hidden-focus", + "target": [ + "#menu-" + ], + "checks": [ + { + "vector": "all", + "id": "focusable-modal-open", + "message": "Check that focusable elements are not tabbable in the current state", + "messageKey": null + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".css-1f6076n > .MuiSelect-select.MuiSelect-outlined.css-1ehla7j" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1h_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1m_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1h_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1m_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1g_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1i_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1g_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1i_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1g_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1i_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1g_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1i_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "div[aria-labelledby=\"career-workspace-section-label\"]" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_t_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_v_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_10_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_11_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_12_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "div[aria-labelledby=\"career-workspace-section-label\"]" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_t_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_v_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_10_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_11_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_12_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiButton-sizeMedium" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "div[aria-labelledby=\"career-workspace-section-label\"]" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_t_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_v_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_10_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_11_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_12_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiButton-textError" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + } + ], + "triage": { + "scans": 22, + "violationNodes": 0, + "incompleteNodes": 99, + "colorContrast": { + "backgroundOverlap": 74, + "invisibleBadgeShortText": 22 + }, + "hiddenFocus": { + "occurrences": 3, + "target": "#menu-", + "context": "Retained hidden MUI section-select portal in320/360/390 evidence states; actual section selection/subsequent form keyboard pass. Contextual M09/M11 remains required." + }, + "qualification": "All findings retained; overlap/short text are incomplete measurement, not computed contrast passes. Actual reader/contrast/forced-colors/device conformance NOT VERIFIED." + }, + "qualification": "Every rule/node occurrence summarized; full HTML/data/relatedNodes/check vectors remain in exact raw report and identified audit attachment hashes. No conformance claim." + } + }, + "nativeAttempts": [ + { + "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-12T00:10:38.836345+00:00", + "finishedUtc": "2026-10-12T00:11:40.317358+00:00", + "exitCode": 1, + "failureLog": "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\career.log", + "stats": { + "startTime": "2026-10-12T00:10:39.336Z", + "duration": 60927.596999999994, + "expected": 12, + "skipped": 0, + "unexpected": 2, + "flaky": 0 + } + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career-command.json", + "sha256": "ca5c0b2fb0c7245fea18cafc8b47b12ed1e2fd32d77bced625e58046c0a7e6a8", + "bytes": 759, + "hashPolicy": "Exact measured raw bytes" + }, + "reportRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career.json", + "sha256": "46e36affe573e409d788015d3b2b32682fe6e2df95126c3c63f82854605fb06f", + "bytes": 2883240, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career.log", + "sha256": "88daf8454903dc8fbde8af013e023c09e1a0e5e27457b1d68d3b285ecb12711c", + "bytes": 9916, + "hashPolicy": "Exact measured raw bytes" + }, + "stats": { + "startTime": "2026-10-12T00:10:39.336Z", + "duration": 60927.596999999994, + "expected": 12, + "skipped": 0, + "unexpected": 2, + "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": 949 + }, + { + "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": 4375 + }, + { + "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": 4163 + }, + { + "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": 3782 + }, + { + "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": 4044 + }, + { + "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": 4194 + }, + { + "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": 4364 + }, + { + "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": 4572 + }, + { + "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": 4472 + }, + { + "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": 2258 + }, + { + "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": 2226 + }, + { + "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": 2239 + }, + { + "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": [ + "failed" + ], + "retries": [ + 0 + ], + "errors": [ + [ + { + "location": { + "file": "E:\\Storage\\Projects\\Active\\Job tracker\\job-tracker-ui\\e2e\\phase7-career-overview.spec.ts", + "column": 24, + "line": 302 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeFocused\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: getByRole('article').filter({ hasText: 'Reviewed project — æøå' }).getByRole('button')\nExpected: focused\nReceived: inactive\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toBeFocused\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for getByRole('article').filter({ hasText: 'Reviewed project — æøå' }).getByRole('button')\u001b[22m\n\u001b[2m 11 × locator resolved to \u001b[22m\n\u001b[2m - unexpected value \"inactive\"\u001b[22m\n\n\n 300 | await expect(dialog).toBeVisible();\n 301 | await dialog.getByRole('button', { name: t.cancel, exact: true }).click();\n> 302 | await expect(remove).toBeFocused();\n | ^\n 303 | expect(await (await page.request.get(`${apiUrl}/career/evidence`)).json()).toEqual([item]);\n 304 | await remove.click();\n 305 | const deleted = page.waitForResponse(response => response.url() === `${apiUrl}/career/evidence/${item.id}` && response.request().method() === 'DELETE');\n at E:\\Storage\\Projects\\Active\\Job tracker\\job-tracker-ui\\e2e\\phase7-career-overview.spec.ts:302:24" + } + ] + ], + "durationMs": 9034 + }, + { + "title": "[P7-02 PRES-C01 C02] existing raw source copy and history entry remain read-only", + "file": "phase7-career-overview.spec.ts", + "line": 315, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "failed" + ], + "retries": [ + 0 + ], + "errors": [ + [ + { + "location": { + "file": "E:\\Storage\\Projects\\Active\\Job tracker\\job-tracker-ui\\e2e\\phase7-career-overview.spec.ts", + "column": 69, + "line": 329 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\n\u001b[32m- Expected - 2\u001b[39m\n\u001b[31m+ Received + 2\u001b[39m\n\n\u001b[32m- Exact raw source — æøå\u001b[39m\n\u001b[31m+ Exact raw source — æøå\u001b[7m\r\u001b[27m\u001b[39m\n\u001b[32m- A supported owner claim.\u001b[39m\n\u001b[31m+ A supported owner claim.\u001b[7m\r\u001b[27m\u001b[39m\n\u001b[2m ↵\u001b[22m\n\n 327 | await page.getByRole('button', { name: new RegExp(t.profileCvRawPanelTitle) }).click();\n 328 | await page.getByRole('button', { name: t.profileCopyCvText, exact: true }).click();\n> 329 | expect(await page.evaluate(() => navigator.clipboard.readText())).toBe(raw);\n | ^\n 330 | await navigateSection(page, 'en', 'profile');\n 331 | const label = t.profileCvVersionHistory.replace('{count}', String(history.length));\n 332 | await page.getByRole('button', { name: label, exact: true }).click();\n at E:\\Storage\\Projects\\Active\\Job tracker\\job-tracker-ui\\e2e\\phase7-career-overview.spec.ts:329:69" + } + ] + ], + "durationMs": 2063 + } + ], + "attachments": [ + { + "test": "[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation", + "name": "native-evidence-owner-provider-contract", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "e4586eb2bd4f1c19fc742080a1f7a375238bc7baebf3516ca7f3c1d59cf6fe27", + "bytes": 267 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "06b9894b40df5b25aadfe47d380ffe29af49c9decc5c9b81a012049f2bd56736", + "bytes": 6792 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "46270abbe1bfd3f1d4c3d75a5feb3f536f31660725a7b00fff3335827e99a24d", + "bytes": 86185 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "a2288f6072ead891375093fa002407fce5c056845ea1d5ff99eb4d4c681368af", + "bytes": 11676 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "754ccbb181f061205466b9851ece8f7541ba487f3a1c1cfa4944316802775e10", + "bytes": 79872 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "4967c67ec92d240fa20f82b2bc41c34fcb2e55d5b511e033f45f6407981a06b1", + "bytes": 6679 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "064f05f5bfaaebeeb314ff4f26fd7bd53c879d4f95377cd41520ef87520f73d9", + "bytes": 84594 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "7ecb060300192a0c5b9827b24ebab835fbdd5648215cf9eaa9aea4bc0b37fb4d", + "bytes": 11585 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "8090f7c66c4372689ee7e349bc37ba394d7e75addc689458fbd2d8e3924f7cc0", + "bytes": 70567 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "c2c8a7cdb3177360635095b74bcd6cf5e881448133b357f38da9b8b8100461c5", + "bytes": 6796 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "0ddf1641e174ed0123e6a6a368cd4ddae02b7e16dd53088a28f7c74445cd79df", + "bytes": 86576 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "d73b176c5a2750dd55ea1ddbe49ac868c6c38ac07b9924af78c11b096bb1ea6d", + "bytes": 11677 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "05abccf36e7a8bf3a2ae5a82d34b59f1b68b9dd4f5b4d384101a04b0688b47f2", + "bytes": 71192 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "79e22aff21539affadbdfeb0a37132d4624bae7bc6550eaceccd4f4b42b60b0e", + "bytes": 5998 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "20258c36363096d061444d6cdae229160244463fc2de75992348d3c006b56394", + "bytes": 94494 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "89d50b7618ebb51a50935bbbfc564f70b252b930e8974eea64ab72ff04a77df3", + "bytes": 10419 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "4cc481d28dfb9d0439dc6900ba57541ee663ebd12136b323b18a083dc8a82a71", + "bytes": 83945 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "9416274400aef9ef072254ba01914c44daa7324f876cd7b07273a3c62e485003", + "bytes": 6194 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "8f14239e54330b758e44f51375443bc195d6a224bc1ad8060e2c01b1fb3fd882", + "bytes": 119929 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "ab06eb0e4f2ed956cd36c9328f2dc64d096e623d9ec076204207137fb99e12fa", + "bytes": 10595 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "2e36dde54994e305d1b5922b25a67dfe9f33154a2ff20ee9509357d28673393f", + "bytes": 111033 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "1147566317d407fa4f55a29daebd710a06b5e2ed6919d694706ded2f7d4f9add", + "bytes": 6086 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "79fbe45c8baa5055c83064c784a6d6c57cf8cdc6aadf08abf39999803f7b6f66", + "bytes": 103077 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "09f2a02a6783ff589b05c4221cf3fdb73ed096ad649bdeb9514797224f9420ef", + "bytes": 10509 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "6d9214dac60776c42d1925ac1f774c56a6ab1172b914664985009c47af0cf365", + "bytes": 96543 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "b17107c4aa02114c5f96d80b4e195a207b17cce2462cf047226de37c5baf81d6", + "bytes": 6195 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "397ad0abbcdaf8e71a0a045e0bf87ef6986ae480489690a4635b2fa8d40db52b", + "bytes": 116772 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "140bdf86a0e3d8d95f4b409da4474b1d27942ea8899c11ee19a2e1601be94415", + "bytes": 15841 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "24ccdd435747dc0e89910fd583732347b1bb9daaf816adcef82c94718ae8d8a2", + "bytes": 247513 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "2a5f1935c4e8ddbd47be73964cb490dc32f3087d7230f7386ba6a7d469045d17", + "bytes": 6040 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "171b8cca708f6c15c1cd13266228f9d26a5741b44072d79b863551f9e0cdf935", + "bytes": 120978 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "ff66cdef6a1c1427213380396fe09f603bdcdb5478cef1df1dd9dde33bb055e9", + "bytes": 10463 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "5d9a195c81528a95331310219e9494b9a0459186990c974a884f1fc98f5210e8", + "bytes": 114417 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "416a3fdf25bfe9631a29819d3060060a27811f3fbfb365ca0e6f43697508f663", + "bytes": 5945 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "91f4453c838cd8baafc3044df89894dd153557d1c4c32d45235fd4211c6a5f10", + "bytes": 73791 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "3395ba3449e5cb433bcce98ca25b44da3b82274b72f752130471522eb0f1c4e2", + "bytes": 6109 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "bb4505751989734b278d1d42440d7f4f2c306b7dcf7377e68a03e257ed36be1f", + "bytes": 74199 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "bd70a06a950d5a9727cdcc47f38c6523848ff3b20c1c81feb898069920a7235f", + "bytes": 6107 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "aac568dda7beb3f13b284d196d6a3686970b2c03bde92189781e4198149bf769", + "bytes": 75557 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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-audit", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "55f6995b78a0185a3151c93cd7973a7d8a7f177303619fe8a2d33bc19a002bc2", + "bytes": 9974 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "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", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "ecae840ca920c3b453e5fb6e1694bf06a4422dcec0f759999388a59a2c019d51", + "bytes": 50408 + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion", + "name": "screenshot", + "contentType": "image/png", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career-results/phase7-career-overview--P7-188cd-llation-and-actual-deletion-chromium/test-failed-1.png", + "sha256": "5fa81920eca34286d7d355abba50ff451b573f9b6e0f37e63fda8914a96910ff", + "bytes": 36021, + "hashPolicy": "Exact measured raw bytes" + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion", + "name": "error-context", + "contentType": "text/markdown", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career-results/phase7-career-overview--P7-188cd-llation-and-actual-deletion-chromium/error-context.md", + "sha256": "b3c2ba0db3a2bbe6f6d690866ed9ae7b45ce69b00cf0ac13d56adc3fd5196b87", + "bytes": 13115, + "hashPolicy": "Exact measured raw bytes" + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion", + "name": "trace", + "contentType": "application/zip", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career-results/phase7-career-overview--P7-188cd-llation-and-actual-deletion-chromium/trace.zip", + "sha256": "ccd093f90aa50f7bfec621745502117aa103b7084599cf293f2d3ef2e47ea67a", + "bytes": 2086391, + "hashPolicy": "Exact measured raw bytes" + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[P7-02 PRES-C01 C02] existing raw source copy and history entry remain read-only", + "name": "screenshot", + "contentType": "image/png", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career-results/phase7-career-overview--P7-c8232-tory-entry-remain-read-only-chromium/test-failed-1.png", + "sha256": "957b8bc69bdfe9fd2d09fbe770b487c5849c535df0832358f18a720c21ca65c4", + "bytes": 81911, + "hashPolicy": "Exact measured raw bytes" + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[P7-02 PRES-C01 C02] existing raw source copy and history entry remain read-only", + "name": "error-context", + "contentType": "text/markdown", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career-results/phase7-career-overview--P7-c8232-tory-entry-remain-read-only-chromium/error-context.md", + "sha256": "80ea04640333ef64699c1afc87aa46830b73446c9061c8096c2d62db55b1e103", + "bytes": 17646, + "hashPolicy": "Exact measured raw bytes" + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[P7-02 PRES-C01 C02] existing raw source copy and history entry remain read-only", + "name": "trace", + "contentType": "application/zip", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/attempts/career-001905/career-results/phase7-career-overview--P7-c8232-tory-entry-remain-read-only-chromium/trace.zip", + "sha256": "c124e61adcbc7e13e21edde64e5a93bc9461e9e60a342d30450429498e962203", + "bytes": 679560, + "hashPolicy": "Exact measured raw bytes" + }, + "manualReview": "No individual inspection claimed by collector" + } + ], + "reportErrors": [], + "configuration": { + "version": "1.62.1", + "workers": 1, + "projects": [ + { + "name": "chromium", + "retries": 0 + } + ] + }, + "accessibility": { + "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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "06b9894b40df5b25aadfe47d380ffe29af49c9decc5c9b81a012049f2bd56736", + "bytes": 6792 + }, + "sample": { + "language": "nb", + "theme": "dark", + "width": 320, + "height": 844 + }, + "state": "populated-overview", + "geometry": { + "width": 320, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "a2288f6072ead891375093fa002407fce5c056845ea1d5ff99eb4d4c681368af", + "bytes": 11676 + }, + "sample": { + "language": "nb", + "theme": "dark", + "width": 320, + "height": 844 + }, + "state": "long-evidence", + "geometry": { + "width": 320, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 8 + }, + { + "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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "4967c67ec92d240fa20f82b2bc41c34fcb2e55d5b511e033f45f6407981a06b1", + "bytes": 6679 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 360, + "height": 800 + }, + "state": "populated-overview", + "geometry": { + "width": 360, + "height": 800, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "7ecb060300192a0c5b9827b24ebab835fbdd5648215cf9eaa9aea4bc0b37fb4d", + "bytes": 11585 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 360, + "height": 800 + }, + "state": "long-evidence", + "geometry": { + "width": 360, + "height": 800, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 8 + }, + { + "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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "c2c8a7cdb3177360635095b74bcd6cf5e881448133b357f38da9b8b8100461c5", + "bytes": 6796 + }, + "sample": { + "language": "nb", + "theme": "light", + "width": 390, + "height": 844 + }, + "state": "populated-overview", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "d73b176c5a2750dd55ea1ddbe49ac868c6c38ac07b9924af78c11b096bb1ea6d", + "bytes": 11677 + }, + "sample": { + "language": "nb", + "theme": "light", + "width": 390, + "height": 844 + }, + "state": "long-evidence", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 8 + }, + { + "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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "79e22aff21539affadbdfeb0a37132d4624bae7bc6550eaceccd4f4b42b60b0e", + "bytes": 5998 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 768, + "height": 1024 + }, + "state": "populated-overview", + "geometry": { + "width": 768, + "height": 1024, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "89d50b7618ebb51a50935bbbfc564f70b252b930e8974eea64ab72ff04a77df3", + "bytes": 10419 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 768, + "height": 1024 + }, + "state": "long-evidence", + "geometry": { + "width": 768, + "height": 1024, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "9416274400aef9ef072254ba01914c44daa7324f876cd7b07273a3c62e485003", + "bytes": 6194 + }, + "sample": { + "language": "nb", + "theme": "dark", + "width": 1024, + "height": 768 + }, + "state": "populated-overview", + "geometry": { + "width": 1024, + "height": 768, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "ab06eb0e4f2ed956cd36c9328f2dc64d096e623d9ec076204207137fb99e12fa", + "bytes": 10595 + }, + "sample": { + "language": "nb", + "theme": "dark", + "width": 1024, + "height": 768 + }, + "state": "long-evidence", + "geometry": { + "width": 1024, + "height": 768, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "1147566317d407fa4f55a29daebd710a06b5e2ed6919d694706ded2f7d4f9add", + "bytes": 6086 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 1280, + "height": 320 + }, + "state": "populated-overview", + "geometry": { + "width": 1280, + "height": 320, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "09f2a02a6783ff589b05c4221cf3fdb73ed096ad649bdeb9514797224f9420ef", + "bytes": 10509 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 1280, + "height": 320 + }, + "state": "long-evidence", + "geometry": { + "width": 1280, + "height": 320, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "b17107c4aa02114c5f96d80b4e195a207b17cce2462cf047226de37c5baf81d6", + "bytes": 6195 + }, + "sample": { + "language": "nb", + "theme": "light", + "width": 1440, + "height": 900 + }, + "state": "populated-overview", + "geometry": { + "width": 1440, + "height": 900, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "140bdf86a0e3d8d95f4b409da4474b1d27942ea8899c11ee19a2e1601be94415", + "bytes": 15841 + }, + "sample": { + "language": "nb", + "theme": "light", + "width": 1440, + "height": 900 + }, + "state": "long-evidence", + "geometry": { + "width": 1440, + "height": 900, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "2a5f1935c4e8ddbd47be73964cb490dc32f3087d7230f7386ba6a7d469045d17", + "bytes": 6040 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 1920, + "height": 1080 + }, + "state": "populated-overview", + "geometry": { + "width": 1920, + "height": 1080, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "ff66cdef6a1c1427213380396fe09f603bdcdb5478cef1df1dd9dde33bb055e9", + "bytes": 10463 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 1920, + "height": 1080 + }, + "state": "long-evidence", + "geometry": { + "width": 1920, + "height": 1080, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "416a3fdf25bfe9631a29819d3060060a27811f3fbfb365ca0e6f43697508f663", + "bytes": 5945 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 390, + "height": 844 + }, + "state": "unavailable-profile", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "3395ba3449e5cb433bcce98ca25b44da3b82274b72f752130471522eb0f1c4e2", + "bytes": 6109 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 390, + "height": 844 + }, + "state": "unavailable-runs", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "bd70a06a950d5a9727cdcc47f38c6523848ff3b20c1c81feb898069920a7235f", + "bytes": 6107 + }, + "sample": { + "language": "en", + "theme": "dark", + "width": 390, + "height": 844 + }, + "state": "unavailable-variants", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 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-failed-save-retained-draft-audit", + "rawAudit": { + "storage": "Base64 attachment in raw report", + "sha256": "55f6995b78a0185a3151c93cd7973a7d8a7f177303619fe8a2d33bc19a002bc2", + "bytes": 9974 + }, + "sample": { + "language": "en", + "theme": "light", + "width": 390, + "height": 844 + }, + "state": "failed-save-retained-draft", + "geometry": { + "width": 390, + "height": 844, + "rootOverflow": 0 + }, + "violationNodes": 0, + "incompleteNodes": 8 + } + ], + "ruleNodeCounts": [ + { + "kind": "incomplete", + "rule": "aria-hidden-focus", + "nodes": 3 + }, + { + "kind": "incomplete", + "rule": "color-contrast", + "nodes": 81 + } + ], + "contexts": [ + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "aria-hidden-focus", + "target": [ + "#menu-" + ], + "checks": [ + { + "vector": "all", + "id": "focusable-modal-open", + "message": "Check that focusable elements are not tabbable in the current state", + "messageKey": null + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".css-1f6076n > .MuiSelect-select.MuiSelect-outlined.css-1ehla7j" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1h_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1m_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "aria-hidden-focus", + "target": [ + "#menu-" + ], + "checks": [ + { + "vector": "all", + "id": "focusable-modal-open", + "message": "Check that focusable elements are not tabbable in the current state", + "messageKey": null + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".css-1f6076n > .MuiSelect-select.MuiSelect-outlined.css-1ehla7j" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1h_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1m_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "aria-hidden-focus", + "target": [ + "#menu-" + ], + "checks": [ + { + "vector": "all", + "id": "focusable-modal-open", + "message": "Check that focusable elements are not tabbable in the current state", + "messageKey": null + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".css-1f6076n > .MuiSelect-select.MuiSelect-outlined.css-1ehla7j" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1h_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1m_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1h_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1m_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1g_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1i_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1g_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1i_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1g_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1i_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".Mui-selected.MuiTab-root.MuiTab-textColorPrimary" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1g_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1i_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1j_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1k_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_1l_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiSelect-select" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiBadge-badge" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "messageKey": "shortTextContent" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "div[aria-labelledby=\"career-workspace-section-label\"]" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_t_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_v_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_10_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_11_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + "#_r_12_" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + }, + { + "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", + "kind": "incomplete", + "rule": "color-contrast", + "target": [ + ".MuiButton-sizeMedium" + ], + "checks": [ + { + "vector": "any", + "id": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "messageKey": "bgOverlap" + } + ] + } + ], + "triage": "PENDING actual contextual review", + "qualification": "Every rule/node occurrence summarized; full HTML/data/relatedNodes/check vectors remain in exact raw report and identified audit attachment hashes. No conformance claim." + } + } + ], + "unitHistory": [ + { + "result": { + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-cancel-red-20261012T001301Z.json", + "sha256": "200b9a5d30c6df0fed9387f5e2b0b7a76beec80b9cf2c456fb316f8940706d14", + "bytes": 3997, + "hashPolicy": "Exact measured raw bytes" + }, + "startedUnixMs": 1791763982237, + "passed": 8, + "failed": 0, + "pending": 0, + "total": 8, + "suites": 1, + "cases": [ + { + "name": "saves factual evidence with provenance and tags", + "status": "passed" + }, + { + "name": "pending evidence reads announce loading without claiming an empty bank or allowing a raced save", + "status": "passed" + }, + { + "name": "failed list reads remain distinct from empty state and retry only GET while preserving the draft", + "status": "passed" + }, + { + "name": "failed saves retain factual inputs and retry the same explicit save without reloading the list", + "status": "passed" + }, + { + "name": "a pending save prevents duplicate writes and prevents edits being cleared by the response", + "status": "passed" + }, + { + "name": "contextual deletion is named and cancellation performs no writes or draft loss", + "status": "passed" + }, + { + "name": "failed deletion keeps the row and draft, then reconfirms the same delete without list reload", + "status": "passed" + }, + { + "name": "evidence sections and factual fields have semantic headings and required labels in Bokmål", + "status": "passed" + } + ] + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-cancel-red-20261012T001301Z-command.json", + "sha256": "e7c5cf375be5b1ec8f4dc3eb6fc9d87042f7c21ac601f06659d0bd6e03885f50", + "bytes": 639, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-cancel-red-20261012T001301Z.log", + "sha256": "d18214f689d74be4c520b4c101647799f009f6c5bc4b779bc8b551d58dd1a9e5", + "bytes": 3760, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "result": { + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-cancel-red-20261012T001324Z.json", + "sha256": "8f0c0dd0e048221579ca7a5e97b4b68880893a2f81fc4eda5132da1abe4e1d94", + "bytes": 6664, + "hashPolicy": "Exact measured raw bytes" + }, + "startedUnixMs": 1791764005340, + "passed": 7, + "failed": 1, + "pending": 0, + "total": 8, + "suites": 1, + "cases": [ + { + "name": "saves factual evidence with provenance and tags", + "status": "passed" + }, + { + "name": "pending evidence reads announce loading without claiming an empty bank or allowing a raced save", + "status": "passed" + }, + { + "name": "failed list reads remain distinct from empty state and retry only GET while preserving the draft", + "status": "passed" + }, + { + "name": "failed saves retain factual inputs and retry the same explicit save without reloading the list", + "status": "passed" + }, + { + "name": "a pending save prevents duplicate writes and prevents edits being cleared by the response", + "status": "passed" + }, + { + "name": "contextual deletion is named and cancellation performs no writes or draft loss", + "status": "failed" + }, + { + "name": "failed deletion keeps the row and draft, then reconfirms the same delete without list reload", + "status": "passed" + }, + { + "name": "evidence sections and factual fields have semantic headings and required labels in Bokmål", + "status": "passed" + } + ] + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-cancel-red-20261012T001324Z-command.json", + "sha256": "3f57ee0da4b62f52dacb0e64542c423a0a5b265957820bd2782e69bc3c01aba2", + "bytes": 639, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-cancel-red-20261012T001324Z.log", + "sha256": "6dfdf34a457035416bd09ea67fae93d435cf3ffe363eeed36aac8a36ab0997a1", + "bytes": 5015, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "result": { + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-green-20261012T000751Z.json", + "sha256": "312bba894107d3b00ea1f3d5fefa0b595d70a405a66dc68e7c2ab31806ce69ea", + "bytes": 40497, + "hashPolicy": "Exact measured raw bytes" + }, + "startedUnixMs": 1791763672737, + "passed": 45, + "failed": 1, + "pending": 0, + "total": 46, + "suites": 3, + "cases": [ + { + "name": "saves factual evidence with provenance and tags", + "status": "passed" + }, + { + "name": "pending evidence reads announce loading without claiming an empty bank or allowing a raced save", + "status": "passed" + }, + { + "name": "failed list reads remain distinct from empty state and retry only GET while preserving the draft", + "status": "passed" + }, + { + "name": "failed saves retain factual inputs and retry the same explicit save without reloading the list", + "status": "passed" + }, + { + "name": "a pending save prevents duplicate writes and prevents edits being cleared by the response", + "status": "passed" + }, + { + "name": "contextual deletion is named and cancellation performs no writes or draft loss", + "status": "passed" + }, + { + "name": "failed deletion keeps the row and draft, then reconfirms the same delete without list reload", + "status": "passed" + }, + { + "name": "evidence sections and factual fields have semantic headings and required labels in Bokmål", + "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": "overview retry cannot overwrite a dirty canonical draft after a failed source refresh", + "status": "passed" + }, + { + "name": "visited evidence keeps its draft across sections without an unvisited or repeated list request", + "status": "failed" + }, + { + "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" + } + ] + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-green-20261012T000751Z-command.json", + "sha256": "4f97a6141ce7e355b93692643a87f62350e78601c3b04d9f77591282f623948d", + "bytes": 712, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-green-20261012T000751Z.log", + "sha256": "22fdac29e72365c40d564cdce486dc8eafd77e240a86cbc18195f460b65315e9", + "bytes": 9691, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "result": { + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-green-20261012T000837Z.json", + "sha256": "0c8fb24208b8fe2346a0ffaa64cc2b0552793075975be2609ee25663ef8f04d6", + "bytes": 19282, + "hashPolicy": "Exact measured raw bytes" + }, + "startedUnixMs": 1791763718762, + "passed": 46, + "failed": 0, + "pending": 0, + "total": 46, + "suites": 3, + "cases": [ + { + "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": "overview retry cannot overwrite a dirty canonical draft after a failed source refresh", + "status": "passed" + }, + { + "name": "visited evidence keeps its draft across sections without an unvisited or repeated list request", + "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": "saves factual evidence with provenance and tags", + "status": "passed" + }, + { + "name": "pending evidence reads announce loading without claiming an empty bank or allowing a raced save", + "status": "passed" + }, + { + "name": "failed list reads remain distinct from empty state and retry only GET while preserving the draft", + "status": "passed" + }, + { + "name": "failed saves retain factual inputs and retry the same explicit save without reloading the list", + "status": "passed" + }, + { + "name": "a pending save prevents duplicate writes and prevents edits being cleared by the response", + "status": "passed" + }, + { + "name": "contextual deletion is named and cancellation performs no writes or draft loss", + "status": "passed" + }, + { + "name": "failed deletion keeps the row and draft, then reconfirms the same delete without list reload", + "status": "passed" + }, + { + "name": "evidence sections and factual fields have semantic headings and required labels in Bokmål", + "status": "passed" + } + ] + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-green-20261012T000837Z-command.json", + "sha256": "c1115f1308ac044157f2a2031c6c325365acbf93acb394d32af35f93ad8d3f3a", + "bytes": 712, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-green-20261012T000837Z.log", + "sha256": "c93182b84da9062be9004fd77a809816eccadea2e2592203903f13527b9f220b", + "bytes": 697, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "result": { + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-red-20261012T000336Z.json", + "sha256": "ae2d426ef59861105e3eb8cc648d5da43f9d53a01a77e0be763576dde655d12e", + "bytes": 372884, + "hashPolicy": "Exact measured raw bytes" + }, + "startedUnixMs": 1791763417506, + "passed": 8, + "failed": 14, + "pending": 0, + "total": 22, + "suites": 2, + "cases": [ + { + "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": "failed" + }, + { + "name": "an unknown import read cannot claim no imports, completion or first-run guidance", + "status": "failed" + }, + { + "name": "a failed import read stays unknown and keeps its own retry separate from the profile read", + "status": "failed" + }, + { + "name": "failed recent-CV reads do not imply first-run and retry the same list without writes", + "status": "failed" + }, + { + "name": "the parent exposes failed import-read retry without canonical saves or history restores", + "status": "failed" + }, + { + "name": "overview retry cannot overwrite a dirty canonical draft after a failed source refresh", + "status": "failed" + }, + { + "name": "visited evidence keeps its draft across sections without an unvisited or repeated list request", + "status": "failed" + }, + { + "name": "saves factual evidence with provenance and tags", + "status": "passed" + }, + { + "name": "pending evidence reads announce loading without claiming an empty bank or allowing a raced save", + "status": "failed" + }, + { + "name": "failed list reads remain distinct from empty state and retry only GET while preserving the draft", + "status": "failed" + }, + { + "name": "failed saves retain factual inputs and retry the same explicit save without reloading the list", + "status": "failed" + }, + { + "name": "a pending save prevents duplicate writes and prevents edits being cleared by the response", + "status": "failed" + }, + { + "name": "contextual deletion is named and cancellation performs no writes or draft loss", + "status": "failed" + }, + { + "name": "failed deletion keeps the row and draft, then reconfirms the same delete without list reload", + "status": "failed" + }, + { + "name": "evidence sections and factual fields have semantic headings and required labels in Bokmål", + "status": "failed" + } + ] + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-red-20261012T000336Z-command.json", + "sha256": "8d1af878382d923158b8ce46d5a01bf5bb9f66b6bfb5d212018817bb9f9c7ec0", + "bytes": 676, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/unit/career-red-20261012T000336Z.log", + "sha256": "f1b63e59b3350d0b004d278daf4df4a0373614840d85ad1e661a16a5ead8e6e3", + "bytes": 188800, + "hashPolicy": "Exact measured raw bytes" + } + } + ], + "firstFailedManifest": { + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/history/first-12-pass-2-fail-manifest.json", + "sha256": "0f82daa6e221fdfac928dbe0ff401260850a1f4c33122711f5da19f62c3b8a62", + "bytes": 157567, + "hashPolicy": "Exact measured raw bytes" + }, + "qualification": "Historical PENDING12pass/2fail report/source observations; original paths are unchanged inside this raw manifest. Archived raw native attempts provide exact result/trace files; this capsule is not final source/build or acceptance evidence." + }, + "firstCompiledExport": { + "archive": { + "path": ".artifacts/phase7/p7-02/career-final/history/first-build/archive.json", + "sha256": "064346e0713a0804334a64064e7615448ac519e71f1310d7bf401ef1d525227d", + "bytes": 25439, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "buildIdRaw": { + "path": ".artifacts/phase7/p7-02/career-final/history/first-build/BUILD_ID", + "sha256": "b537028fb1d1a05f9a6f22afcbdbad85581099bfc2e05b22a0a1f4a9797b8943", + "bytes": 21, + "hashPolicy": "Exact measured raw bytes" + }, + "qualification": "Exact historical75-file compiled export matches first PENDING digest; original pre-cancel-repair source was not snapshotted." + }, + "preservationRegression": { + "evidence": { + "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-12T00:20:04.655482+00:00", + "finishedUtc": "2026-10-12T00:20:19.304200+00:00", + "exitCode": 0, + "stats": { + "startTime": "2026-10-12T00:20:05.169Z", + "duration": 14103.046, + "expected": 2, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + } + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career-preservation-command.json", + "sha256": "18bd14992aba5337bf72558de4820ea96c5d79366770738525355f6a34cab06b", + "bytes": 742, + "hashPolicy": "Exact measured raw bytes" + }, + "reportRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career-preservation.json", + "sha256": "cb0d08e8a80fa4148337ce6043c9c8e25007bd267088f6654632517fbc9fc938", + "bytes": 122727, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career-preservation.log", + "sha256": "260def2e7214141bae6b590786fc546a589d6e1fac4a2521c233a61d114b7c57", + "bytes": 865, + "hashPolicy": "Exact measured raw bytes" + }, + "stats": { + "startTime": "2026-10-12T00:20:05.169Z", + "duration": 14103.046, + "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": 3650 + }, + { + "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": 3522 + } + ], + "attachments": [ + { + "test": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change", + "name": "native-frozen-package", + "contentType": "image/png", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "2185e7a5e19317d91ed8c457cb4abddd6b20c064c1c3485e36a35964945b94cb", + "bytes": 88018, + "extractedPNG": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/cb0d08e8a80f/native-frozen-package.png", + "sha256": "2185e7a5e19317d91ed8c457cb4abddd6b20c064c1c3485e36a35964945b94cb", + "bytes": 88018, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career-preservation.json", + "sha256": "cb0d08e8a80fa4148337ce6043c9c8e25007bd267088f6654632517fbc9fc938", + "bytes": 122727, + "hashPolicy": "Exact measured raw bytes" + } + }, + "manualReview": "No individual inspection claimed by collector" + }, + { + "test": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change", + "name": "native-preservation-invariants", + "contentType": "application/json", + "raw": { + "storage": "Base64 attachment in raw report", + "sha256": "3686ad95bbc0b6b9a554d67bc94e34b44c164f2f839567a19a3b2000f980b5f6", + "bytes": 348 + }, + "manualReview": "No individual inspection claimed by collector" + } + ], + "reportErrors": [], + "configuration": { + "version": "1.62.1", + "workers": 1, + "projects": [ + { + "name": "chromium", + "retries": 0 + } + ] + }, + "accessibility": { + "scans": [], + "ruleNodeCounts": [], + "contexts": [], + "triage": "PENDING actual contextual review", + "qualification": "Every rule/node occurrence summarized; full HTML/data/relatedNodes/check vectors remain in exact raw report and identified audit attachment hashes. No conformance claim." + } + }, + "qualification": "Separate existing ordinary P2-D01/mobile CV override lane; inherited rule scope is not mixed with Career all-enabled scans or added to historical159 full results." + }, + "backendGuards": { + "evidence": { + "path": ".artifacts/phase7/p7-02/career-final/entry-repair-results.json", + "sha256": "57a311629bebb49a6ff31078a8f730224e21e93a05ac65dd067f3542c6937645", + "bytes": 27865, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Fresh91 guards/SQLite1/HTTP1/Release belong to the separately pushed01281f52 backend repair. Backend1,034 remains derived; these are not a new full Career/backend execution." + }, + "visualReview": { + "status": "ACTUALLY_INSPECTED_BY_PARENT", + "recordedUtc": "2026-10-12T05:38:41.221460+00:00", + "inspectionMethod": "Parent opened all22 final raw PNGs via view_image in4+4+4+4+6 batches", + "images": [ + { + "name": "p7-career-nb-dark-320-populated-overview", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-dark-320-populated-overview.png", + "sha256": "46270abbe1bfd3f1d4c3d75a5feb3f536f31660725a7b00fff3335827e99a24d", + "bytes": 86185, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-nb-dark-320-long-evidence", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-dark-320-long-evidence.png", + "sha256": "754ccbb181f061205466b9851ece8f7541ba487f3a1c1cfa4944316802775e10", + "bytes": 79872, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-light-360-populated-overview", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-360-populated-overview.png", + "sha256": "064f05f5bfaaebeeb314ff4f26fd7bd53c879d4f95377cd41520ef87520f73d9", + "bytes": 84594, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-light-360-long-evidence", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-360-long-evidence.png", + "sha256": "8090f7c66c4372689ee7e349bc37ba394d7e75addc689458fbd2d8e3924f7cc0", + "bytes": 70567, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-nb-light-390-populated-overview", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-light-390-populated-overview.png", + "sha256": "0ddf1641e174ed0123e6a6a368cd4ddae02b7e16dd53088a28f7c74445cd79df", + "bytes": 86576, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-nb-light-390-long-evidence", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-light-390-long-evidence.png", + "sha256": "05abccf36e7a8bf3a2ae5a82d34b59f1b68b9dd4f5b4d384101a04b0688b47f2", + "bytes": 71192, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-dark-768-populated-overview", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-768-populated-overview.png", + "sha256": "20258c36363096d061444d6cdae229160244463fc2de75992348d3c006b56394", + "bytes": 94494, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-dark-768-long-evidence", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-768-long-evidence.png", + "sha256": "4cc481d28dfb9d0439dc6900ba57541ee663ebd12136b323b18a083dc8a82a71", + "bytes": 83945, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-nb-dark-1024-populated-overview", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-dark-1024-populated-overview.png", + "sha256": "42cffa1a683373a40e66d11bdfb373e8bbf2528aecbebe9fc84f454ccd91fd49", + "bytes": 119730, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-nb-dark-1024-long-evidence", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-dark-1024-long-evidence.png", + "sha256": "e2b6fcbecf8ee35f3bf1d0fdd461901f466e1702f20d674641948131cd17cc8c", + "bytes": 110805, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-light-1280-populated-overview", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-1280-populated-overview.png", + "sha256": "c9d2e956cf79df51dff4fb3ca72dff44054e23d0bdce85ba220f37942ccf25b7", + "bytes": 103025, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-light-1280-long-evidence", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-1280-long-evidence.png", + "sha256": "cd31e56c9c153784f2e5d65e5df49b075926a357d751387f5671a2df034960fd", + "bytes": 96501, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-nb-light-1440-populated-overview", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-light-1440-populated-overview.png", + "sha256": "760dd39a7567e0bf895d203402c34aa3cc7f4994a677aac2f15644df1e0a0534", + "bytes": 116544, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-nb-light-1440-long-evidence", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-nb-light-1440-long-evidence.png", + "sha256": "0f35646d6f793bac5556de7906d52be2a7dbc710267141615c969337572b2dd4", + "bytes": 247294, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-dark-1920-populated-overview", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-1920-populated-overview.png", + "sha256": "6a3abb5a7860d4cabd79155b6b14f31745b11460c738c6cc21e72c50dc157381", + "bytes": 120746, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-dark-1920-long-evidence", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-1920-long-evidence.png", + "sha256": "8379b4b53169217e7dec875f85336b78ba6a472bf99177a7fdeec61d7b7afad7", + "bytes": 114192, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-dark-390-unavailable-profile", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-390-unavailable-profile.png", + "sha256": "91f4453c838cd8baafc3044df89894dd153557d1c4c32d45235fd4211c6a5f10", + "bytes": 73791, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-dark-390-unavailable-runs", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-390-unavailable-runs.png", + "sha256": "bb4505751989734b278d1d42440d7f4f2c306b7dcf7377e68a03e257ed36be1f", + "bytes": 74199, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-dark-390-unavailable-variants", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-dark-390-unavailable-variants.png", + "sha256": "aac568dda7beb3f13b284d196d6a3686970b2c03bde92189781e4198149bf769", + "bytes": 75557, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-light-390-pending-evidence-read", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-390-pending-evidence-read.png", + "sha256": "1708d2dcac2b554c77b840711183ede606958ab273e22861f9989f4d9d659449", + "bytes": 46901, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-light-390-failed-save-retained-draft", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-390-failed-save-retained-draft.png", + "sha256": "ecae840ca920c3b453e5fb6e1694bf06a4422dcec0f759999388a59a2c019d51", + "bytes": 50408, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "name": "p7-career-en-light-390-failed-delete-retained-row", + "raw": { + "path": ".artifacts/phase7/p7-02/career-final/visuals/f7a166ec33ec/p7-career-en-light-390-failed-delete-retained-row.png", + "sha256": "96e3c43398ff9bc99d16f874773fa454c27d736a3d724e4beefc4ecbd38fa2b1", + "bytes": 53220, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-02/career-final/runtime/career.json", + "sha256": "f7a166ec33ecdedd9f0374290961c0daaf1279d8c89d3425fbe3b3a66c4a2360", + "bytes": 3031612, + "hashPolicy": "Exact measured raw bytes" + } + } + ], + "observations": [ + "Eight320–1920 width/language/theme matrix samples each show populated overview and long evidence; all22 samples wrapped with no clipped fields/card titles/buttons or recorded root overflow.", + "The1440px evidence sample actually shows11 rows; unavailable profile/runs/variants, pending evidence read, failed save retained draft and failed delete retained row images were inspected.", + "Native14 and separate ordinary P2-D01/mobile-override2 pass; tested Cancel/retry/confirmation and canonical/sibling readback are finite behavioral proof." + ], + "accessibilityTriage": { + "scans": 22, + "violationNodes": 0, + "incompleteNodes": 99, + "colorContrast": { + "backgroundOverlap": 74, + "invisibleBadgeShortText": 22 + }, + "hiddenFocus": { + "occurrences": 3, + "target": "#menu-", + "context": "Retained hidden MUI section-select portal in320/360/390 evidence states; actual section selection/subsequent form keyboard pass. Contextual M09/M11 remains required." + }, + "qualification": "All findings retained; overlap/short text are incomplete measurement, not computed contrast passes. Actual reader/contrast/forced-colors/device conformance NOT VERIFIED." + }, + "qualifications": [ + "Failed-save/delete images retain inherited shell Skip-link focus/sticky-scroll capture positioning; no blanket focus restoration claim.", + "Controlled English500 details are server-fixture text, distinct from translated product guidance/fallbacks.", + "Windows clipboard LF→CRLF is verified only after deliberate CRLF→LF normalization with raw actual codepoints retained; no trimming/source-copy change or byte-identical OS clipboard claim.", + "Density not varied; no actual global Career density control, human screen reader, browser zoom, physical touch/software keyboard or real provider acceptance.", + "Canonical/job concurrency/save-import-history ownership remains P7-03/RD21; P5-13 deferred, Phase8 separate and production NO-GO." + ], + "decision": "Career implemented scope and integrated P7-02 CONDITIONAL GO; final hygiene PASS, actual normal push pending; all57 group statuses remain qualified" + }, + "preservation": { + "groups": 57, + "partial": 56, + "deferred": 1, + "routes": 32 + }, + "qualifications": [ + "Full vectors remain in raw reports; native/finite images are not human reader/zoom/device/provider acceptance.", + "P7-03 concurrency/import/history save-owner work, P5-13 AI activation and Phase8 remain separate.", + "Production NO-GO; normal development push receipt pending." + ], + "pushReceipt": { + "status": "PENDING_ACTUAL_PUSH" + }, + "rawRetention": { + "root": ".artifacts/phase7/p7-02/career-final", + "runtimeFiles": 428, + "unitFiles": 81, + "qualification": "Whole final UI tree/archived attempts, unique unit records, four product sources, four test owners, export, BUILD_ID, runner/config and entry manifest retained byte for byte. Only recorded file references rebased; hashes, commands and raw reports/internal execution paths unchanged. Initial pre-cancel source was not snapshotted; exact failed native attempts and actual first compiled75-file export are retained. Do not rerun the collector after later source/build changes." + }, + "staticGate": { + "status": "PASS", + "checkedUtc": "2026-10-12T05:48:32.289310+00:00", + "evidence": { + "path": "docs/redesign/phase-7/p7-02/evidence/career-static-checks.json", + "sha256": "f575a6304bb4d00e11ee77270d60ebdee11f1cd8faf9692adb4c473961b4d8f4", + "bytes": 3165, + "hashPolicy": "Portable JSON UTF-8 with CRLF normalized to LF" + }, + "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-12T05:48:28.856155+00:00", + "finishedUtc": "2026-10-12T05:48:31.685439+00:00", + "exitCode": 0, + "log": ".artifacts/phase7/current/static/20261012T054828Z/secret-scan.log", + "logSha256Raw": "c5a88d5ebdc042adba125c1eaacbe44f9f4a5c19898c0f195573c00d511aa28d" + }, + { + "name": "working-whitespace", + "command": [ + "rtk", + "proxy", + "git", + "diff", + "--check" + ], + "startedUtc": "2026-10-12T05:48:31.685929+00:00", + "finishedUtc": "2026-10-12T05:48:31.771415+00:00", + "exitCode": 0, + "log": ".artifacts/phase7/current/static/20261012T054828Z/working-whitespace.log", + "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6" + }, + { + "name": "staged-whitespace", + "command": [ + "rtk", + "proxy", + "git", + "diff", + "--cached", + "--check" + ], + "startedUtc": "2026-10-12T05:48:31.771415+00:00", + "finishedUtc": "2026-10-12T05:48:31.861097+00:00", + "exitCode": 0, + "log": ".artifacts/phase7/current/static/20261012T054828Z/staged-whitespace.log", + "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6" + }, + { + "name": "phase7-whitespace", + "command": [ + "rtk", + "proxy", + "git", + "diff", + "--check", + "b5319981ad3d1bd635daff861453d23c0de5320b" + ], + "startedUtc": "2026-10-12T05:48:31.861097+00:00", + "finishedUtc": "2026-10-12T05:48:31.981627+00:00", + "exitCode": 0, + "log": ".artifacts/phase7/current/static/20261012T054828Z/phase7-whitespace.log", + "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6" + } + ], + "untrackedSecretScan": { + "files": 0, + "findings": 0 + }, + "documentation": { + "files": 9, + "relativeLinks": 347, + "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." + }, + "qualification": "Final staged finite hygiene PASS; normal commit/push receipt pending. No runtime/manual qualification changed." + } +} diff --git a/docs/redesign/phase-7/p7-02/evidence/career-static-checks.json b/docs/redesign/phase-7/p7-02/evidence/career-static-checks.json new file mode 100644 index 0000000..e4d07c3 --- /dev/null +++ b/docs/redesign/phase-7/p7-02/evidence/career-static-checks.json @@ -0,0 +1,104 @@ +{ + "schemaVersion": 1, + "checkpoint": "p7-02", + "status": "PASS", + "checkedUtc": "2026-10-12T05:48:32.289310+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-12T05:48:28.856155+00:00", + "finishedUtc": "2026-10-12T05:48:31.685439+00:00", + "exitCode": 0, + "log": ".artifacts/phase7/current/static/20261012T054828Z/secret-scan.log", + "logSha256Raw": "c5a88d5ebdc042adba125c1eaacbe44f9f4a5c19898c0f195573c00d511aa28d" + }, + { + "name": "working-whitespace", + "command": [ + "rtk", + "proxy", + "git", + "diff", + "--check" + ], + "startedUtc": "2026-10-12T05:48:31.685929+00:00", + "finishedUtc": "2026-10-12T05:48:31.771415+00:00", + "exitCode": 0, + "log": ".artifacts/phase7/current/static/20261012T054828Z/working-whitespace.log", + "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6" + }, + { + "name": "staged-whitespace", + "command": [ + "rtk", + "proxy", + "git", + "diff", + "--cached", + "--check" + ], + "startedUtc": "2026-10-12T05:48:31.771415+00:00", + "finishedUtc": "2026-10-12T05:48:31.861097+00:00", + "exitCode": 0, + "log": ".artifacts/phase7/current/static/20261012T054828Z/staged-whitespace.log", + "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6" + }, + { + "name": "phase7-whitespace", + "command": [ + "rtk", + "proxy", + "git", + "diff", + "--check", + "b5319981ad3d1bd635daff861453d23c0de5320b" + ], + "startedUtc": "2026-10-12T05:48:31.861097+00:00", + "finishedUtc": "2026-10-12T05:48:31.981627+00:00", + "exitCode": 0, + "log": ".artifacts/phase7/current/static/20261012T054828Z/phase7-whitespace.log", + "logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6" + } + ], + "untrackedSecretScan": { + "files": 0, + "findings": 0 + }, + "documentation": { + "files": 9, + "relativeLinks": 347, + "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/redesign/phase-7/p7-02/evidence/evidence-list-repair.json b/docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json index 399f44c..d750ec6 100644 --- a/docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json +++ b/docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "checkpoint": "P7-02", "slice": "SQLite evidence-list compatibility repair only", - "acceptance": "GO for bounded local repair; final hygiene PASS, actual push pending", + "acceptance": "GO for bounded local repair; hygiene PASS, normally pushed and directly verified", "entryCommit": "d21501aa7e5f9040937fa821d6a77d823b7e08eb", "problem": "EF SQLite9.0.14 cannot translate DateTimeOffset ORDER BY; owned evidence POST200 was followed by list GET500 and actual provider NotSupportedException.", "change": "Keep SQL owner filtering and AsNoTracking. SQLite materializes only owned rows then orders actual DTO instants; other providers retain existing SQL ordering.", @@ -591,7 +591,32 @@ "qualification": "Exact backend command/log/TRX, frozen source/DLL, RED/GREEN HTTP raw reports/logs/result trees/traces and runner/spec snapshots; internal execution paths unchanged." }, "pushReceipt": { - "status": "PENDING_ACTUAL_PUSH" + "checkpoint": "P7-02", + "slice": "evidence list SQLite compatibility repair", + "status": "PUSHED_AND_VERIFIED", + "checkedUtc": "2026-10-12T00:06:47.145743+00:00", + "head": "01281f52d9279ecdbd3363a11d2e9cb71230bf49", + "originDevelopment": "01281f52d9279ecdbd3363a11d2e9cb71230bf49", + "liveDevelopment": "01281f52d9279ecdbd3363a11d2e9cb71230bf49", + "main": "27657f31131cd95d42f0e1290853ec9c9b3959a4", + "originMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4", + "liveMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4", + "workingTreeClean": false, + "pendingPaths": [ + "job-tracker-ui/src/career-evidence.test.tsx", + "job-tracker-ui/src/career-workspace-page.test.tsx", + "job-tracker-ui/src/i18n/translations.ts", + "job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx", + "job-tracker-ui/e2e/phase7-career-overview.spec.ts" + ], + "qualification": "Only in-progress Career frontend source/tests remain uncommitted; repair is complete and normally pushed. No other work discarded.", + "production": "NO-GO", + "pushExitCode": 0, + "raw": { + "path": ".artifacts/phase7/p7-02/evidence-list-repair/push-receipt.json", + "sha256": "4b673fb11248d185fd3d2b635a62d18d0423ea36dd7e4655fa0bb6279663a71b", + "hashPolicy": "Exact observed raw bytes" + } }, "staticGate": { "evidence": { @@ -623,5 +648,6 @@ "originalRoutesPreserved": true, "currentConcreteRoutes": 32 } - } + }, + "sourceApplicability": "Frozen canonical source identities apply at01281f52d9279ecdbd3363a11d2e9cb71230bf49; sourceAndBinarySnapshots preserve exact measured bytes. API/test DLLs are local build provenance, not deployed production identities." } diff --git a/docs/roadmap/todo.md b/docs/roadmap/todo.md index 12e01be..30334ec 100644 --- a/docs/roadmap/todo.md +++ b/docs/roadmap/todo.md @@ -84,8 +84,8 @@ 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. -- [ ] P7-02 [onboarding guidance and Career overview/evidence](../redesign/phase-7/p7-02/README.md): entryad7b419 pushed/verified; onboarding implemented-scope CONDITIONAL GO with fresh affected32/native13/regression4/types/lint/build and13 actual PNG inspections. Legacy dismissal/routes/data and unknown-summary state preserved; final onboarding hygiene PASS and normally pushedd21501aa/direct receipt23:55:12UTC, main unchanged. Career overview/evidence second boundary and whole P7-02 remain pending;596 full frontend is derived only. -- [ ] P7-03 Career structured editor and import/history presentation. +- [ ] 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 push pending. 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: after P7-02 push, separately RED/prove/repair optional stable source-ID preservation before presentation; prove dirty-locale/held-PUT pending-write ownership/recovery and resolve or bound RD21 concurrency before save/history expansion. - [ ] 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/phase7-career-overview.spec.ts b/job-tracker-ui/e2e/phase7-career-overview.spec.ts new file mode 100644 index 0000000..5bd347b --- /dev/null +++ b/job-tracker-ui/e2e/phase7-career-overview.spec.ts @@ -0,0 +1,358 @@ +import AxeBuilder from '@axe-core/playwright'; +import { expect, test as base, type APIRequestContext, type Page, type TestInfo } from '@playwright/test'; +import { translations } from '../src/i18n/translations'; +import type { CvVariant } from '../src/cvBuilder'; + +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 }; + +async function login(api: APIRequestContext, email: string): Promise { + expect((await api.post(`${apiUrl}/auth/login`, { data: { email, password } })).status()).toBe(200); + const response = await api.get(`${apiUrl}/auth/me`); + expect(response.status()).toBe(200); + const me = await response.json(); + const csrf = (await api.storageState()).cookies.find(cookie => cookie.name === 'XSRF-TOKEN'); + expect(csrf).toBeDefined(); + return { id: me.id, email, headers: { 'X-CSRF-TOKEN': csrf!.value, 'X-Session-Context': me.sessionContext } }; +} + +async function createOwner(api: APIRequestContext, headers: Record) { + const email = `p7-career-${Date.now()}-${Math.random().toString(36).slice(2)}@example.test`; + expect((await api.post(`${apiUrl}/users`, { 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.headers)); + 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 context.addInitScript(() => { + if (!localStorage.getItem('uiLanguage')) localStorage.setItem('uiLanguage', 'en'); + if (!localStorage.getItem('jobtracker.themeMode')) localStorage.setItem('jobtracker.themeMode', 'light'); + }); + await provide(owner); + } finally { await admin.dispose(); } + }, +}); + +async function enter(page: Page, owner: Owner, sample: Sample, section = 'overview') { + expect((await page.request.put(`${apiUrl}/auth/preferences/language`, { headers: owner.headers, + data: { language: sample.language === 'nb' ? 'nb-NO' : 'en' } })).status()).toBe(204); + await page.setViewportSize({ width: sample.width, height: sample.height }); + await page.goto(`/career?section=${section}&source=phase7#preserved`); + await page.evaluate(({ language, theme }) => { + localStorage.setItem('uiLanguage', language); + localStorage.setItem('jobtracker.themeMode', theme); + }, sample); + await page.emulateMedia({ reducedMotion: 'reduce' }); + 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: 'overview' | 'profile' | 'evidence' | 'import') { + const t = translations[language]; + const label = { overview: t.careerWorkspaceOverviewTab, profile: t.careerWorkspaceProfileTab, + evidence: t.careerWorkspaceEvidenceTab, import: t.careerWorkspaceImportTab }[section]; + 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 === 'overview' ? null : section); + expect(url.searchParams.get('source')).toBe('phase7'); + expect(url.hash).toBe('#preserved'); +} + +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) })); + const axe = await new AxeBuilder({ page }).options({ rules: { 'target-size': { enabled: true } } }).analyze(); + const name = `p7-career-${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: { scope: 'All enabled rules plus target-size; complete findings retained', violations: axe.violations, + incomplete: axe.incomplete, passes: axe.passes.map(rule => ({ id: rule.id, nodes: rule.nodes.length })) }, + 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'], + }), contentType: 'application/json' }); + await info.attach(name, { body: await page.screenshot({ fullPage: true, animations: 'disabled' }), contentType: 'image/png' }); + expect(geometry.rootOverflow).toBe(0); +} + +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-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation', async ({ page, owner, playwright }, info) => { + const created = await page.request.post(`${apiUrl}/career/evidence`, { headers: owner.headers, + data: { category: 'project', title: 'Owner A evidence', statement: 'Recorded, reviewed fact.', tags: [' C# ', 'c#', 'Norsk'], sourceType: 'manual', sourceReference: ' Retrospective ', isVerified: true } }); + expect(created.status()).toBe(200); + const item = await created.json(); + const listed = await page.request.get(`${apiUrl}/career/evidence`); + expect(listed.status(), 'the actual local SQLite HTTP list must succeed').toBe(200); + expect(await listed.json()).toEqual([item]); + expect(item.tags).toEqual(['C#', 'Norsk']); + expect(item.sourceReference).toBe('Retrospective'); + 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 otherOwner = await login(other, await createOwner(admin, adminOwner.headers)); + expect(await (await other.get(`${apiUrl}/career/evidence?ownerUserId=${encodeURIComponent(owner.id)}`)).json()).toEqual([]); + expect((await other.put(`${apiUrl}/career/evidence/${item.id}`, { headers: otherOwner.headers, + data: { title: 'Foreign overwrite', statement: 'Denied' } })).status()).toBe(404); + expect((await other.delete(`${apiUrl}/career/evidence/${item.id}`, { headers: otherOwner.headers })).status()).toBe(404); + expect((await anonymous.get(`${apiUrl}/career/evidence`)).status()).toBe(401); + expect((await page.request.post(`${apiUrl}/career/evidence`, { headers: owner.headers, + data: { title: ' ', statement: 'Not saved' } })).status()).toBe(400); + expect((await page.request.post(`${apiUrl}/career/evidence`, { headers: owner.headers, + data: { title: 'Not saved', statement: ' ' } })).status()).toBe(400); + expect(await (await page.request.get(`${apiUrl}/career/evidence`)).json()).toEqual([item]); + await info.attach('native-evidence-owner-provider-contract', { body: JSON.stringify({ provider: 'Local Playwright SQLite', list200: true, + foreignUpdate404: true, foreignDelete404: true, anonymous401: true, invalidCreate400: true, noForeignMutation: true, + qualification: 'Actual preceding HTTP assertions; no InMemory or production-provider inference' }), contentType: 'application/json' }); + } finally { await admin.dispose(); await other.dispose(); await anonymous.dispose(); } +}); + +for (const sample of matrix) { + test(`[P7-02 PRES-C01 C02 C04 C05 E08 E09] ${sample.language}/${sample.theme} ${sample.width}px overview and factual evidence preserve canonical source and recent CV links`, async ({ page, owner }, info) => { + test.setTimeout(120_000); + const profile = { version: '1', contact: { fullName: 'Åse Kunnskapsbank', headline: 'Canonical source' }, + jobs: [{ title: 'Engineer', company: 'Dokumentasjon AS', bullets: ['Recorded work, no invented outcomes.'] }], skills: ['C#', 'Norsk'] }; + expect((await page.request.put(`${apiUrl}/career/profile`, { headers: owner.headers, data: { profile } })).status()).toBe(200); + const before = await (await page.request.get(`${apiUrl}/career/profile`)).json(); + const cvs: CvVariant[] = []; + for (let i = 0; i < 4; i++) { + const r = await page.request.post(`${apiUrl}/cv/variants`, { headers: owner.headers, data: { name: `CV ${i + 1} — ${'Lang dokumenttittel '.repeat(5)}` } }); + expect(r.status()).toBe(200); cvs.push(await r.json()); + } + const summariesResponse = await page.request.get(`${apiUrl}/cv/variants`); + expect(summariesResponse.status()).toBe(200); + const authoritativeRecent = (await summariesResponse.json()).slice(0, 3).map((cv: { id: number }) => `/career/builder/${cv.id}`); + const item = await page.request.post(`${apiUrl}/career/evidence`, { headers: owner.headers, data: { + title: 'Et dokumentert prosjekt med en lang tittel — æøå '.repeat(4), statement: 'Faktisk dokumentasjon fra et gjennomført prosjekt. '.repeat(8), + category: 'project', tags: ['Tilgjengelighet', 'Systematisk dokumentasjon'], sourceType: 'manual', sourceReference: 'Prosjektgjennomgang — æøå', isVerified: true, + } }); + expect(item.status()).toBe(200); + const evidence = await item.json(); + if (sample.width === 1440) { + for (let i = 1; i <= 10; i++) { + expect((await page.request.post(`${apiUrl}/career/evidence`, { headers: owner.headers, data: { + title: `Additional owned evidence ${i}`, statement: 'Another supported statement. '.repeat(8), sourceType: 'manual', isVerified: true, + } })).status()).toBe(200); + } + expect(await (await page.request.get(`${apiUrl}/career/evidence`)).json()).toHaveLength(11); + } + await enter(page, owner, sample); + const t = translations[sample.language]; + await expect(page.getByRole('heading', { name: t.careerWorkspaceOverviewTab, level: 2 })).toBeVisible(); + await expect(page.getByRole('progressbar', { name: t.careerOverviewCompletenessLabel })).toHaveAttribute('aria-valuenow', String(before.completeness.percent)); + const recent = page.getByRole('region', { name: t.careerOverviewRecentCvs, exact: true }); + await expect(recent.getByRole('link', { name: t.cvDashboardOpen, exact: true })).toHaveCount(3); + const links = await recent.getByRole('link', { name: t.cvDashboardOpen, exact: true }).evaluateAll(nodes => nodes.map(node => node.getAttribute('href'))); + expect(new Set(links).size).toBe(3); + expect(links).toEqual(authoritativeRecent); + await capture(page, info, sample, 'populated-overview'); + await navigateSection(page, sample.language, 'evidence'); + await expect(page.getByRole('heading', { name: t.careerEvidenceTitle, level: 2 })).toBeVisible(); + await expect(page.getByText(evidence.title, { exact: true })).toBeVisible(); + await expect(page.getByLabel(t.careerEvidenceStatement)).toBeVisible(); + if (sample.width === 1440) await expect(page.getByText('Additional owned evidence 10', { exact: true })).toBeVisible(); + await capture(page, info, sample, 'long-evidence'); + expect(await (await page.request.get(`${apiUrl}/career/profile`)).json()).toEqual(before); + for (const cv of cvs) expect(await (await page.request.get(`${apiUrl}/cv/variants/${cv.id}`)).json()).toEqual(cv); + await page.reload(); + await expect(page.getByText(evidence.title, { exact: true })).toBeVisible(); + }); +} + +for (const failedPath of ['/career/profile', '/profile-cv/runs', '/cv/variants']) { + test(`[P7-02 PRES-C02 E09] unavailable ${failedPath} stays unknown and retries its reads without writes or false first-run guidance`, async ({ page, owner }, info) => { + const sample: Sample = { language: 'en', theme: 'dark', width: 390, height: 844 }; + const actualProfile = await (await page.request.get(`${apiUrl}/career/profile`)).json(); + let fail = true; + let reads = 0; + await page.route(`**/api${failedPath}`, async route => { + if (route.request().method() === 'GET') { + reads++; + if (fail) return route.fulfill({ status: 500, contentType: 'application/json', body: JSON.stringify({ message: 'Controlled source read unavailable' }) }); + } + return route.continue(); + }); + await enter(page, owner, sample); + const t = translations.en; + const message = failedPath === '/career/profile' ? t.careerOverviewUnavailable : failedPath === '/profile-cv/runs' ? t.careerOverviewImportUnavailable : t.careerOverviewRecentFailed; + const alert = page.getByRole('alert').filter({ hasText: message }); + await expect(alert).toBeVisible(); + await expect(page.getByText(t.careerOverviewFirstRun, { exact: true })).toHaveCount(0); + if (failedPath === '/career/profile') await expect(page.getByRole('progressbar', { name: t.careerOverviewCompletenessLabel })).toHaveCount(0); + if (failedPath === '/profile-cv/runs') await expect(page.getByText(t.careerOverviewNoImport, { exact: true })).toHaveCount(0); + if (failedPath === '/cv/variants') await expect(page.getByText(t.careerOverviewNoCvs, { exact: true })).toHaveCount(0); + await capture(page, info, sample, `unavailable-${failedPath.split('/').pop()}`); + const writes: string[] = []; + page.on('request', request => { if (request.url().startsWith(apiUrl) && !['GET', 'HEAD', 'OPTIONS'].includes(request.method())) writes.push(request.method() + ' ' + request.url()); }); + const beforeReads = reads; + fail = false; + await alert.getByRole('button', { name: t.retry, exact: true }).focus(); + await page.keyboard.press('Enter'); + await expect(alert).toHaveCount(0); + const focusRegion = failedPath === '/career/profile' ? t.careerOverviewProfileStatus : failedPath === '/profile-cv/runs' ? t.careerOverviewCvImport : t.careerOverviewRecentCvs; + const focusLabel = failedPath === '/career/profile' ? t.careerOverviewImproveProfile : failedPath === '/profile-cv/runs' ? t.careerOverviewImportCv : t.careerOverviewViewAll; + await expect(page.getByRole('region', { name: focusRegion, exact: true }).getByRole('link', { name: focusLabel, exact: true })).toBeFocused(); + await expect(page.getByRole('progressbar', { name: t.careerOverviewCompletenessLabel })).toHaveAttribute('aria-valuenow', String(actualProfile.completeness.percent)); + expect(reads).toBe(beforeReads + 1); + expect(writes).toEqual([]); + }); +} + +test('[P7-02 PRES-C04 E09] evidence pending/failure/read retry and failed save preserve drafts across section changes, cancellation and actual deletion', async ({ page, owner }, info) => { + test.setTimeout(120_000); + const sample: Sample = { language: 'en', theme: 'light', width: 390, height: 844 }; + expect((await page.request.put(`${apiUrl}/career/profile`, { headers: owner.headers, data: { + profile: { version: '1', contact: { fullName: 'Independent canonical source' }, skills: ['Original source fact'] }, cvText: 'Original raw source', + } })).status()).toBe(200); + const canonicalBefore = await (await page.request.get(`${apiUrl}/career/profile`)).json(); + const retainedCvs: CvVariant[] = []; + for (const name of ['Selected CV', 'Sibling CV']) { + const response = await page.request.post(`${apiUrl}/cv/variants`, { headers: owner.headers, data: { name } }); + expect(response.status()).toBe(200); retainedCvs.push(await response.json()); + } + let readFailure = true; + let holdRead = false; + let releaseRead!: () => void; + const delayedRead = new Promise(resolve => { releaseRead = resolve; }); + let saveFailure = true; + const payloads: unknown[] = []; + await page.route('**/api/career/evidence', async route => { + const request = route.request(); + if (request.method() === 'GET' && readFailure) return route.fulfill({ status: 500, contentType: 'application/json', body: JSON.stringify({ message: 'Controlled evidence read unavailable' }) }); + if (request.method() === 'GET' && holdRead) await delayedRead; + if (request.method() === 'POST') { + payloads.push(request.postDataJSON()); + if (saveFailure) return route.fulfill({ status: 500, contentType: 'application/json', body: JSON.stringify({ message: 'Controlled evidence write unavailable' }) }); + } + return route.continue(); + }); + await enter(page, owner, sample, 'evidence'); + const t = translations.en; + const readAlert = page.getByRole('alert').filter({ hasText: 'Controlled evidence read unavailable' }); + await expect(readAlert).toBeVisible(); + await expect(page.getByText(t.careerEvidenceEmpty, { exact: true })).toHaveCount(0); + readFailure = false; + holdRead = true; + await readAlert.getByRole('button', { name: t.retry, exact: true }).click(); + const bank = page.getByRole('region', { name: t.careerEvidenceTitle, exact: true }); + await expect(bank.getByText(t.loading, { exact: true })).toBeVisible(); + await expect(page.getByText(t.careerEvidenceEmpty, { exact: true })).toHaveCount(0); + await expect(page.getByRole('button', { name: t.careerEvidenceSave, exact: true })).toBeDisabled(); + await capture(page, info, sample, 'pending-evidence-read'); + releaseRead(); + await expect(page.getByText(t.careerEvidenceEmpty, { exact: true })).toBeVisible(); + await page.getByLabel(t.careerEvidenceItemTitle).fill('Reviewed project — æøå'); + await page.getByLabel(t.careerEvidenceStatement).fill('A fact supplied by the owner.'); + await page.getByLabel(t.careerEvidenceTags, { exact: true }).fill('C#, Norsk'); + await page.getByLabel(t.careerEvidenceSource, { exact: true }).fill('Project retrospective'); + await page.getByRole('button', { name: t.careerEvidenceSave, exact: true }).click(); + const saveAlert = page.getByRole('alert').filter({ hasText: 'Controlled evidence write unavailable' }); + await expect(saveAlert).toBeVisible(); + await expect(saveAlert.getByRole('button', { name: t.retry, exact: true })).toHaveCount(0); + await capture(page, info, sample, 'failed-save-retained-draft'); + await navigateSection(page, 'en', 'overview'); + await navigateSection(page, 'en', 'evidence'); + await expect(page.getByLabel(t.careerEvidenceItemTitle)).toHaveValue('Reviewed project — æøå'); + await expect(page.getByLabel(t.careerEvidenceStatement)).toHaveValue('A fact supplied by the owner.'); + saveFailure = false; + const saved = page.waitForResponse(response => response.url() === `${apiUrl}/career/evidence` && response.request().method() === 'POST'); + await page.getByRole('button', { name: t.careerEvidenceSave, exact: true }).focus(); + await page.keyboard.press('Enter'); + expect((await saved).status()).toBe(200); + expect(payloads).toEqual(Array(2).fill({ category: 'achievement', title: 'Reviewed project — æøå', statement: 'A fact supplied by the owner.', tags: ['C#', ' Norsk'], sourceType: 'manual', sourceReference: 'Project retrospective', isVerified: true })); + const [item] = await (await page.request.get(`${apiUrl}/career/evidence`)).json(); + await expect(page.getByText(item.title, { exact: true })).toBeVisible(); + await expect(page.getByLabel(t.careerEvidenceItemTitle)).toHaveValue(''); + expect(await (await page.request.get(`${apiUrl}/career/profile`)).json()).toEqual(canonicalBefore); + for (const cv of retainedCvs) expect(await (await page.request.get(`${apiUrl}/cv/variants/${cv.id}`)).json()).toEqual(cv); + const row = page.getByRole('article').filter({ hasText: item.title }); + const remove = row.getByRole('button', { name: t.careerEvidenceDeleteMessage.replace('{title}', item.title), exact: true }); + await remove.focus(); + await page.keyboard.press('Enter'); + const dialog = page.getByRole('dialog', { name: t.careerEvidenceDeleteTitle, exact: true }); + await expect(dialog).toBeVisible(); + await dialog.getByRole('button', { name: t.cancel, exact: true }).click(); + await expect(remove).toBeFocused(); + expect(await (await page.request.get(`${apiUrl}/career/evidence`)).json()).toEqual([item]); + let deleteFailure = true; + await page.route(`**/api/career/evidence/${item.id}`, route => route.request().method() === 'DELETE' && deleteFailure + ? route.fulfill({ status: 500, contentType: 'application/json', body: JSON.stringify({ message: 'Controlled evidence deletion unavailable' }) }) : route.continue()); + await remove.click(); + const failedDelete = page.waitForResponse(response => response.url() === `${apiUrl}/career/evidence/${item.id}` && response.request().method() === 'DELETE'); + await dialog.getByRole('button', { name: t.deleteAction, exact: true }).click(); + expect((await failedDelete).status()).toBe(500); + const deleteAlert = row.getByRole('alert').filter({ hasText: 'Controlled evidence deletion unavailable' }); + await expect(deleteAlert).toBeVisible(); + expect(await (await page.request.get(`${apiUrl}/career/evidence`)).json()).toEqual([item]); + await capture(page, info, sample, 'failed-delete-retained-row'); + deleteFailure = false; + await deleteAlert.getByRole('button', { name: t.retry, exact: true }).focus(); + await page.keyboard.press('Enter'); + await expect(dialog).toBeVisible(); + const deleted = page.waitForResponse(response => response.url() === `${apiUrl}/career/evidence/${item.id}` && response.request().method() === 'DELETE'); + await dialog.getByRole('button', { name: t.deleteAction, exact: true }).click(); + expect((await deleted).status()).toBe(204); + await expect(page.getByText(t.careerEvidenceEmpty, { exact: true })).toBeVisible(); + await expect(page.getByLabel(t.careerEvidenceItemTitle)).toBeFocused(); + await page.reload(); + await expect(page.getByText(t.careerEvidenceEmpty, { exact: true })).toBeVisible(); + expect(await (await page.request.get(`${apiUrl}/career/profile`)).json()).toEqual(canonicalBefore); + for (const cv of retainedCvs) expect(await (await page.request.get(`${apiUrl}/cv/variants/${cv.id}`)).json()).toEqual(cv); +}); + +test('[P7-02 PRES-C01 C02] existing raw source copy and history entry remain read-only', async ({ page, owner, context }, info) => { + const sample: Sample = { language: 'en', theme: 'light', width: 1440, height: 900 }; + const profile = { version: '1', contact: { fullName: 'Canonical source' }, skills: ['Recorded skill'] }; + const raw = 'Exact raw source — æøå\nA supported owner claim.\n'; + expect((await page.request.put(`${apiUrl}/career/profile`, { headers: owner.headers, data: { profile: { ...profile, skills: ['Recorded skill', 'Recorded later skill'] }, cvText: raw } })).status()).toBe(200); + expect((await page.request.put(`${apiUrl}/career/profile`, { headers: owner.headers, data: { profile, cvText: raw } })).status()).toBe(200); + const before = await (await page.request.get(`${apiUrl}/career/profile`)).json(); + const history = await (await page.request.get(`${apiUrl}/career/profile/versions`)).json(); + await context.grantPermissions(['clipboard-read', 'clipboard-write']); + await enter(page, owner, sample); + await navigateSection(page, 'en', 'import'); + const t = translations.en; + await page.getByRole('button', { name: new RegExp(t.profileCvRawPanelTitle) }).click(); + await page.getByRole('button', { name: t.profileCopyCvText, exact: true }).click(); + const copied = await page.evaluate(() => navigator.clipboard.readText()); + await info.attach('native-clipboard-line-endings', { body: JSON.stringify({ requestedSource: raw, copied, + requestedCodePoints: [...raw].map(value => value.codePointAt(0)), copiedCodePoints: [...copied].map(value => value.codePointAt(0)), + qualification: 'Windows clipboard may convert LF to CRLF; preserve exact text after this explicit platform normalization, without trimming or other changes' }), contentType: 'application/json' }); + expect(copied.replace(/\r\n/g, '\n')).toBe(raw); + 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(); + 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, + canonicalAndHistoryUnchanged: true, qualification: 'Browser clipboard permission granted; exact OS clipboard bytes/human acceptance not claimed; restore/save/import-review migration is P7-03' }), contentType: 'application/json' }); +}); diff --git a/job-tracker-ui/src/career-evidence.test.tsx b/job-tracker-ui/src/career-evidence.test.tsx index 17a6271..dabdab3 100644 --- a/job-tracker-ui/src/career-evidence.test.tsx +++ b/job-tracker-ui/src/career-evidence.test.tsx @@ -1,23 +1,182 @@ import React from "react"; import "@testing-library/jest-dom"; -import { fireEvent, render, screen, waitFor } from "@testing-library/react"; +import { act, fireEvent, render, screen, waitFor, within } from "@testing-library/react"; import CareerEvidenceBank from "./views/career/CareerEvidenceBank"; import { I18nProvider } from "./i18n/I18nProvider"; +import { translations } from "./i18n/translations"; +import { ConfirmProvider } from "./confirm"; import { api } from "./api"; -jest.mock("./api", () => ({ api: { get: jest.fn(), post: jest.fn(), delete: jest.fn() }, getApiErrorMessage: (_e: unknown, fallback: string) => fallback })); -jest.mock("./confirm", () => ({ useConfirm: () => ({ confirm: jest.fn().mockResolvedValue(true) }) })); +jest.mock("./api", () => ({ + api: { get: jest.fn(), post: jest.fn(), delete: jest.fn(), put: jest.fn(), patch: jest.fn() }, + getApiErrorMessage: jest.requireActual("./api").getApiErrorMessage, +})); const mocked = api as jest.Mocked; +const evidence = { id: 1, category: "achievement", title: "Reduced incidents", statement: "Added rollback checks", tags: ["reliability"], sourceReference: "retrospective" }; + +function open(language: "en" | "nb" = "en") { + window.localStorage.setItem("uiLanguage", language); + return render(); +} + +function fillDraft() { + fireEvent.change(screen.getByLabelText("Short title", { exact: false }), { target: { value: evidence.title } }); + fireEvent.change(screen.getByLabelText("Evidence statement", { exact: false }), { target: { value: evidence.statement } }); + fireEvent.change(screen.getByLabelText("Skills and keywords"), { target: { value: "reliability, C#" } }); + fireEvent.change(screen.getByLabelText("Source or provenance"), { target: { value: evidence.sourceReference } }); +} + +function expectNoWrites() { + for (const method of [mocked.post, mocked.delete, mocked.put, mocked.patch]) expect(method).not.toHaveBeenCalled(); +} + +beforeEach(() => { + jest.clearAllMocks(); + window.localStorage.removeItem("uiLanguage"); + mocked.get.mockReset().mockResolvedValue({ data: [] } as any); + for (const method of [mocked.post, mocked.delete, mocked.put, mocked.patch]) method.mockReset().mockRejectedValue(new Error("Unexpected write")); +}); + +afterEach(() => window.localStorage.removeItem("uiLanguage")); test("saves factual evidence with provenance and tags", async () => { - mocked.get.mockResolvedValue({ data: [] } as any); - mocked.post.mockResolvedValue({ data: { id: 1, category: "achievement", title: "Reduced incidents", statement: "Added rollback checks", tags: ["reliability"], sourceReference: "retrospective" } } as any); - render(); - fireEvent.change(await screen.findByLabelText("Short title"), { target: { value: "Reduced incidents" } }); - fireEvent.change(screen.getByLabelText("Evidence statement"), { target: { value: "Added rollback checks" } }); - fireEvent.change(screen.getByLabelText("Skills and keywords"), { target: { value: "reliability" } }); - fireEvent.change(screen.getByLabelText("Source or provenance"), { target: { value: "retrospective" } }); + mocked.post.mockResolvedValue({ data: evidence } as any); + open(); + await screen.findByText(translations.en.careerEvidenceEmpty); + fillDraft(); fireEvent.click(screen.getByRole("button", { name: "Save evidence" })); - await waitFor(() => expect(mocked.post).toHaveBeenCalledWith("/career/evidence", expect.objectContaining({ title: "Reduced incidents", isVerified: true, sourceType: "manual" }))); - expect(await screen.findByText("Added rollback checks")).toBeInTheDocument(); + await waitFor(() => expect(mocked.post).toHaveBeenCalledWith("/career/evidence", { + category: "achievement", title: evidence.title, statement: evidence.statement, + tags: ["reliability", " C#"], sourceType: "manual", sourceReference: evidence.sourceReference, isVerified: true, + })); + expect(await screen.findByText(evidence.statement)).toBeInTheDocument(); +}); + +test("pending evidence reads announce loading without claiming an empty bank or allowing a raced save", async () => { + let finish!: (value: any) => void; + mocked.get.mockReturnValue(new Promise((resolve) => { finish = resolve; })); + open(); + expect(screen.getByRole("status")).toHaveTextContent(translations.en.loading); + expect(screen.queryByText(translations.en.careerEvidenceEmpty)).not.toBeInTheDocument(); + fillDraft(); + const save = screen.getByRole("button", { name: translations.en.careerEvidenceSave }); + expect(save).toBeDisabled(); + fireEvent.click(save); + expectNoWrites(); + await act(async () => finish({ data: [] })); + expect(await screen.findByText(translations.en.careerEvidenceEmpty)).toBeVisible(); + expect(save).toBeEnabled(); + expect(screen.getByLabelText("Short title", { exact: false })).toHaveValue(evidence.title); +}); + +test("failed list reads remain distinct from empty state and retry only GET while preserving the draft", async () => { + mocked.get.mockRejectedValueOnce({ response: { status: 503, data: "Evidence list unavailable" } }); + open(); + const alert = await screen.findByRole("alert"); + expect(alert).toHaveTextContent("Evidence list unavailable"); + expect(screen.queryByText(translations.en.careerEvidenceEmpty)).not.toBeInTheDocument(); + fillDraft(); + fireEvent.click(within(alert).getByRole("button", { name: translations.en.retry })); + expect(await screen.findByText(translations.en.careerEvidenceEmpty)).toBeVisible(); + expect(screen.getByLabelText("Evidence statement", { exact: false })).toHaveValue(evidence.statement); + expect(mocked.get.mock.calls.map(([url]) => url)).toEqual(["/career/evidence", "/career/evidence"]); + expectNoWrites(); +}); + +test("failed saves retain factual inputs and retry the same explicit save without reloading the list", async () => { + mocked.post.mockRejectedValueOnce({ response: { status: 503, data: "Evidence save unavailable" } }).mockResolvedValueOnce({ data: evidence } as any); + open(); + await screen.findByText(translations.en.careerEvidenceEmpty); + fillDraft(); + const form = screen.getByRole("region", { name: translations.en.careerEvidenceAdd }); + fireEvent.click(within(form).getByRole("button", { name: translations.en.careerEvidenceSave })); + expect(await within(form).findByRole("alert")).toHaveTextContent("Evidence save unavailable"); + expect(screen.getByLabelText("Short title", { exact: false })).toHaveValue(evidence.title); + expect(screen.getByLabelText("Evidence statement", { exact: false })).toHaveValue(evidence.statement); + expect(screen.getByLabelText("Skills and keywords")).toHaveValue("reliability, C#"); + expect(screen.getByLabelText("Source or provenance")).toHaveValue(evidence.sourceReference); + fireEvent.click(within(form).getByRole("button", { name: translations.en.careerEvidenceSave })); + expect(await screen.findByRole("article", { name: evidence.title })).toHaveTextContent(evidence.statement); + expect(mocked.post).toHaveBeenCalledTimes(2); + expect(mocked.post.mock.calls[1]).toEqual(mocked.post.mock.calls[0]); + expect(mocked.get).toHaveBeenCalledTimes(1); + expect(mocked.delete).not.toHaveBeenCalled(); + expect(mocked.put).not.toHaveBeenCalled(); + expect(screen.getByLabelText("Short title", { exact: false })).toHaveValue(""); +}); + +test("a pending save prevents duplicate writes and prevents edits being cleared by the response", async () => { + let finish!: (value: any) => void; + mocked.post.mockReturnValue(new Promise((resolve) => { finish = resolve; })); + open(); + await screen.findByText(translations.en.careerEvidenceEmpty); + fillDraft(); + const save = screen.getByRole("button", { name: translations.en.careerEvidenceSave }); + fireEvent.click(save); + expect(save).toBeDisabled(); + expect(screen.getByLabelText("Short title", { exact: false })).toBeDisabled(); + expect(screen.getByLabelText("Evidence statement", { exact: false })).toBeDisabled(); + fireEvent.click(save); + expect(mocked.post).toHaveBeenCalledTimes(1); + await act(async () => finish({ data: evidence })); + expect(await screen.findByRole("article", { name: evidence.title })).toBeVisible(); + expect(save).toBeDisabled(); + expect(screen.getByLabelText("Short title", { exact: false })).toBeEnabled(); +}); + +test("contextual deletion is named and cancellation performs no writes or draft loss", async () => { + mocked.get.mockResolvedValue({ data: [evidence] } as any); + open(); + const item = await screen.findByRole("article", { name: evidence.title }); + fillDraft(); + const deleteButton = within(item).getByRole("button", { name: /Reduced incidents/ }); + deleteButton.focus(); + fireEvent.click(deleteButton); + const dialog = await screen.findByRole("dialog", { name: translations.en.careerEvidenceDeleteTitle }); + expect(dialog).toHaveTextContent(evidence.title); + expect(deleteButton).toBeEnabled(); + fireEvent.click(within(dialog).getByRole("button", { name: translations.en.cancel })); + await waitFor(() => expect(screen.queryByRole("dialog")).not.toBeInTheDocument()); + expect(deleteButton).toHaveFocus(); + expect(item).toBeVisible(); + expect(screen.getByLabelText("Short title", { exact: false })).toHaveValue(evidence.title); + expectNoWrites(); +}); + +test("failed deletion keeps the row and draft, then reconfirms the same delete without list reload", async () => { + mocked.get.mockResolvedValue({ data: [evidence] } as any); + mocked.delete.mockRejectedValueOnce({ response: { status: 503, data: "Evidence deletion unavailable" } }).mockResolvedValueOnce({} as any); + open(); + const item = await screen.findByRole("article", { name: evidence.title }); + fillDraft(); + fireEvent.click(within(item).getByRole("button", { name: /Reduced incidents/ })); + let dialog = await screen.findByRole("dialog", { name: translations.en.careerEvidenceDeleteTitle }); + fireEvent.click(within(dialog).getByRole("button", { name: translations.en.deleteAction })); + expect(await within(item).findByRole("alert")).toHaveTextContent("Evidence deletion unavailable"); + expect(mocked.delete).toHaveBeenCalledWith("/career/evidence/1"); + expect(screen.getByLabelText("Evidence statement", { exact: false })).toHaveValue(evidence.statement); + await waitFor(() => expect(screen.queryByRole("dialog")).not.toBeInTheDocument()); + fireEvent.click(within(item).getByRole("button", { name: translations.en.retry })); + dialog = await screen.findByRole("dialog", { name: translations.en.careerEvidenceDeleteTitle }); + fireEvent.click(within(dialog).getByRole("button", { name: translations.en.deleteAction })); + await waitFor(() => expect(screen.queryByRole("article", { name: evidence.title })).not.toBeInTheDocument()); + expect(mocked.delete.mock.calls.map(([url]) => url)).toEqual(["/career/evidence/1", "/career/evidence/1"]); + expect(mocked.get).toHaveBeenCalledTimes(1); + expect(mocked.post).not.toHaveBeenCalled(); + expect(screen.getByLabelText("Short title", { exact: false })).toHaveValue(evidence.title); + await waitFor(() => expect(screen.getByLabelText("Short title", { exact: false })).toHaveFocus()); +}); + +test("evidence sections and factual fields have semantic headings and required labels in Bokmål", async () => { + mocked.get.mockResolvedValue({ data: [evidence] } as any); + open("nb"); + expect(screen.getByRole("heading", { name: translations.nb.careerEvidenceTitle, level: 2 })).toBeInTheDocument(); + expect(screen.getByRole("heading", { name: translations.nb.careerEvidenceAdd, level: 3 })).toBeInTheDocument(); + expect(screen.getByLabelText(translations.nb.careerEvidenceItemTitle, { exact: false })).toBeRequired(); + expect(screen.getByLabelText(translations.nb.careerEvidenceStatement, { exact: false })).toBeRequired(); + const item = await screen.findByRole("article", { name: evidence.title }); + expect(within(item).getByRole("heading", { name: evidence.title, level: 3 })).toBeInTheDocument(); + expect(item).toHaveTextContent(translations.nb.careerEvidenceCategory_achievement); + expect(item).toHaveTextContent(evidence.sourceReference); + expectNoWrites(); }); diff --git a/job-tracker-ui/src/career-workspace-page.test.tsx b/job-tracker-ui/src/career-workspace-page.test.tsx index b6be7d2..1cad68b 100644 --- a/job-tracker-ui/src/career-workspace-page.test.tsx +++ b/job-tracker-ui/src/career-workspace-page.test.tsx @@ -1,16 +1,23 @@ import React from "react"; import "@testing-library/jest-dom"; -import { render, screen, waitFor } from "@testing-library/react"; +import { act, fireEvent, render, screen, waitFor, within } from "@testing-library/react"; import { cvBuilderApi } from "./cvBuilder"; import CareerWorkspaceOverview, { CareerWorkspaceImportRun } from "./views/career/CareerWorkspaceOverview"; import { I18nProvider } from "./i18n/I18nProvider"; +import { translations } from "./i18n/translations"; +import { api } from "./api"; +import { ToastProvider } from "./toast"; +import { ConfirmProvider } from "./confirm"; +import CareerProfilePage from "./views/CareerProfilePage"; jest.mock("./cvBuilder", () => ({ cvBuilderApi: { list: jest.fn() }, })); const mockedList = cvBuilderApi.list as jest.MockedFunction; +const mockedApi = api as jest.Mocked; +const careerResponse = { profile: { version: "1", contact: { fullName: "Stored career name" }, skills: ["Stored C#"] }, completeness: { percent: 70, missing: ["Projects"], sections: [] }, cvText: "Stored raw text" }; function renderOverview({ percent = 0, @@ -18,12 +25,22 @@ function renderOverview({ runs = [], loading = false, loadError = null, + runsLoading = false, + runsLoadError = null, + onRetryProfile, + onRetryRuns, + profileDirty = false, }: { percent?: number; missing?: string[]; runs?: CareerWorkspaceImportRun[]; loading?: boolean; loadError?: string | null; + runsLoading?: boolean; + runsLoadError?: string | null; + onRetryProfile?: () => void; + onRetryRuns?: () => void; + profileDirty?: boolean; } = {}) { return render( @@ -32,14 +49,28 @@ function renderOverview({ runs={runs} loading={loading} loadError={loadError} + runsLoading={runsLoading} + runsLoadError={runsLoadError} + onRetryProfile={onRetryProfile} + onRetryRuns={onRetryRuns} + profileDirty={profileDirty} /> , ); } beforeEach(() => { + jest.clearAllMocks(); + window.history.replaceState({}, "", "/career"); window.localStorage.removeItem("uiLanguage"); - mockedList.mockResolvedValue([]); + mockedList.mockReset().mockResolvedValue([]); + mockedApi.get.mockReset().mockImplementation((url: string) => { + if (url === "/career/profile") return Promise.resolve({ data: careerResponse } as any); + if (url === "/auth/me") return Promise.resolve({ data: { id: "career-owner", provider: "local", displayName: "Account name" } } as any); + if (["/profile-cv/runs", "/career/profile/versions", "/career/evidence"].includes(url)) return Promise.resolve({ data: [] } as any); + return Promise.reject(new Error(`Unexpected read: ${url}`)); + }); + for (const method of [mockedApi.post, mockedApi.put, mockedApi.patch, mockedApi.delete]) method.mockReset().mockRejectedValue(new Error("Unexpected write")); }); afterEach(() => { @@ -107,3 +138,118 @@ test("workspace represents loading and profile-load errors without inventing sta expect(screen.queryByText(/start by adding career information/i)).not.toBeInTheDocument(); await waitFor(() => expect(mockedList).toHaveBeenCalledTimes(1)); }); + +test("a settled failed profile read hides the completeness score and retries only through its existing owner", async () => { + const retry = jest.fn(); + renderOverview({ percent: 70, loadError: "Profile unavailable", onRetryProfile: retry }); + const region = screen.getByRole("region", { name: translations.en.careerOverviewProfileStatus }); + expect(within(region).queryByRole("progressbar")).not.toBeInTheDocument(); + expect(within(region).queryByText("70%")).not.toBeInTheDocument(); + expect(within(region).getByRole("alert")).toHaveTextContent(translations.en.careerOverviewUnavailable); + fireEvent.click(within(region).getByRole("button", { name: translations.en.retry })); + expect(retry).toHaveBeenCalledTimes(1); + expect(mockedApi.put).not.toHaveBeenCalled(); + await screen.findByText(translations.en.careerOverviewNoCvs); +}); + +test("an unknown import read cannot claim no imports, completion or first-run guidance", async () => { + renderOverview({ runsLoading: true }); + const region = screen.getByRole("region", { name: translations.en.careerOverviewCvImport }); + expect(within(region).getByRole("status")).toHaveTextContent(translations.en.loading); + expect(screen.queryByText(translations.en.careerOverviewNoImport)).not.toBeInTheDocument(); + expect(screen.queryByText(translations.en.careerOverviewImportComplete)).not.toBeInTheDocument(); + await screen.findByText(translations.en.careerOverviewNoCvs); + expect(screen.queryByText(translations.en.careerOverviewFirstRun)).not.toBeInTheDocument(); +}); + +test("a failed import read stays unknown and keeps its own retry separate from the profile read", async () => { + const retryRuns = jest.fn(); + const retryProfile = jest.fn(); + renderOverview({ runsLoadError: "Run read unavailable", onRetryRuns: retryRuns, onRetryProfile: retryProfile }); + const region = screen.getByRole("region", { name: translations.en.careerOverviewCvImport }); + expect(within(region).getByRole("alert")).toHaveTextContent(translations.en.careerOverviewImportUnavailable); + expect(screen.queryByText(translations.en.careerOverviewNoImport)).not.toBeInTheDocument(); + fireEvent.click(within(region).getByRole("button", { name: translations.en.retry })); + expect(retryRuns).toHaveBeenCalledTimes(1); + expect(retryProfile).not.toHaveBeenCalled(); + await screen.findByText(translations.en.careerOverviewNoCvs); + expect(screen.queryByText(translations.en.careerOverviewFirstRun)).not.toBeInTheDocument(); +}); + +test("failed recent-CV reads do not imply first-run and retry the same list without writes", async () => { + mockedList.mockRejectedValueOnce(new Error("Recent list unavailable")); + renderOverview(); + const region = screen.getByRole("region", { name: translations.en.careerOverviewRecentCvs }); + expect(await within(region).findByRole("alert")).toHaveTextContent(translations.en.careerOverviewRecentFailed); + expect(screen.queryByText(translations.en.careerOverviewFirstRun)).not.toBeInTheDocument(); + expect(within(region).queryByText(translations.en.careerOverviewNoCvs)).not.toBeInTheDocument(); + fireEvent.click(within(region).getByRole("button", { name: translations.en.retry })); + expect(await within(region).findByText(translations.en.careerOverviewNoCvs)).toBeVisible(); + expect(mockedList).toHaveBeenCalledTimes(2); + expect(mockedApi.post).not.toHaveBeenCalled(); + expect(mockedApi.put).not.toHaveBeenCalled(); +}); + +function renderCareer() { + return render(); +} + +test("the parent exposes failed import-read retry without canonical saves or history restores", async () => { + let fail = true; + const originalGet = mockedApi.get.getMockImplementation()!; + mockedApi.get.mockImplementation((url: string) => url === "/profile-cv/runs" && fail + ? Promise.reject(new Error("Run read unavailable")) : originalGet(url)); + renderCareer(); + const region = screen.getByRole("region", { name: translations.en.careerOverviewCvImport }); + expect(await within(region).findByRole("alert")).toHaveTextContent(translations.en.careerOverviewImportUnavailable); + const careerReads = mockedApi.get.mock.calls.filter(([url]) => url === "/career/profile").length; + fail = false; + fireEvent.click(within(region).getByRole("button", { name: translations.en.retry })); + expect(await within(region).findByText(translations.en.careerOverviewNoImport)).toBeVisible(); + expect(mockedApi.get.mock.calls.filter(([url]) => url === "/profile-cv/runs")).toHaveLength(2); + expect(mockedApi.get.mock.calls.filter(([url]) => url === "/career/profile")).toHaveLength(careerReads); + expect(mockedApi.post).not.toHaveBeenCalled(); + expect(mockedApi.put).not.toHaveBeenCalled(); +}); + +test("overview retry cannot overwrite a dirty canonical draft after a failed source refresh", async () => { + renderCareer(); + await screen.findByText("70%"); + fireEvent.click(screen.getByRole("tab", { name: translations.en.careerWorkspaceProfileTab })); + fireEvent.change(screen.getByLabelText("Full name"), { target: { value: "Unsaved canonical name" } }); + fireEvent.click(screen.getByRole("tab", { name: translations.en.careerWorkspaceOverviewTab })); + const originalGet = mockedApi.get.getMockImplementation()!; + mockedApi.get.mockImplementation((url: string) => url === "/career/profile" + ? Promise.reject(new Error("Source refresh unavailable")) : originalGet(url)); + act(() => window.dispatchEvent(new StorageEvent("storage", { key: "uiLanguage", newValue: "nb" }))); + const region = await screen.findByRole("region", { name: translations.nb.careerOverviewProfileStatus }); + expect(await within(region).findByRole("alert")).toHaveTextContent(translations.nb.careerOverviewRetryDraftHint); + const reads = mockedApi.get.mock.calls.length; + const retry = within(region).getByRole("button", { name: translations.nb.retry }); + expect(retry).toBeDisabled(); + fireEvent.click(retry); + expect(mockedApi.get).toHaveBeenCalledTimes(reads); + fireEvent.click(screen.getByRole("tab", { name: translations.nb.careerWorkspaceProfileTab })); + expect(screen.getByLabelText("Fullt navn")).toHaveValue("Unsaved canonical name"); + expect(mockedApi.put).not.toHaveBeenCalled(); +}); + +test("visited evidence keeps its draft across sections without an unvisited or repeated list request", async () => { + renderCareer(); + await screen.findByText("70%"); + expect(mockedApi.get).not.toHaveBeenCalledWith("/career/evidence"); + fireEvent.click(screen.getByRole("tab", { name: translations.en.careerWorkspaceEvidenceTab })); + await screen.findByText(translations.en.careerEvidenceEmpty); + fireEvent.change(screen.getByLabelText(translations.en.careerEvidenceItemTitle, { exact: false }), { target: { value: "Unsaved evidence title" } }); + fireEvent.change(screen.getByLabelText(translations.en.careerEvidenceStatement, { exact: false }), { target: { value: "Unsaved factual statement" } }); + fireEvent.change(screen.getByLabelText(translations.en.careerEvidenceTags), { target: { value: "C#, reliability" } }); + fireEvent.click(screen.getByRole("tab", { name: translations.en.careerWorkspaceProfileTab })); + expect(screen.queryByRole("region", { name: translations.en.careerEvidenceTitle })).not.toBeInTheDocument(); + fireEvent.click(screen.getByRole("tab", { name: translations.en.careerWorkspaceEvidenceTab })); + expect(screen.getByLabelText(translations.en.careerEvidenceItemTitle, { exact: false })).toHaveValue("Unsaved evidence title"); + expect(screen.getByLabelText(translations.en.careerEvidenceStatement, { exact: false })).toHaveValue("Unsaved factual statement"); + expect(screen.getByLabelText(translations.en.careerEvidenceTags)).toHaveValue("C#, reliability"); + expect(mockedApi.get.mock.calls.filter(([url]) => url === "/career/evidence")).toHaveLength(1); + expect(mockedApi.post).not.toHaveBeenCalled(); + expect(mockedApi.put).not.toHaveBeenCalled(); +}); diff --git a/job-tracker-ui/src/i18n/translations.ts b/job-tracker-ui/src/i18n/translations.ts index 89404cf..191bd3a 100644 --- a/job-tracker-ui/src/i18n/translations.ts +++ b/job-tracker-ui/src/i18n/translations.ts @@ -888,7 +888,9 @@ export const translations = { careerOverviewSubtitle: "Choose what you want to work on next.", careerOverviewOpenBuilder: "Open CV Builder", careerOverviewFirstRun: "Start by adding career information manually or importing a CV.", - careerOverviewUnavailable: "Workspace status is unavailable. The profile editor below can retry the request.", + careerOverviewUnavailable: "Workspace status is unavailable.", + careerOverviewImportUnavailable: "CV import status could not be loaded.", + careerOverviewRetryDraftHint: "Your Career profile has unsaved changes. Review them in the profile before retrying.", careerOverviewProfileStatus: "Profile status", careerOverviewCompleteness: "Profile completeness", careerOverviewCompletenessLabel: "Career profile completeness", @@ -927,7 +929,7 @@ export const translations = { careerOverviewChooseJob: "Choose a job", careerOverviewRecentCvs: "Recent CVs", careerOverviewViewAll: "View all CVs", - careerOverviewRecentFailed: "Recent CVs could not be loaded. Open the CV Builder to try again.", + careerOverviewRecentFailed: "Recent CVs could not be loaded.", careerOverviewNoCvs: "No CV documents yet.", careerOverviewUpdated: "Updated {date}", careerOverviewJobSpecific: "Job-specific", @@ -3476,7 +3478,9 @@ export const translations = { careerOverviewSubtitle: "Velg hva du vil arbeide med videre.", careerOverviewOpenBuilder: "Åpne CV-bygger", careerOverviewFirstRun: "Start med å legge til karriereinformasjon manuelt eller importere en CV.", - careerOverviewUnavailable: "Status for karriereområdet er utilgjengelig. Profilredigeringen nedenfor kan prøve forespørselen på nytt.", + careerOverviewUnavailable: "Status for karriereområdet er utilgjengelig.", + careerOverviewImportUnavailable: "Kunne ikke laste status for CV-import.", + careerOverviewRetryDraftHint: "Karriereprofilen har ulagrede endringer. Se gjennom dem i profilen før du prøver igjen.", careerOverviewProfileStatus: "Profilstatus", careerOverviewCompleteness: "Hvor komplett profilen er", careerOverviewCompletenessLabel: "Hvor komplett karriereprofilen er", @@ -3515,7 +3519,7 @@ export const translations = { careerOverviewChooseJob: "Velg en jobb", careerOverviewRecentCvs: "Nylige CV-er", careerOverviewViewAll: "Vis alle CV-er", - careerOverviewRecentFailed: "Nylige CV-er kunne ikke lastes. Åpne CV-byggeren for å prøve igjen.", + careerOverviewRecentFailed: "Kunne ikke laste nylige CV-er.", careerOverviewNoCvs: "Ingen CV-dokumenter ennå.", careerOverviewUpdated: "Oppdatert {date}", careerOverviewJobSpecific: "Jobbspesifikk", diff --git a/job-tracker-ui/src/views/CareerProfilePage.tsx b/job-tracker-ui/src/views/CareerProfilePage.tsx index 63ae437..0fe7a8d 100644 --- a/job-tracker-ui/src/views/CareerProfilePage.tsx +++ b/job-tracker-ui/src/views/CareerProfilePage.tsx @@ -150,7 +150,7 @@ export default function CareerProfilePage() { const cvInputRef = useRef(null); const avatarInputRef = useRef(null); const [me, setMe] = useState(null); - const [loading, setLoading] = useState(false); + const [loading, setLoading] = useState(true); const [loadError, setLoadError] = useState(null); const [uploadingCv, setUploadingCv] = useState(false); const [improvingCv, setImprovingCv] = useState(false); @@ -170,9 +170,11 @@ export default function CareerProfilePage() { // The raw import/section parser remains available as an advanced recovery tool. const [showAdvancedCvTools, setShowAdvancedCvTools] = useState(false); const [workspaceSection, setWorkspaceSection] = useState(initialWorkspaceSection); + const [evidenceVisited, setEvidenceVisited] = useState(() => initialWorkspaceSection() === "evidence"); const navigateWorkspace = useCallback((next: CareerWorkspaceSection) => { setWorkspaceSection(next); + if (next === "evidence") setEvidenceVisited(true); if (typeof window === "undefined") return; const url = new URL(window.location.href); if (next === "overview") url.searchParams.delete("section"); @@ -205,6 +207,9 @@ export default function CareerProfilePage() { } }, [loadVersions, 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 [reviewingRunId, setReviewingRunId] = useState(null); const [acceptedLowConfidenceIds, setAcceptedLowConfidenceIds] = useState>({}); @@ -216,11 +221,19 @@ export default function CareerProfilePage() { }, []); const loadExtractionRuns = useCallback(async () => { + const readId = ++runsReadId.current; + setRunsLoading(true); try { const response = await api.get("/profile-cv/runs"); - setExtractionRuns(response.data ?? []); - } catch { + if (readId === runsReadId.current) { + setExtractionRuns(response.data ?? []); + setRunsLoadError(null); + } + } catch (error) { // Polling failure must not clear existing run state or touch unsaved profile edits. + if (readId === runsReadId.current) setRunsLoadError(String(error)); + } finally { + if (readId === runsReadId.current) setRunsLoading(false); } }, []); @@ -367,11 +380,16 @@ export default function CareerProfilePage() { runs={extractionRuns} loading={loading} loadError={loadError} + runsLoading={runsLoading} + runsLoadError={runsLoadError} + onRetryRuns={() => void loadExtractionRuns()} + onRetryProfile={() => { if (!profileDirty) void loadProfile(); }} + profileDirty={profileDirty} onNavigate={navigateWorkspace} /> ) : null} - {workspaceSection === "evidence" ? : null} + {evidenceVisited ? : null} {workspaceSection === "profile" || workspaceSection === "import" ? ([]); const [title, setTitle] = useState(""); const [statement, setStatement] = useState(""); - const [category, setCategory] = useState("achievement"); const [tags, setTags] = useState(""); const [source, setSource] = useState(""); - const [error, setError] = useState(null); const [busy, setBusy] = useState(false); - const load = () => api.get("/career/evidence").then(r => { setItems(r.data); setError(null); }).catch(e => setError(getApiErrorMessage(e, t("careerEvidenceLoadFailed")))); - useEffect(() => { void load(); }, []); // eslint-disable-line react-hooks/exhaustive-deps - const add = async () => { setBusy(true); try { const r = await api.post("/career/evidence", { category, title, statement, tags: tags.split(","), sourceType: "manual", sourceReference: source, isVerified: true }); setItems(v => [r.data, ...v]); setTitle(""); setStatement(""); setTags(""); setSource(""); setError(null); } catch (e) { setError(getApiErrorMessage(e, t("careerEvidenceSaveFailed"))); } finally { setBusy(false); } }; - const remove = async (item: Evidence) => { if (!(await confirm({ title: t("careerEvidenceDeleteTitle"), message: t("careerEvidenceDeleteMessage", { title: item.title }), confirmLabel: t("deleteAction"), destructive: true }))) return; try { await api.delete(`/career/evidence/${item.id}`); setItems(v => v.filter(x => x.id !== item.id)); } catch (e) { setError(getApiErrorMessage(e, t("careerEvidenceDeleteFailed"))); } }; + const { t } = useI18n(); + const { confirm } = useConfirm(); + const [items, setItems] = useState([]); + const [title, setTitle] = useState(""); + const [statement, setStatement] = useState(""); + const [category, setCategory] = useState("achievement"); + const [tags, setTags] = useState(""); + const [source, setSource] = useState(""); + const [loading, setLoading] = useState(true); + const [readAttempt, setReadAttempt] = useState(0); + const [loadError, setLoadError] = useState<{ cause: unknown } | null>(null); + const [saveError, setSaveError] = useState<{ cause: unknown } | null>(null); + const [deleteErrors, setDeleteErrors] = useState>({}); + const [busy, setBusy] = useState(false); + const [deletingId, setDeletingId] = useState(null); + const writePending = useRef(false); + const titleInputRef = useRef(null); + const focusAfterDelete = useRef(false); + + useEffect(() => { + let cancelled = false; + setLoading(true); + api.get("/career/evidence") + .then((response) => { if (!cancelled) { setItems(response.data); setLoadError(null); } }) + .catch((cause) => { if (!cancelled) setLoadError({ cause }); }) + .finally(() => { if (!cancelled) setLoading(false); }); + return () => { cancelled = true; }; + }, [readAttempt]); + + useEffect(() => { + if (focusAfterDelete.current) { + focusAfterDelete.current = false; + titleInputRef.current?.focus(); + } + }, [items]); + + const add = async () => { + if (writePending.current || loading || loadError || !title.trim() || !statement.trim()) return; + writePending.current = true; + setBusy(true); + try { + const response = await api.post("/career/evidence", { category, title, statement, tags: tags.split(","), sourceType: "manual", sourceReference: source, isVerified: true }); + setItems((previous) => [response.data, ...previous]); + setTitle(""); setStatement(""); setTags(""); setSource(""); + setSaveError(null); + } catch (cause) { + setSaveError({ cause }); + } finally { + writePending.current = false; + setBusy(false); + } + }; + + const remove = async (item: Evidence) => { + if (writePending.current || loading || loadError) return; + writePending.current = true; + try { + if (!(await confirm({ title: t("careerEvidenceDeleteTitle"), message: t("careerEvidenceDeleteMessage", { title: item.title }), confirmLabel: t("deleteAction"), destructive: true }))) return; + setDeletingId(item.id); + await api.delete(`/career/evidence/${item.id}`); + focusAfterDelete.current = true; + setItems((previous) => previous.filter((entry) => entry.id !== item.id)); + setDeleteErrors((previous) => { const next = { ...previous }; delete next[item.id]; return next; }); + } catch (cause) { + setDeleteErrors((previous) => ({ ...previous, [item.id]: { cause } })); + } finally { + writePending.current = false; + setDeletingId(null); + } + }; const categories = ["achievement", "metric", "project", "technology", "responsibility", "example"]; - const categoryLabel = (value: string) => t(`careerEvidenceCategory_${value}` as "careerEvidenceCategory_achievement"); - return - {t("careerEvidenceTitle")}{t("careerEvidenceSubtitle")} - {error && void load()}>{t("retry")}}>{error}} - - {t("careerEvidenceAdd")} - setCategory(e.target.value)}>{categories.map(v => {categoryLabel(v)})} - setTitle(e.target.value)} /> - setStatement(e.target.value)} multiline minRows={3} helperText={t("careerEvidenceTruthHelp")} /> - setTags(e.target.value)} helperText={t("careerEvidenceTagsHelp")} /> - setSource(e.target.value)} helperText={t("careerEvidenceSourceHelp")} /> - - - {items.length === 0 ? {t("careerEvidenceEmpty")} : items.map(item => - {item.title}{categoryLabel(item.category)} · {item.sourceReference || t("careerEvidenceManualSource")} + const categoryLabel = (value: string) => categories.includes(value) ? t(`careerEvidenceCategory_${value}` as "careerEvidenceCategory_achievement") : value; + return + + {loading ? {t("loading")} : loadError ? { titleInputRef.current?.focus(); setReadAttempt((attempt) => attempt + 1); }}>{t("retry")}}>{getApiErrorMessage(loadError.cause, t("careerEvidenceLoadFailed"))} : null} + + {saveError ? {getApiErrorMessage(saveError.cause, t("careerEvidenceSaveFailed"))} : null} + setCategory(e.target.value)}>{categories.map(v => {categoryLabel(v)})} + setTitle(e.target.value)} /> + setStatement(e.target.value)} multiline minRows={3} helperText={t("careerEvidenceTruthHelp")} /> + setTags(e.target.value)} helperText={t("careerEvidenceTagsHelp")} /> + setSource(e.target.value)} helperText={t("careerEvidenceSourceHelp")} /> + + + {!loading && !loadError && items.length === 0 ? {t("careerEvidenceEmpty")} : null} + {items.map(item => + {item.title}{categoryLabel(item.category)} · {item.sourceReference || t("careerEvidenceManualSource")} + {deleteErrors[item.id] ? void remove(item)}>{t("retry")}}>{getApiErrorMessage(deleteErrors[item.id].cause, t("careerEvidenceDeleteFailed"))} : null} {item.statement}{item.tags.map(tag => )} )} - ; + + ; } diff --git a/job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx b/job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx index 2d1f2ca..c2be014 100644 --- a/job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx +++ b/job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useMemo, useState } from "react"; +import React, { useEffect, useMemo, useRef, useState } from "react"; import { Alert, Box, Button, Chip, LinearProgress, Paper, Skeleton, Stack, Typography } from "@mui/material"; import DescriptionOutlinedIcon from "@mui/icons-material/DescriptionOutlined"; @@ -9,6 +9,7 @@ import WorkOutlineIcon from "@mui/icons-material/WorkOutline"; import { CvVariantSummary, cvBuilderApi } from "../../cvBuilder"; import type { UserOperation } from "../../types"; import { useI18n } from "../../i18n/I18nProvider"; +import { PageSection } from "../../layout/PageLayout"; import { localizeCompletenessLabel } from "./careerCompletenessLabels"; export type CareerWorkspaceCompleteness = { @@ -40,10 +41,10 @@ function ActionCard({ title, body, href, label, icon, onNavigate }: { onNavigate?: () => void; }) { return ( - + {icon} - {title} + {title} {body} - - - {isFirstRun ? {t("careerOverviewFirstRun")} : null} - {loadError ? {t("careerOverviewUnavailable")} : null} - - - + } href="/career/builder">{t("careerOverviewOpenBuilder")} + }> + + {isFirstRun ? {t("careerOverviewFirstRun")} : null} + + - {t("careerOverviewCompleteness")} - {loading ? : {completeness?.percent ?? 0}%} + {t("careerOverviewCompleteness")} + {loading ? : profileKnown ? {completeness.percent}% : null} - - {!loading && completeness?.missing.length ? ( + {loading || profileKnown ? : null} + {loadError ? { profileLinkRef.current?.focus(); onRetryProfile(); }}>{t("retry")} : undefined}> + {t("careerOverviewUnavailable")} + {profileDirty ? {t("careerOverviewRetryDraftHint")} : null} + : null} + {profileKnown && completeness.missing.length ? ( {t("careerOverviewAddNext", { items: completeness.missing.slice(0, 3).map((label) => localizeCompletenessLabel(label, t)).join(", ") })} ) : null} - - - - - {t("careerOverviewCvImport")} - {importState.message} - - + + + + {importUnknown ? {t("loading")} + : runsLoadError ? { importLinkRef.current?.focus(); onRetryRuns(); }}>{t("retry")} : undefined}>{t("careerOverviewImportUnavailable")} + : {importState.message}} + + - onNavigate("profile") : undefined} label={t("careerOverviewEditProfile")} icon={} /> - onNavigate("import") : undefined} label={importState.label} icon={} /> + onNavigate("import") : undefined} label={importLabel} icon={} /> } /> } /> - - - {t("careerOverviewRecentCvs")} - - + {t("careerOverviewViewAll")}}> {recentLoading ? ( - + {t("loading")} ) : recentError ? ( - {t("careerOverviewRecentFailed")} + { recentLinkRef.current?.focus(); setRecentAttempt((attempt) => attempt + 1); }}>{t("retry")}}>{t("careerOverviewRecentFailed")} ) : recentCvs.length === 0 ? ( {t("careerOverviewNoCvs")} ) : ( {recentCvs.map((cv) => ( - + {cv.name} {t("careerOverviewUpdated", { date: new Date(cv.updatedAtUtc).toLocaleDateString(language === "nb" ? "nb-NO" : "en-GB") })} @@ -171,7 +176,8 @@ export default function CareerWorkspaceOverview({ completeness, runs, loading, l ))} )} - - + + + ); }