docs(redesign): plan P5-15 acceptance checkpoints

This commit is contained in:
cesnimda
2026-10-09 08:29:16 +02:00
parent 46a0c0c6d2
commit 932b962b90
11 changed files with 937 additions and 2 deletions
+6 -2
View File
@@ -1,5 +1,7 @@
# Phase 5 implementation plan
**Acceptance-planning successor — 2026-10-09:** [P5-15-00](p5-15/README.md) audits the implemented source at `46a0c0c` and defines bounded acceptance checkpoints. It does not start their execution, qualify P5-13 or authorize production. Historical proposal language below is reconciled by linked implementation/readiness successors; all original requirements remain. Every completed logical P5-15 change/evidence checkpoint must be committed, immediately pushed to development, and checked against the remote before continuing. Stop after 00 for owner review.
**Documentation only. No implementation slice is authorized or started by this checkpoint.** Start from `2a2f9e48052c562ef599825458d0d3a6f9f9fc61` on `codex/ui-redesign-phase4`. Each row below is a separately reviewable implementation checkpoint when explicitly requested. Stop after each; never run automatically into the next slice.
Sources: [Phase 3 sequencing](../phase-3/PHASE4_IMPLEMENTATION_PLAN.md), [P4-06 conditional acceptance](../phase-4/p4-06/README.md), [readiness gates](READINESS_GATES.md), [navigation contract](NAVIGATION_MIGRATION.md), [57-contract impact](PRESERVATION_IMPACT.md), [visual acceptance](VISUAL_ACCEPTANCE.md). This plan makes Phase 3 proposals concrete; it does not supersede preserved functionality or turn missing APIs into existing capabilities.
@@ -38,7 +40,7 @@ Sources: [Phase 3 sequencing](../phase-3/PHASE4_IMPLEMENTATION_PLAN.md), [P4-06
- Use existing MUI/Emotion, semantic focus/color/status roles, PageHeader/PageSection and width/density aliases. No new theme, table framework, provider tree, persistent private store, generic save framework, or final brand/font/logo decision.
- Retain all 31 current routes and compatibility paths. Add `/analytics` only in P5-07 with meaningful existing content. P5-04b preserves `/kanban` as an alias only after parity; never remove it. Deep-link and dirty/account lifetimes are acceptance conditions, not cleanup.
- Every slice applies [visual acceptance](VISUAL_ACCEPTANCE.md), including light/dark × EN/NB, real populated/error data, desktop/phone and keyboard checks. All migrations are mobile-capable immediately; P5-14 is additional end-to-end review.
- After final code change run full inherited backend/frontend/browser/type/lint/build/security/config/secret/whitespace checks per [README](README.md#validation-baseline). Explain added/removed case counts, retain P2-D01 until separately proven fixed. Update a slice trace with actual commit/tests/evidence, not this plan's future tense.
- After final code change run full inherited backend/frontend/browser/type/lint/build/security/config/secret/whitespace checks per [README](README.md#validation-baseline). Explain added/removed case counts. **P2-D01 is an ordinary passing regression after P5-08b readiness**, not a current expected failure; retain the historical failing evidence and the passing native contract. Update a slice trace with actual commit/tests/evidence, not this plan's future tense.
- Roll back a slice's presentation and adapters together, retaining original data and URLs. No schema migration is included. Keep regression tests that describe still-required behavior; do not disable security gates to revert UI. A later compatibility URL already shared must continue resolving during rollback.
- Stop on unknown ownership/product semantics, newly required schema/provider/renderer replacement, unsafe query truncation or a failing preserved workflow. Document the affected scope; independent slices may proceed only by a subsequent instruction.
@@ -110,7 +112,9 @@ Sources: [Phase 3 sequencing](../phase-3/PHASE4_IMPLEMENTATION_PLAN.md), [P4-06
**Dependency/rollback:** P5-03 styling contract; independent of G-PACKAGE/CV. Revert board presentation while retaining its current API/path.
## P5-04b — Table/Board integration (blocked contract)
## P5-04b — Table/Board integration (read prerequisite satisfied)
Current status: [separate query readiness](p5-04b-readiness/README.md) and [integration](p5-04b/README.md) supply the accepted scoped implementation. The original dependency below remains the requirement; it is no longer an unexecuted blocker. Full-result scaling and physical-touch acceptance remain explicit gaps.
**Objective/scope:** once G-JOBS read parity is separately accepted, introduce one presentation `view=table|board` choice and compatible `/kanban` alias. Shared committed filter/query state, explicit selection lifetime, refresh and return context; reuse both renderers and the accepted read contract.
+2
View File
@@ -1,5 +1,7 @@
# Phase 5 — Representative screens / major UI redesign plan
**Current checkpoint — 2026-10-09: [P5-15-00 acceptance planning](p5-15/README.md).** The full slice/57-contract/route inventory, manual accessibility/device programme, debt and production-readiness criteria, and bounded 00–06 execution/push sequence are documented. This is documentation-only: application code/test counts are unchanged and no fresh application suite or human/device/production acceptance is claimed. P5-13 stays deferred/unqualified; P5-14 remains accepted only for its implemented subset. Production `main` remains NO-GO with automatic deployment on push. Commit/push this planning checkpoint to development and stop for review before P5-15-01, B07 or deployment.
**Current checkpoint — 2026-10-09: [P5-14 scoped responsive CV workflow](p5-14/README.md), CONDITIONAL GO for implemented P5-09–12 only.** Final validation: **1,023 backend / 459 frontend / 117 actual browser passes**, sidecar 49, focused AI/revision subsets 108/5, real HTTP 2, security/configuration 9/6/1/3; fidelity 16/16 with 36 aligned pages and settings exports 8/8 with 24 aligned pages. The measured shell boundary, bounded preview/chrome, owned Ctrl+Home/End and nested drag/drop correction preserve the existing state and native renderer. Thirty-three selected images and 242 axe scans retain incomplete/human/device/zoom/font qualifications. [Production remains NO-GO](production-release-decision/README.md), with no merge/push/deploy to `main`. P5-13 remains deferred/unqualified and withheld in Production; its missing responsive AI journey is not accepted. P5-15 and B07 have not started. Next is P5-15 acceptance planning with all retained debt, preserving the owner's requirement to commit/push every individual P5-15 change/checkpoint.
**Current direction — 2026-10-08, owner's release/P5-14 instruction:** Assess the completed candidate at `1095ef1d29856a2984cd800abd2bbd65dd472d38` against fresh tests and actual production evidence, then implement P5-14 for currently implemented CV capabilities even when production is blocked. The [production release decision](production-release-decision/README.md) identifies `main` as the automatic deployment branch; missing ingress/current recovery/configuration/rollback evidence means **PRODUCTION NO-GO**, with no production merge, push or deployment. This supersedes the previous qualification-only/deploy-after-P5-15 sequencing, without waiving any release gate. P5-13 remains deferred: 0/366 genuine calls, 0 human reviews, factuality unmeasured, AI review UI unimplemented and Production withholding active. [The debt register](OPEN_BLOCKERS.md#p5-13-deferred-debt-and-return-conditions--2026-10-08) retains every qualification/acceptance obligation. P5-14 excludes unimplemented AI review and cannot claim complete AI-assisted CV acceptance. Stop before P5-15 and B07; every individual P5-15 change/checkpoint must later be committed and pushed.
@@ -0,0 +1,113 @@
# P5-15 bounded acceptance programme
Planning source: `46a0c0c6d23464869f50c0d88552963c29cfdacf`, `codex/ui-redesign-phase4`, 2026-10-09. These are proposed execution checkpoints, **not executed tests or authorization to start them in this planning session**. Production `main` automatically deploys on push and remains NO-GO. P5-13 qualification, Docker recovery, AI-review UI and activation remain excluded; B07 and Phases 6–8 do not start.
## Checkpoint and push discipline
Each completed logical unit must be validated, committed, immediately pushed to the development branch and checked against the remote before starting the next unit. A findings-only checkpoint is valid; missing operator evidence is not a reason to create a fake pass or attempt unauthorized production operations. Record source/candidate SHA, exact commands, result paths, counts/deltas, reviewer/device/runtime identity and remaining gaps in its record. After commit, retain the SHA in the execution ledger/final report; the following checkpoint links its predecessor. Resolve this planning commit with `rtk git log -1 --format=%H -- docs/redesign/phase-5/p5-15/README.md`.
Use normal non-force pushes, then fetch and verify equal HEAD/remote SHA, `0 0` divergence and a clean working tree. Never combine several independently completed fixes in an unpushed tree. A remediation can be one small owner-specific fix plus its regression/evidence, not an individual-keystroke commit. Separate production evidence from local UI acceptance. No `main` merge/push is part of this programme; a later explicit release decision must authorize it.
## Proposed order
| ID / scope | Entry criteria | Required evidence and tests | Exit / dependencies | Commit/push boundary |
|---|---|---|---|---|
| **P5-15-00 Acceptance inventory and matrix** | Exact clean P5-14 checkpoint; approved plan and complete original PRES/route inventory available | Static component/action/route review; implementation ancestry; original and current evidence; 57 unique PRES groups, all 31 original patterns plus Analytics; axe/debt classification; documentation/secret/whitespace checks | Planning package internally consistent; unknowns explicitly recorded. No new implementation or fresh suite claim | **This documentation-only checkpoint**, push and stop for owner review |
| **P5-15-01 Functional/preservation audit** | Owner authorizes next checkpoint; 00 reviewed; disposable owned synthetic data and build provenance | Rerun core baseline below; walk every route with proper role/public identity, compatibility/query/dirty/Back rules and current controls. Exercise all applicable original sub-workflows, not only group representatives; use 57-row matrix to enumerate remaining tests | No demonstrated lost action/entry/ownership behavior. Record unknown provider/long-tail flows separately. Preservation regression is NO-GO for affected scope; bounded fixes return to explicit originating owner | Audit evidence/docs/tests as one checkpoint; each completed owner-specific repair separately commit/push before continuing |
| **P5-15-02 Responsive and accessibility audit** | 01 source stable and preservation failures addressed; named states/fixture identities fixed | [Manual script](MANUAL_ACCEPTANCE.md), full stable screenshot sets, loaded expanded axe node triage, actual keyboard/focus and chart/form tests; desktop/tablet/phone/landscape, four theme/locale pairs, Comfortable/Compact Jobs/Trash; normal/reduced motion | Human screen-reader, physical device/software keyboard and actual browser zoom/reflow outcomes have named evidence or remain NOT VERIFIED. Inaccessible essential controls, trap or loss of editing blocks affected acceptance. Automated zero violations is insufficient | Evidence checkpoint; any reproduced shared theme/modal/focus correction is its own tested push. Device/human packet can commit separately when completed |
| **P5-15-03 CV/document correctness qualification** | Accepted revision/native-package baselines; renderer unchanged unless separately justified; synthetic corpus/capture lifecycle ready | Fresh 5 revision cases, 16 standard fidelity fixtures and 8 settings exports plus package/P2-D01/publication/ownership/override-reset/recovery paths. Exact current content/settings; fonts/images settled; actual PDF/page metadata and visual comparisons | 16/16 and 8/8; 36=36 and 24=24 unless fixture expansion is explicitly justified; no count/missing-content/wrong-page/clipping regression. Production-equivalent Linux fonts/photos need separate verified runtime evidence, not local substitution | Correctness/evidence checkpoint. No geometry fix disguised as layout; a genuine renderer repair requires bounded approval/proof and a separate push |
| **P5-15-04 Debt triage and bounded remediation** | 01–03 findings and [debt register](READINESS_DEBT.md) reviewed; exact defect reproduced or explicitly NOT VERIFIED | Prioritize preference-save/SQLite failure, modal feedback and shared-dialog/command focus by actual impact. Record API exception/DB provider/concurrency, draft/readback, repeat rates and negative ownership; no sleep/retry masking. Core baseline after code changes | Every item has A/B/C/D classification, severity, scope/owner and evidence-based disposition. A known failure cannot become harmless by non-recurrence. Backend/product changes beyond acceptance need separate scope decision | **One completed logical fix per push**, then audit-ledger reconciliation. No giant debt-cleanup commit; P5-13, B07, new workflows and unrelated backend repairs stay excluded |
| **P5-15-05 Production evidence and readiness** | Authorized operator access, current recovery inventory and isolated rehearsal target; 04 candidate known; operator tasks scheduled | [Executable operator checklist](READINESS_DEBT.md#production-readiness-operator-checklist--prepared-not-executed); deployed ingress/trust/IP/firewall/DNS/TLS, current complete backup+restore, actual config/provider/schema/keys, migration/rollback rehearsal, protected CI and existing auth/tenant/provider smoke on approved targets | Every release-critical item verified or **Production NO-GO** retained. Do not block independent local evidence while operator tasks are unavailable. Actual production writes/destructive rehearsals require separate authorization | Sanitized evidence/decision checkpoint on development branch; no production merge/push/deploy. Missing evidence record remains a valid bounded NO-GO checkpoint |
| **P5-15-06 Final regression and acceptance decision** | All attempted audits/fixes pushed; final candidate stable; retained exceptions and manual/operator evidence reviewed | Complete final baseline, all representative screen/state visual sets, 57 groups/all routes, AI withholding/unrelated AI, source/revision/frozen/PDF/Settings/permissions, fresh secrets/builds/type/lint and document checks. Independent review of evidence provenance and debt | Report implemented-scope verdict, **original full Phase 5 scope verdict** and Production verdict separately; all P5 implementation/repair/evidence commits listed. Missing P5-13/manual obligations prohibit unconditional full Phase 5 GO | Final acceptance record push; remote/tree verified. Stop before Phase 6/7/8/B07 or any separately authorized deployment |
Operator/human work can be prepared while independent local audits proceed. Do not impersonate it to satisfy ordering. A shared regression blocks dependent evidence; merely unavailable infrastructure does not forbid a local findings-only checkpoint. Each proposed next checkpoint requires the owner's continuation instruction after this planning-only stop.
## Functional audit sequence
1. Compare exact [route disposition](ROUTE_ACCEPTANCE.md) and [navigation migration](../NAVIGATION_MIGRATION.md). Use public, normal account, second account and administrator fixtures. Check every primary/secondary/command/account/notification/context link; invoke visible controls and verify their intended read/write/modal destination. Hidden Admin navigation never proves authorization.
2. Confirm login/logout/remember/revoke/account switch and in-flight cancellation. A must not expose B's draft, notification, preview, job, file or protected proposal. Keep auth/CSRF/tenant negative tests and allowed/denied public/private CV identity distinct.
3. Jobs: equal **complete matching IDs**, standard/custom/unknown statuses, sort, paging, both densities, columns, saved views, selection and partial bulk failures; Table/Board URL switch and `/kanban` alias; pointer/keyboard/no-drag moves, failed move, Trash restore and job Browser Back context/focus. Assess request count/full-array memory with a larger synthetic account; no invented hard maximum.
4. Dashboard/Analytics: real definitions/populations/period/sample, all retained reports/actions, five owner-local flags and account switch; errors distinct from no data. Reproduce server preference persistence under overlapping reads/writes rather than assuming local display is server acknowledgement. No new metrics or Phase 8 layout engine.
5. Job workspace: all seven canonical sections, legacy text aliases and numeric 0–9 navigation-helper arguments (not numeric section URLs); URL/query/history/dirty Cancel/Discard, no write or AI generation on mount; timeline/notes versus answers/checklist/correspondence/calendar/interview boundaries; read-only frozen content and native ZIP/download preservation. `followMode` round-trips **metadata only**; do not claim a compose consumer.
6. CV: all five studio tabs, source/override/CV-only/omitted/custom entry, reset versus Undo versus history restore, reorder alternatives, failed/conflicting saves and draft recovery, selected/sibling/canonical/frozen readback, private/public publication and PDF. Existing geometry oracles remain authoritative.
7. Retained non-migrated Career Profile/library/mail/Settings/Admin/capture/import/export work: use every original PRES row's actions, including low-frequency controls. Route presence is only static proof. Provider-required tasks remain explicitly unverified until an authorized sandbox/operator supplies evidence.
## Baseline and rerun schedule
The following values are **inherited from P5-14**, not newly executed for P5-15-00. The [P5-14 result package](../p5-14/README.md#final-validation--2026-10-09) records final source hashes, counts, 33 selected images, actual suite dates and all incomplete checks.
| Gate | Inherited passing target / interpretation |
|---|---|
| Complete backend | **1,023**, zero failures/skips |
| Frontend | **459 / 82 suites**, zero failures/skips |
| Main browser | **117 actual passes**, zero failures/skips/retries; P2-D01 ordinary pass |
| Sidecar | **49**, deterministic/offline; not configured-model qualification |
| Focused AI / revision | **108 / 5**, subsets of backend, not additional backend cases |
| Real HTTP | **2**, isolated Production withholding before provider/write and unrelated AI availability |
| Rate-limit / ingress / PDF admission / configuration | **9 / 6 / 1 / 3**, isolated/local; no deployed F04 proof |
| Standard rendering | **16/16; 36 preview = 36 PDF pages** |
| Settings export rendering | **8/8; 24 = 24 pages** |
| Other retained helper suites | Supply-chain **3**, offline evaluation harness **5**, extension **3**; separate existing helpers |
| Static gates | App and E2E/AI TypeScript, lint, frontend production, API/test Release builds, secrets/whitespace/document links |
- Documentation-only checkpoint: validate links/anchors, all IDs/routes/commit ancestry/evidence counts, balanced tables/fences, source-tree unchanged, staged secret and whitespace checks. Reuse inherited suite evidence with matching source/hash limits. **Do not claim fresh suites.**
- Test-only evidence change: run changed fixtures and their owning suite; never rename/skip an ordinary regression. Preserve failed/interrupted reports. Before acceptance, rerun full applicable baseline with the final test candidate.
- Any application change: after the final code change run full applicable backend/frontend/browser/static/build/security/configuration baseline; CV frame/content/settings also rerun revision, standard and settings fidelity/native packages. Shared shell/theme changes rerun all representative screens. Additions/removals require named count explanations.
- Final 06: run everything against one recorded final candidate/build, with fresh native input timestamps and both success/failure evidence. A later substantive change invalidates affected completed evidence. Routine checks use deterministic providers, synthetic accounts and disposable local DBs; **no semantic model calls**.
## Existing command owners and safe order
These commands are a proposed run recipe, **not execution evidence**. Use installed project/bundled runtimes; do not install a replacement renderer, fetch external providers or expose keys. Set the task-specific artifacts directory; no existing historical captures are overwritten. Preserve existing single-worker backend/browser constraints and do not execute several suites against port 5302 concurrently.
```powershell
# Repository root; resolve these installed paths before starting.
$taskDotnet = 'C:/Users/Connor/.dotnet/dotnet.exe'
$taskPython = 'C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe'
$env:DOTNET_ROOT = 'C:/Users/Connor/.dotnet'
$env:DOTNET_HOST_PATH = $taskDotnet
rtk proxy $taskDotnet build JobTrackerApi/JobTrackerApi.csproj --configuration Release --no-restore -warnaserror
rtk proxy $taskDotnet build JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore -warnaserror
rtk proxy $taskDotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build --logger 'trx;LogFileName=p5-15-final.trx' --results-directory .artifacts/p5-15/final/backend -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1
rtk proxy tools/summarizer/.venv/Scripts/python.exe -m pytest tools/summarizer/tests
rtk proxy $taskPython -X utf8 scripts/test-ingress.py
rtk proxy $taskPython -X utf8 scripts/test-supply-chain.py
rtk proxy $taskPython -X utf8 scripts/test-ollama-evaluation.py
rtk proxy node --test browser-extension/tests/capture-url.test.mjs
# In job-tracker-ui, using its existing package/config files:
rtk proxy npm.cmd test -- --runInBand --watchAll=false --json --outputFile=../.artifacts/p5-15/final/frontend.json
rtk proxy npm.cmd run typecheck
rtk proxy npm.cmd run lint
$env:NEXT_PUBLIC_API_BASE_URL = 'http://localhost:5302/api'
$env:NEXT_TELEMETRY_DISABLED = '1'
rtk proxy npm.cmd run build
$env:PLAYWRIGHT_STATIC_EXPORT = 'true'
$env:PLAYWRIGHT_PREBUILT_EXPORT = 'true'
$env:PLAYWRIGHT_REUSE_SERVERS = 'false'
$env:CV_FIDELITY_OUTPUT = '../.artifacts/p5-15/final/fidelity'
$env:CV_SETTINGS_FIDELITY_OUTPUT = '../.artifacts/p5-15/final/settings-fidelity'
# Use a distinct JSON file/output directory per config; execute sequentially.
$env:PLAYWRIGHT_JSON_OUTPUT_FILE = '../.artifacts/p5-15/final/browser.json'
rtk proxy node node_modules/@playwright/test/cli.js test --retries=0 --reporter=list,json --output=../.artifacts/p5-15/final/browser-results
$env:PLAYWRIGHT_JSON_OUTPUT_FILE = '../.artifacts/p5-15/final/http.json'
rtk proxy node node_modules/@playwright/test/cli.js test --config=playwright.cv-ai.config.ts --retries=0 --reporter=list,json --output=../.artifacts/p5-15/final/http-results
$env:PLAYWRIGHT_JSON_OUTPUT_FILE = '../.artifacts/p5-15/final/rate-limit.json'
rtk proxy node node_modules/@playwright/test/cli.js test --config=playwright.rate-limits.config.ts --retries=0 --reporter=list,json --output=../.artifacts/p5-15/final/rate-limit-results
$env:PLAYWRIGHT_JSON_OUTPUT_FILE = '../.artifacts/p5-15/final/ingress.json'
rtk proxy node node_modules/@playwright/test/cli.js test --config=playwright.ingress.config.ts --retries=0 --reporter=list,json --output=../.artifacts/p5-15/final/ingress-results
$env:PLAYWRIGHT_JSON_OUTPUT_FILE = '../.artifacts/p5-15/final/pdf-admission.json'
rtk proxy node node_modules/@playwright/test/cli.js test --config=playwright.pdf.config.ts --retries=0 --reporter=list,json --output=../.artifacts/p5-15/final/pdf-admission-results
# Back at repository root, after collecting FRESH native measurements/PDFs:
rtk proxy $taskPython -X utf8 scripts/verify-cv-fidelity.py .artifacts/p5-15/final/fidelity
rtk proxy $taskPython -X utf8 scripts/verify-cv-fidelity.py .artifacts/p5-15/final/settings-fidelity
rtk proxy $taskPython -X utf8 scripts/supply-chain.py scan-secrets
rtk git diff --check
rtk git diff --cached --check
```
Capture flags/output roots and the settings-measurement assembly must be set using the existing [P5-12 recipe](../p5-12/README.md#reproduction-commands) and [P5-14 provenance](../p5-14/evidence/build-provenance.json); running the oracle against copied old PDFs is not a fresh result. Run focused AI/revision subsets with the recorded test-class filters for a separate count report, but do not add them to 1,023. E2E/AI TypeScript is outside the application tsconfig: recreate the existing temporary augmentation/config used by P5-14, include current E2E/AI files and record its contents/hash before running the separate compiler. The ignored local config path alone is not a portable specification. Supply the same link/anchor/PRES/table checks used by planning below; a historical validator in `.artifacts` is a local helper, not a production/test dependency.
## Evidence and decisions
Every screenshot/result needs source SHA, final build fingerprint, route/query/state, account role, fixture IDs/timezone/reference time, viewport/orientation/theme/locale/density, readiness signal and capture/reviewer date. Preserve initial failures and actual retries separately; do not count expected/incomplete/not-run as success. Trace files with cookies/headers/account tokens remain ignored; commit sanitized outcome tables, meaningful synthetic excerpts, measured values and useful images. Use [visual acceptance](../VISUAL_ACCEPTANCE.md) rather than screenshot volume as the standard.
**Implemented-scope GO** requires all declared critical behavioral, accessibility/document and security gates for that finite scope; **CONDITIONAL GO/PARTIAL** may describe explicitly limited evidence with owners/conditions, never a severe unresolved regression. **Original full Phase 5 GO is unavailable** while P5-13 qualification/review/UI and mandatory human/device acceptance remain incomplete. **Production GO is unavailable** until every A-class gate in [READINESS_DEBT](READINESS_DEBT.md) passes for the actual intended deployed configuration and a separate release authorization is given. Missing evidence is NOT VERIFIED; demonstrated unsafe behavior is FAIL. No verdict starts deployment or the next redesign phase.
@@ -0,0 +1,130 @@
# P5-15 — human and device acceptance plan
Planning-only P5-15-00, 2026-10-09; source `46a0c0c6d23464869f50c0d88552963c29cfdacf` on `codex/ui-redesign-phase4`. **Every human/device result below is NOT VERIFIED.** This file supplies executable acceptance scripts, not completed testing or a release verdict. No application/test change, test execution, live infrastructure/provider access, Docker operation, production action or semantic-model run occurred in this checkpoint. Production remains **NO-GO**; full Phase 5 acceptance remains **CONDITIONAL / PARTIAL**.
The requirements come from [Phase 3 accessibility](../../phase-3/ACCESSIBILITY_PLAN.md), [responsive strategy](../../phase-3/RESPONSIVE_STRATEGY.md), [AI interaction contract](../../phase-3/AI_INTERACTION_MODEL.md), [P4-06](../../phase-4/p4-06/README.md), [P5 visual acceptance](../VISUAL_ACCEPTANCE.md), [P5-14](../p5-14/README.md), and the [57-group preservation review](../release-readiness/PRESERVATION_REVIEW.md). Follow the [debt register](READINESS_DEBT.md) for owners and closure proof. The mapped groups and retained routes are not an exhaustive coverage percentage.
## Evidence already available and its limits
P4-06 retained 33 images, automated keyboard journeys and a manual in-app-browser UI/accessibility-tree observation. That observation was **not NVDA/Narrator acceptance**. P5-14 supplies final automated keyboard/pointer geometry, five new responsive journeys (one Chromium touch-emulation journey), 33 retained images, 117 actual browser passes, and scoped nested-drop/default-cancellation proof. The reproduced inaccessible return control, preview scroll loss and boundary-key failures have bounded successor evidence; their historical failed runs remain preserved. These sources are prior evidence, not fresh P5-15 execution.
Actual physical touch/drag, software keyboards, human spoken names/live announcements, mobile screen readers, 200%/400% browser zoom, forced colors, text spacing and deployed Linux/font/photo behavior remain **NOT VERIFIED**. A screenshot, accessibility-tree inspection, emulated tap or automated key press does not fill those gaps. The 320px CV's 34% automatic fit is an overview; legible reading of the document still needs acceptance.
## Axe incomplete census and triage
Derived by reading every `scans` entry in [P5-14 axe JSON](../p5-14/evidence/axe-summary.json), rather than copying a historical aggregate: `len(scans) = 242`; `sum(len(scan.violations)) = 0`; and `sum(len(rule.targets) for every scan.incomplete rule) = 1,839`. A target array is one node occurrence, including iframe selector paths. Repeated scans and selectors are **occurrences, not unique issues**. Zero reported violations does not mean incompletes passed. The JSON sets `incompleteAccepted=false` and `humanScreenReaderAcceptance="open"`. No check was run here.
| Rule | Incomplete node occurrences | Recorded contexts | Action and acceptance boundary |
|---|---:|---|---|
| `color-contrast` | **1,574** | Badges, Jobs filters/table/card actions, CV tabs/fields/undo tooltips, shell/menu text and preview iframe headings; all 16 scanned browser files | **Manual visual/computed-color review. Potential serious readability issue** if active text/control/focus is below the Phase 3 target. Measure actual settled rendered foreground/background, overlays, disabled explanations, hover/focus and document ink separately in light/dark. Hidden badges, CSS/iframe backgrounds and transition states can exceed automation's ability to calculate contrast; demonstrate why a specific node is inactive or review it, never dismiss all occurrences as false positives. Ordinary text target 4.5:1, large text 3:1, essential controls/focus 3:1. |
| `aria-hidden-focus` | **34** | `#menu-` 16, modal-isolated `#root` 12, `.MuiPopover-root` 4, `.MuiDrawer-modal` 2; company/command dialogs, CV/settings menus, phone row menus and Dashboard menu | **Potential serious focus/AT isolation problem.** Inspect each open/closed/entering/exiting context: Tab and virtual cursor must not reach hidden background or dismissed controls; focus must remain visible in the active modal and return to its trigger. Modal isolation or mounted exit content is a context to investigate, not proof of correctness. Do not remove `aria-hidden` to make a scan green. |
| `aria-prohibited-attr` | **209** | Named tooltip `span` wrappers for CV Undo/Redo (158 EN/NB occurrences), checklist Move up/down/not-relevant and Delete wrappers, Board empty chip, notification paper | **Semantic/AT investigation; potentially serious when the actionable name is lost or misleading.** Inspect rendered role/name and both wrapper and inner button, including disabled controls. Current `CvBuilderEditor` and checklist source place names on inner buttons; Tooltip can contribute wrapper attributes. Confirm the human hears the actionable name once with correct disabled state. Notification paper/Board chip names need their own role/name review. The summary omits raw check messages, so it cannot establish harmlessness or a required code fix by itself. |
| `aria-valid-attr-value` | **18** | Command dialog paper in populated/empty/error states: `.MuiPaper-elevation24` 14, `.MuiPaper-rounded` 4 | **Potential serious dialog relationship issue.** Inspect actual attributes and each referenced ID while open and after query/state changes. `QuickCommandDialog` supplies a paper `aria-label` without a `DialogTitle`; inspect MUI's rendered relationships rather than guessing from the generated selector. Human must hear a named dialog and search field, state/result count and selected result. The collected JSON does not retain the offending value/check details; obtain them during the authorized reproduction. |
| `th-has-data-cells` | **4** | `table-density.spec.ts`, `list-error-*-axe`, `table`, one per theme/locale | **Automation/context limit with manual table review required.** The failing-load table may retain headers without data cells. Read error/Retry once and check the unloaded table is not presented as populated. Then load rows and verify header-to-cell associations, sort/selection/action names in both densities. Empty/error context is not proof that loaded-table semantics pass. |
| **Total** | **1,839** | **242 scans, 0 reported violation entries** | All five rule dispositions remain **OPEN / NOT VERIFIED** pending contextual proof; no unique-defect count is asserted. |
Record a result per source file + case + state + target + theme/locale. Deduplicate only after inspection establishes the same root cause; keep the original occurrence census. Retain raw rule/check messages locally during future reproduction, with no cookies/private user text in committed evidence. A verified hidden/decorative node can receive a bounded disposition; it cannot close sibling contexts or the whole rule.
## Execution matrix and recording rules
Use an authorized isolated synthetic fixture with account A/B, an admin and non-admin, a Free/locked and eligible account, empty and populated Jobs, custom statuses/long Norwegian titles, source/sibling CVs, a long multipage CV, attachments/frozen package and safe dirty drafts. Real provider sends, production mutations, model qualification and deletion activation require their separate authorization. Fault-state scripts use bounded local failure/held-request fixtures; their results establish UI handling only. Never substitute an empty shell for loaded content.
Run each numbered script in **EN and Bokmål × light and dark × desktop, tablet and phone**: 1440×900, 768×1024 plus 1024×768, and 390×844 plus 320 CSS-px reflow. Record actual dimensions, not just device names. Inspect just below/above 768, 899/900 and 1023/1024 for shell/editor transitions; add 844×390 landscape for CV and long dialogs. Cover 430px phone, 1280px laptop and 1920px wide when their distinct layout is exposed. A variant not executed stays NOT VERIFIED; a representative sample cannot be labelled the full cross-product.
Desktop screen-reader lane: a human using NVDA or Narrator on Windows, with exact browser/OS/AT version and browse/focus mode recorded. Physical mobile lane: an actual phone/tablet, actual browser, software keyboard and VoiceOver or TalkBack. At least one supported alternate desktop browser is a separate compatibility lane. Select devices at the authorized execution checkpoint; unavailable access remains an explicit gap.
For each run retain: script/step, SHA/build, route/query, fixture/state, locale/theme, viewport/zoom/input/AT/version, exact actions, expected and observed result, pass/fail/not-verified, screenshot or short sanitized video/AT transcript, target/debt link, reviewer/date and retest result. Record defects before rerunning; passing reruns do not erase intermittent failures. A human signs their own AT/device result; an assistant cannot fill it. No public accessibility certification follows from these scripts.
## Numbered manual scripts
### M01 — AppShell and route continuity (PRES-E07/E08/E09)
1. Sign in as A, wait for real data, inspect landmarks/headings with the screen reader; use the skip link and hear one main and the correct route heading. Open each grouped destination, confirm current-page/parent semantics and route-heading focus.
2. Collapse to rail, reload, resize to phone, open drawer and Tab through labels/actions; close with Escape and verify trigger return. While drawer is open resize to desktop and back. Inspect long admin badge separately. All focused targets must be visible and hit-testable below the actual fixed header.
3. Use browser Back/Forward and legacy links from the [route mapping](../../audit/ROUTE_MAP.md); preserve route/query and meaningful return focus. Open account/theme/language menus with keyboard and AT, choose a value and verify announced selection and close/return behavior.
4. Logout A, sign in B, then return A; check shell counts, command/notification content and drafts are not A's while B is active. A delayed result or session change must not repopulate private stale content. **Expected:** accessible equivalent destinations, visible focus and retained owner boundary. **Status: NOT VERIFIED.**
### M02 — Commands, notifications and operation destinations (P5-02-D01)
1. Open Ctrl/Cmd+K and the visible search control. Hear dialog/search names, grouped results and selected result; use arrows/Home/End/Enter, ordinary Tab and Escape. Enter a Norwegian query and IME composition where available. Keep focus visible through entry/exit animations; repeat the P5-04b-R01 timing path.
2. Exercise loaded results, no result, delayed query A→B, error and Retry, then close during loading. Hear loading/count/error without repeated announcements on every keystroke; late/aborted results must not reappear. Keyboard activation must navigate once and return/focus meaningfully.
3. Open bell/popover; hear unread state, title/message/date and distinguish Open, Mark read and Dismiss. Use keyboard/AT through loading/empty/error/retry/busy states and Escape. Mark read must not complete the underlying task; dismiss must not delete the underlying job. Open View all and confirm existing `/operations` owner and content.
4. Reopen during a delayed read/action and switch account/expire session. **Expected:** correct names, state announcements, accessible scroll, no focus theft or stale private output. **Status: NOT VERIFIED; mandatory P5-15 human gate.**
### M03 — Jobs Table, cards, Board and Trash (PRES-J05–J08/W01)
1. At desktop/tablet use Comfortable/Compact table: hear column/sort state, role/company/status/applied/deadline, selection and named row actions. Sort/page, filter search/status/company/readiness and inspect same committed result set. Select a row without opening it; invoke row link/action explicitly.
2. At phone verify cards expose the same information/actions with localized names, long/custom statuses and dates. Open action/filter menus/sheets; cancel draft filters and keep prior committed results. Save/apply a supported filter and switch Table↔Board; retain URL/query/history and selection lifetime as documented.
3. Open a job then explicit Back and browser Back; wait for load and verify originating row focus is visible. Exercise empty/no-query-match/loading/error/Retry and partial bulk-failure: retain failed IDs and retry only the intended action.
4. On Board read all columns, including custom/Other; use an exact-status menu or keyboard alternative to move a card. Read the resulting status/order and verify persistence; native pointer drag is an additional lane. Scroll columns without losing actions. Test Trash restore through a disposable fixture, with focus/error feedback. **Expected:** equivalent tasks without mandatory dragging or color-only meaning. **Status: NOT VERIFIED; physical Board drag and full-array scaling are separate debt.**
### M04 — Dashboard and Analytics (PRES-S01/S02/J09)
1. Load populated/empty/fresh-account states, read snapshot/window captions, population/sample/period, current statuses and source limitations. Compare chart text/values tables to fixture values using AT; exact values cannot require hover or color.
2. Open each values disclosure/legend and keyboard drill-down; confirm Jobs membership and return. Toggle each of five existing owner-local Dashboard visibility flags; reload and switch A/B/A to verify retention/isolation. Do not expect Phase 8 ordering/resizing/cross-device persistence.
3. Trigger an independent report error while others remain loaded; hear error/Retry once, retain available reports and verify no misleading zero-success metric. Change language during reads in the separate reliability probe (M07); do not silently count a failed native preference save as correct persistence. **Expected:** truthful reports and reachable independent actions. **Status: NOT VERIFIED.**
### M05 — Job workspace header, Overview and deeper sections (PRES-W01–W11)
1. Open an owned job via list, Board, compatibility alias and deep query; read role/company/status/date context and actions. Traverse the seven current sections: Overview, Match, Application, Documents, Timeline, Notes & tasks, Interview. Within Application visit CV/Letter/Answers/Submission; within Timeline visit Activity/Correspondence. Exercise legacy section aliases and the existing numeric 0–9 route helper (these are helper arguments, not `section=3` URLs); retain query/history and `followMode` metadata. Mode-specific compose UI is deferred, not an expected feature.
2. Read progress and next-task destinations; keyboard-scroll the named progress strip. Traverse description/analysis/match, notes/checklist, documents/attachments/submitted package, cover letter/answers, interview preparation and communication/timeline. Verify disclosure/region names, heading hierarchy and text alternatives.
3. Edit a long draft, change section/viewport and try to navigate away; review dirty confirmation, Cancel/Stay and explicit discard/save. Error must retain draft and identify the failed action. Reorder checklist with named alternatives and confirm moved-item focus, spoken target/order, busy/error state and persistence.
4. Rename/purpose/delete a disposable attachment using prompt/confirmation; check initial/trapped/return focus and Shift+Tab-to-Delete (P5-07-O01). Read frozen submitted material after editing current sources; do not send mail. **Expected:** retained domain/dirty/source boundaries and accessible deeper tasks. **Status: NOT VERIFIED.**
### M06 — Complete implemented CV editing→preview→history→export (PRES-C05–C12)
1. Open current variant with canonical Career Profile and a sibling readback. Hear source versus CV-only overrides and inclusion/hidden states; edit a field, custom section, entry title and long rich text. Use section navigation/expand, add/remove controls and named entry/section reorder alternatives. The moved item keeps meaningful focus/order; canonical and sibling data stay unchanged.
2. Exercise native pointer entry/section reorder, cancel, and unsupported foreign/cross-section/text/title drop separately; source order, foreign editable title and persisted content must remain unchanged for unsupported drops. These P5-14 scoped automated cases do not certify every physical/browser gesture.
3. While a safe local save is held, switch Edit/Preview and resize through 320/390/768/899/900/1024/1440 and 844×390. Draft/save owner remains intact. Keyboard enters the named preview, PageDown/Home/End/Ctrl+Home/End scroll its document, including at start/end, without moving the outer page unexpectedly; Tab exits, return-to-editor is visible below shell, and focus returns to the right field.
4. Read first/middle/last pages and preview status in loading/error/Retry; last-good content/scroll remains while stale page counts are not announced. Assess 320px fit readability by zoom/scroll; a fit thumbnail does not satisfy readable document text. Inspect one-page/long documents and keyboard escape from each iframe.
5. Use templates/locked capabilities, accent/fonts/photo, A4/Letter, margins/density/dates/document-language controls; hear labels/help/reset effects, retain inclusion/content, and separate UI language from document language. Undo/Redo and history restore use the existing revision owner; a stale conflict keeps draft/downloadable local copy until explicit reviewed reload.
6. Export private/public PDF using the safe fixture; compare page/content/order and non-ASCII text, fonts/photo, page size and print against actual preview and retained numerical corpus. Do not publish real data. **Expected:** complete implemented workflow and scope preservation. **Status: NOT VERIFIED; production font/photo/manual print and other-browser lanes remain separate.**
### M07 — Settings, company dialogs and shared form failure paths
1. On Settings use desktop tabs and phone selector, heading/label/help/error relationships, dates/selects and independent Save actions. Keep a long Norwegian rule draft through resize. Trigger local rules-save failure, retain draft, hear durable error, retry explicitly, read back and reload; record P2-O01 if it recurs.
2. Save notification preferences; wait for the actual PUT response before readback, then separately reproduce overlapping reads/writes in an authorized disposable API probe. A 500 is a failure, not a retry-success pass. The known SQLite error-5 contention remains open even if the sequential human flow succeeds.
3. Change language, check actual server response, reload and reauthenticate/read persisted preference. Current `I18nProvider.setLanguage` applies local UI/storage first and ignores failed PUT; surface this discrepancy in evidence. A localized screenshot cannot prove successful persistence. No runtime diagnosis is claimed here.
4. Open a company form from retained navigation/command results; trigger a safe failed save while modal is active. Inspect label, draft, initial/trap/return focus and visible/spoken error. P4-02-D02 currently puts transient feedback outside the accessible modal; if the error cannot be heard/recovered it stays failed. Inspect notification/rules/config/provider/disabled deletion explanations, without enabling billing/deletion/providers. **Expected:** truthful save state, actionable in-context errors and retained drafts. **Status: NOT VERIFIED.**
### M08 — Untouched destinations through redesigned entry points
1. Use shell/commands/job/CV links to retained Career Profile, CV library, Companies, Reminders, mail, Connected Accounts, Operations, account/security and admin-only routes from [ROUTE_MAP](../../audit/ROUTE_MAP.md). Confirm entry/current heading/return/access denial without claiming those pages were redesigned.
2. For each accessible destination sample loaded/empty/error, main landmark, long labels, keyboard scroll, route/query and A/B separation. Read charts/permission/last-admin warnings if present; no private aggregate data may leak to a denied user.
3. Verify existing privacy/Free/locked/unavailable controls have meaningful names and explanations, manual fallback and no false success; no provider operation is implied. **Expected:** new shell/header/theme/dialog composition preserves existing destinations. **Status: NOT VERIFIED; Phase 7 redesign remains out of scope.**
### M09 — Screen-reader forms, dialogs and async announcements (cross-screen)
1. With the real AT running, repeat M01–M08 at loaded names/actions, headings/landmarks, tables/regions and modal boundaries; record exact spoken text and reading order. A role/name inspection alone cannot pass this step.
2. Exercise validation on required text, dates, autocomplete/select and long rich-text fields. Hear label, required/error/help association and retain the draft. Check each current form against the proposed Phase 3 error-summary/first-invalid-field focus target; record missing or unsupported behavior as an acceptance gap, not an existing capability. Inspect duplicate/missing references in all five incomplete-rule contexts above.
3. Open nested dirty confirmation, prompt, row menu and add-content dialog in their actual owners. Verify one active modal trap, initial focus, Tab/Shift+Tab, Escape policy, trigger return and no hidden/invisible focus targets during exit. Repeat the command and attachment focus observations rather than relying on earlier passing reruns.
4. Hold/load/fail/save/retry/import/render within local fixtures. Hear busy, completion and actionable failure once at the appropriate time, with no focus theft or false completion after an error. Notifications/report refresh must not announce every keystroke. Honor reduced motion while retaining outcomes. **Status: NOT VERIFIED.**
### M10 — Browser zoom and text spacing (cross-screen)
1. Use actual browser zoom at **200% and 400%**, not viewport emulation, at a recorded starting desktop size; repeat primary M01–M08 tasks and 320 CSS-px reflow. Inspect menus/dialogs/dirty errors/long NB labels and actions, not just body overflow. Intentional Board/table/document scrolling must be named; ordinary content must not need sideways scrolling.
2. In a bounded local test apply text spacing: line height 1.5× font size, paragraph spacing 2×, letter spacing 0.12× and word spacing 0.16×. Repeat forms, loaded tables/cards, Dashboard captions, workspace disclosures and CV chrome; restore afterwards. No clipped/overlapping text, lost function or unreachable Save/Cancel/error.
3. Test Tab/focus scroll at top/bottom, wrapped header and sticky footers. Keep focused field/action visible beneath shell and within dialog; scroll preview independently. **Status: NOT VERIFIED; screenshots at narrow width cannot pass these steps.**
### M11 — Forced colors, contrast and motion (cross-screen)
1. Enable actual OS/browser forced-colors mode and repeat M01–M08 primary navigation/forms/actions. Confirm visible focus, borders/selected/current/error/inclusion states and non-color status meaning; icons and disabled explanations remain understandable.
2. Measure the settled active text/control/focus contexts from the 1,574 contrast occurrences in both modes, including hover/focus/selected/busy/error. Review photos/document colors separately from app theme. Retain ratios and target screenshots; do not assume every hidden badge or iframe incomplete is a defect or a pass.
3. Enable reduced motion, repeat drawer/menu/dialog/reorder/load completion and confirm no information depends on animation. Inspect focus during normal transitions too. **Status: NOT VERIFIED.**
### M12 — Physical touch, software keyboard and orientation
1. On actual phone/tablet repeat M01–M08 primary tasks with touch: drawer/command/bell, filters/cards/Board, Dashboard values, job sections and CV editor/preview/settings. Record physical device/input; Chromium `hasTouch` is inherited emulation only.
2. Open software keyboard in long NB text/date/select/search/rich-text fields, near document/form bottom and inside add-content/dirty dialogs. Scroll to help/error and Save/Cancel; neither keyboard nor sticky shell/footer may cover focused field/action. Dismiss/reopen keyboard and keep draft/caret/focus.
3. Rotate portrait↔landscape with dirty/held-save CV draft and open long dialog; retain pane/section/scroll/order and reachable preview/editor return. Test touch selection without accidental drag; try actual entry/section and Board drag/cancel, then named reorder/status alternatives. Unavailable native drag remains separate from passing alternatives.
4. With VoiceOver/TalkBack, read names/order, activate menus/dialogs/reorder/preview and verify loading/error announcements and focus return. **Status: NOT VERIFIED; emulation cannot fill any physical/AT step.**
### M13 — Deferred AI acceptance return script (blocked, do not execute now)
1. Only after the [P5-13 return conditions](../OPEN_BLOCKERS.md#p5-13-deferred-debt-and-return-conditions--2026-10-08) pass and review UI is implemented, exercise Current/Proposed/Sources, explicit target, compare/edit/Accept/Reject/Close/Regenerate and short/long diff in the entire matrix.
2. Verify insert/delete meaning without color, keyboard/AT review, original retention on failed/unavailable/locked/cancel, fresh-source rejection, no stale/account-switched Apply and no automatic save/send. Keep output language separate from UI language.
3. Complete actual configured-model identity, **366 uncached required calls** and human output reviews under the frozen corpus/rubric; deterministic mock review/no-write tests are separate. **Status: BLOCKED / NOT QUALIFIED / NOT IMPLEMENTED; 0/366 calls, 0 human reviews.** No fabricated UI/synthetic pass may replace this step.
## Closure rule
A script passes only when its actual matrix rows and required human/device lane have dated evidence with no unresolved preservation regression. Missing lanes stay NOT VERIFIED. Confirm each incomplete context or file a scoped defect with owner/exit proof. Re-run affected regressions after an authorized fix; this planning checkpoint authorizes none. Full Phase 5 cannot receive unconditional GO while mandatory manual or P5-13 scope remains unmet; production safety uses its separate checklist in [READINESS_DEBT](READINESS_DEBT.md#production-readiness-operator-checklist--prepared-not-executed).
@@ -0,0 +1,85 @@
{
"recordedLocalDate": "2026-10-09",
"sourceCheckpoint": "46a0c0c6d23464869f50c0d88552963c29cfdacf",
"developmentBranch": "codex/ui-redesign-phase4",
"productionBranch": "main",
"productionHeadAtPlanning": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
"scope": "Documentation-only static acceptance planning checks; no new application-suite, UI, human, device, provider or production execution",
"checks": {
"packageMarkdownFiles": 7,
"localLinkTargetsChecked": 919,
"markdownAnchorReferencesChecked": 24,
"tableRowsChecked": 324,
"preservationGroups": 57,
"acceptanceStatusCounts": {
"PARTIAL": 56,
"DEFERRED": 1
},
"originalRoutePatterns": 31,
"currentRoutePatterns": 32,
"currentRouteDeclarations": 35,
"originalRoutesRemoved": [],
"routesAdded": [
"/analytics"
],
"inventoryCommitAncestorsChecked": 28,
"applicationTestCiConfigSchemaUnchanged": true,
"p514ApplicationHashesMatched": {
"job-tracker-ui/src/hooks/useDragReorder.ts": "367e064052df27171f34ed638f1542319fa223f3ecf419000811c92e809ccb5a",
"job-tracker-ui/src/layout/AppShell.tsx": "f88079164adcbc155b3c340998273067e77aafb53574be50a4c20e5f408d2cf5",
"job-tracker-ui/src/views/CvBuilderEditor.tsx": "dd2e29b1751ea61880f98e9dbc97e47da8ad059334ce747d613042ddb57bd43a"
},
"hygiene": {
"currentRootDocumentationLinks": {
"exitCode": 0,
"output": "166 current/root Markdown documents; 0 missing local targets (historical archive excluded)."
},
"trackedIncludingStagedSecretScan": {
"exitCode": 0,
"output": "Tracked-secret scan passed; no high-confidence credential patterns found."
},
"workingTreeWhitespace": {
"exitCode": 0,
"output": ""
},
"stagedWhitespace": {
"exitCode": 0,
"output": ""
}
},
"inheritedAxeScans": 242,
"inheritedAxeViolationEntries": 0,
"inheritedAxeIncompleteOccurrences": {
"aria-hidden-focus": 34,
"color-contrast": 1574,
"aria-prohibited-attr": 209,
"aria-valid-attr-value": 18,
"th-has-data-cells": 4
},
"inheritedAxeIncompleteTotal": 1839
},
"inheritedBaselineNotFresh": {
"backend": 1023,
"frontend": 459,
"browser": 117,
"sidecar": 49,
"focusedAiBackendSubset": 108,
"revisionBackendSubset": 5,
"realHttp": 2,
"rateLimit": 9,
"ingress": 6,
"pdfAdmission": 1,
"configuration": 3,
"standardFidelity": "16/16; 36 preview = 36 PDF",
"settingsFidelity": "8/8; 24 preview = 24 PDF"
},
"notExecuted": [
"fresh application regression suites",
"manual screen-reader/device acceptance",
"model/provider qualification calls",
"Docker recovery",
"production verification or deployment"
],
"staticErrors": [],
"result": "PASS"
}
@@ -0,0 +1,94 @@
# P5-15 preservation acceptance plan — 57 original groups
Planning checkpoint: **`46a0c0c6d23464869f50c0d88552963c29cfdacf`**, branch `codex/ui-redesign-phase4`, 2026-10-09. This document reconciles existing source and inherited records. **No application change, fresh suite execution, manual acceptance, provider call, database/Docker operation or production action is recorded here. P5-15 acceptance remains open.**
The full original sub-capabilities remain binding in the [Phase 1 inventory](../../audit/FUNCTIONALITY_INVENTORY.md), [Phase 2 preservation matrix](../../phase-2/PRESERVATION_MATRIX.md) and [traceability](../../phase-2/TRACEABILITY.md). The [Phase 3 impact matrix](../../phase-3/PRESERVATION_IMPACT_MATRIX.md), [P4-06 matrix](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md), [Phase 5 impact](../PRESERVATION_IMPACT.md) and [release-candidate review](../release-readiness/PRESERVATION_REVIEW.md) are reconciled below with the [P5-14 successor](../p5-14/README.md) and current owners. **57/57 mapping completeness is not exhaustive behavioral, visual, responsive, EN/NB or acceptance coverage.** A test-file link is a runnable historical anchor, not a fresh result.
## Status and evidence rules
- **PASS:** complete required evidence for the stated acceptance scope, with no unmet mandatory scope. No full original group earns this at this planning checkpoint.
- **PARTIAL:** recorded core/scoped evidence and retained implementation exist; a mandatory or inherited sub-workflow, human/device, provider or current-checkpoint proof gap remains.
- **FAIL:** a reproducible acceptance assertion failed and remains unresolved for that exact scope. Missing tests, incomplete axe checks and unverified providers do not themselves establish FAIL.
- **DEFERRED:** an explicit recorded decision postpones a retained capability; it remains outstanding and cannot be counted as fulfilled.
- **NOT VERIFIED:** no adequate evidence for a stated check. This applies to every fresh-current-checkpoint execution, actual deployment and unperformed manual check, even where the group is PARTIAL.
The table has **56 PARTIAL, 1 DEFERRED, 0 PASS, 0 FAIL, 0 wholly NOT VERIFIED groups**. Each row still contains NOT VERIFIED obligations. H/M are redesign regression priority (H: identity, data loss, send/delete/export, shared editing/navigation; M: important reversible presentation), not security vulnerability severity. Owners below are responsibility roles, not new assigned individuals or implementation authorization.
Historical visual links describe only their recorded fixtures and review. Four theme/locale pairs never imply every route/state. Keyboard/pointer and Chromium touch emulation never replace human screen reader, physical touch/software keyboard, 200%/400% zoom, forced colours/text spacing or deployed fonts. The P5-14 record retains 242 scans with zero reported violations **and 1,839 incomplete node occurrences**; incomplete checks remain unaccepted.
## Reconciled matrix
| Original ID / complete-group shorthand | Current route / actual component; implemented preservation touch | Historical executable regression anchors | Inherited visual / responsive / EN-NB evidence and limit | Status | Remaining limitation / gap | Required next audit / owner / priority |
|---|---|---|---|---|---|---|
| **PRES-E01** — Public product/plans; honest unavailable billing | `/`; [LandingPage](../../../../job-tracker-ui/src/views/LandingPage.tsx), [planCatalog](../../../../job-tracker-ui/src/planCatalog.ts). Unchanged public product/plans; [P5-01](../p5-01/README.md) route regression. | [F:landing-page](../../../../job-tracker-ui/src/landing-page.test.tsx); [F:planCatalog](../../../../job-tracker-ui/src/planCatalog.test.ts); [B:AccountPlans](../../../../JobTrackerApi.Tests/AccountPlansTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Actual checkout/billing provider availability and public mobile/keyboard acceptance remain unverified. | Public/commerce owner; M — audit loaded mobile/keyboard EN/NB plans and honest unavailable billing; provider readiness separately. |
| **PRES-E02** — Local login/register/remember, challenge, reset and verification | `/login`, `/register`, reset/verify routes; [LoginPage](../../../../job-tracker-ui/src/views/LoginPage.tsx), [ForgotPasswordPage](../../../../job-tracker-ui/src/views/ForgotPasswordPage.tsx), [ResetPasswordPage](../../../../job-tracker-ui/src/views/ResetPasswordPage.tsx), [VerifyEmailPage](../../../../job-tracker-ui/src/views/VerifyEmailPage.tsx). Entry retained by [P5-01](../p5-01/README.md); existing local auth/challenge/reset/verification owners. | [F:login-page](../../../../job-tracker-ui/src/login-page.test.tsx); [F:verify-email-page](../../../../job-tracker-ui/src/verify-email-page.test.tsx); [B:LocalAuthIdentity](../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs); [B:AuthAndSystemController](../../../../JobTrackerApi.Tests/AuthAndSystemControllerTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Real reset-mail delivery, Turnstile/browser configuration and complete token-reset submit journey remain unverified. | Identity owner; H — trace reset request/token submit/verification/challenge errors in real App; sandbox mail/Turnstile only under later authorization. |
| **PRES-E03** — Google/Microsoft login, link, legacy relink and popup results | `/login`, `/microsoft-legacy-relink`; [GoogleAuthCard](../../../../job-tracker-ui/src/components/GoogleAuthCard.tsx), [MicrosoftAuthCard](../../../../job-tracker-ui/src/components/MicrosoftAuthCard.tsx), [relink page](../../../../job-tracker-ui/src/views/MicrosoftLegacyRelinkPage.tsx). Entry retained by [P5-01](../p5-01/README.md); provider sign-in remains separate from Connections. | [F:login-page](../../../../job-tracker-ui/src/login-page.test.tsx); [F:microsoft-legacy-relink-page](../../../../job-tracker-ui/src/microsoft-legacy-relink-page.test.tsx); [B:GoogleTokenValidator](../../../../JobTrackerApi.Tests/GoogleTokenValidatorTests.cs); [B:MicrosoftTokenValidator](../../../../JobTrackerApi.Tests/MicrosoftTokenValidatorTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Real provider consent/popups, revoked grants and sandbox outcomes remain unverified; origin/state contracts remain required. | Identity/provider owner; H — audit popup origin/state, revoke/relink and provider errors using approved sandbox; keep sign-in and mailbox grants separate. |
| **PRES-E04** — 2FA challenge/recovery/setup/disable; trusted-device revocation | `/profile`, `/login`; [TwoFactorSettingsCard](../../../../job-tracker-ui/src/components/TwoFactorSettingsCard.tsx), [challenge](../../../../job-tracker-ui/src/components/TwoFactorChallenge.tsx). Entry relocation only in [P5-01](../p5-01/README.md); Profile/login security forms unchanged. | [F:two-factor-settings](../../../../job-tracker-ui/src/two-factor-settings.test.tsx); [F:login-page](../../../../job-tracker-ui/src/login-page.test.tsx); [B:TwoFactorController](../../../../JobTrackerApi.Tests/TwoFactorControllerTests.cs); [B:SessionsController](../../../../JobTrackerApi.Tests/SessionsControllerTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Real mobile authenticator/recovery and trusted-device UI traversal remain open; no security-form acceptance inferred from navigation. | Identity/accessibility owner; H — manual keyboard/screen-reader recovery/trusted-device traversal plus real authenticator proof. |
| **PRES-E05** — Session list/current device, revoke one/others, logout | `/profile` and account Sign out; [SessionsSettingsCard](../../../../job-tracker-ui/src/components/SessionsSettingsCard.tsx), [AppShell](../../../../job-tracker-ui/src/layout/AppShell.tsx), [auth](../../../../job-tracker-ui/src/auth.ts). Direct shell logout/private utility changes in [P5-00](../p5-00/README.md)–[P5-02](../p5-02/README.md); session-list owner unchanged. | [F:session-boundary](../../../../job-tracker-ui/src/session-boundary.test.ts); [F:account-scoped-state](../../../../job-tracker-ui/src/account-scoped-state.test.tsx); [B:SessionsController](../../../../JobTrackerApi.Tests/SessionsControllerTests.cs); [B:AuthSessionRevocation](../../../../JobTrackerApi.Tests/AuthSessionRevocationTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Session-card selection/refresh after remote revocation remains open; broad device/AT acceptance is not established. | Identity/shell owner; H — audit session card remote-revoke refresh and Sign out private disposal/focus at every shell entry. |
| **PRES-E06** — Avatar, account names/headline, email change and password | `/profile`, `/confirm-email-change`; [ProfilePage](../../../../job-tracker-ui/src/views/ProfilePage.tsx), [VerifyEmailPage](../../../../job-tracker-ui/src/views/VerifyEmailPage.tsx). Account/security entry only in [P5-01](../p5-01/README.md); avatar/account identity and confirm-email-change route retained. | [F:profile-page](../../../../job-tracker-ui/src/profile-page.test.tsx); [F:verify-email-page](../../../../job-tracker-ui/src/verify-email-page.test.tsx); [B:AvatarStorage](../../../../JobTrackerApi.Tests/AvatarStorageTests.cs); [B:LocalAuthIdentity](../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Avatar upload/remove and password-change browser journeys remain unverified; account identity stays distinct from Career Profile. | Identity owner; H — audit native avatar/remove/password/email-change, missing/error states and cross-account negative paths. |
| **PRES-E07** — Desktop collapse/mobile drawer, active nav and command search/actions | Private shell, Ctrl/Cmd+K; [App navigation](../../../../job-tracker-ui/src/App.tsx), [AppShell](../../../../job-tracker-ui/src/layout/AppShell.tsx), [QuickCommandDialog](../../../../job-tracker-ui/src/components/QuickCommandDialog.tsx). Direct [shell/navigation/utilities](../p5-02/README.md), [Jobs Table/Board](../p5-04b/README.md), [Analytics](../p5-07/README.md) and [workspace sections](../p5-08b/README.md). | [F:sidebar-active-nav](../../../../job-tracker-ui/src/sidebar-active-nav.test.ts); [F:app-shell-notifications](../../../../job-tracker-ui/src/app-shell-notifications.test.tsx); [B:JobApplicationsAuthorization](../../../../JobTrackerApi.Tests/JobApplicationsAuthorizationTests.cs); [B:CompanyRelationship](../../../../JobTrackerApi.Tests/CompanyRelationshipTests.cs) | [Shell/utility EN/NB × light/dark, rail/phone](../p5-02/README.md); [P5-14 shared clearance](../p5-14/README.md). Human AT/zoom incomplete. | **PARTIAL** | Original route/command/drawer defects have scoped successor evidence; manual screen reader and inherited command/focus timing debt remain open. This census is not browser route acceptance. | Shell/accessibility owner; H — audit every nav/command destination, collapsed/mobile labels, route focus, dirty Cancel and manual spoken names (P5-02-D01; P5-04b-R01). |
| **PRES-E08** — Theme/system, EN/NB hydration, toast/confirm/prompt and errors | All routes/preferences; [ThemeProvider](../../../../job-tracker-ui/src/ThemeProvider.tsx), [themePrefs](../../../../job-tracker-ui/src/themePrefs.ts), [I18nProvider](../../../../job-tracker-ui/src/i18n/I18nProvider.tsx), [confirm](../../../../job-tracker-ui/src/confirm.tsx), [prompt](../../../../job-tracker-ui/src/prompt.tsx). Direct semantic theme/feedback controls in [P5-00](../p5-00/README.md); EN/Bokmål and light/dark regressions carried through [P5-12](../p5-12/README.md). | [F:theme-state](../../../../job-tracker-ui/src/theme-state.test.tsx); [F:i18n-provider](../../../../job-tracker-ui/src/i18n-provider.test.tsx); [B:LocalAuthIdentity](../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs) | [Shell/utility EN/NB × light/dark, rail/phone](../p5-02/README.md); [P5-14 shared clearance](../p5-14/README.md). Human AT/zoom incomplete. | **PARTIAL** | Full theme/locale/state/OS cross-product, spoken names/announcements, incomplete axe, zoom/forced-colours/text-spacing and shared-dialog timing remain unverified. | Shared UI/accessibility owner; H — audit loaded error/confirm/prompt states, OS theme, locale hydration, zoom/forced colours and announcements; incomplete axe remains open. |
| **PRES-E09** — Account-switch private-state disposal and stale request rejection | All private routes/account switches; [App](../../../../job-tracker-ui/src/App.tsx), [api](../../../../job-tracker-ui/src/api.ts), [sessionBoundary](../../../../job-tracker-ui/src/sessionBoundary.ts). Private-state/session boundary unchanged; new shell/utility/workspace/CV relationships regression-protected in [readiness](../p5-13-readiness/README.md). | [F:session-boundary](../../../../job-tracker-ui/src/session-boundary.test.ts); [F:account-scoped-state](../../../../job-tracker-ui/src/account-scoped-state.test.tsx); [B:SessionContextMiddleware](../../../../JobTrackerApi.Tests/SessionContextMiddlewareTests.cs); [B:CurrentUserIdLiveEvaluation](../../../../JobTrackerApi.Tests/CurrentUserIdLiveEvaluationTests.cs) | [Native account isolation](../../../../job-tracker-ui/e2e/account-isolation.spec.ts); [P5-14 owned source/sibling fixture](../p5-14/README.md). Images do not prove tenant isolation. | **PARTIAL** | Real BFCache variations/long offline retries and deployed old-bundle/session behavior remain unverified; images and mocked components cannot prove tenant isolation. | Identity owner; H — rerun real account-switch/two-tab stale read/write evidence at execution checkpoint; extend BFCache/offline/old-bundle audit when authorized. |
| **PRES-J01** — NAV discovery/filter/sort/source/deadline/details | `/discover`; [JobDiscoveryPage](../../../../job-tracker-ui/src/views/JobDiscoveryPage.tsx). Entry only: [P5-01](../p5-01/README.md) groups Discover under Jobs; discovery page/service unchanged. | [F:job-discovery](../../../../job-tracker-ui/src/job-discovery.test.tsx); [B:JobDiscoveryController](../../../../JobTrackerApi.Tests/JobDiscoveryControllerTests.cs); [B:JobOpportunitySync](../../../../JobTrackerApi.Tests/JobOpportunitySyncTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Live NAV freshness/availability and long result keyboard traversal remain open. | Discovery owner; M — audit long results/mobile keyboard/source/deadline/retry; live NAV availability separately. |
| **PRES-J02** — Saved searches, run/delete/alerts, result changes/dismissal | `/discover`; [saved-search/alert controls](../../../../job-tracker-ui/src/views/JobDiscoveryPage.tsx). Entry only in [P5-01](../p5-01/README.md); saved discovery search/alert service and controls unchanged. | [F:job-discovery](../../../../job-tracker-ui/src/job-discovery.test.tsx); [B:SavedJobSearchAlert](../../../../JobTrackerApi.Tests/SavedJobSearchAlertTests.cs); [B:JobDiscoveryController](../../../../JobTrackerApi.Tests/JobDiscoveryControllerTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Scheduler-to-notification browser journey and mobile delete confirmation remain unverified; no new producer or delivery certification. | Discovery/notifications owner; M — audit saved search delete/pause/run, mobile confirmation and scheduler-to-owned-notification chain. |
| **PRES-J03** — Reviewed manual/URL/paste job create, company/tags/dates, duplicates | Jobs/command Add; [AddJobModal](../../../../job-tracker-ui/src/components/AddJobModal.tsx). Existing reviewed Add modal shared by [P5-03](../p5-03/README.md)/[P5-04b](../p5-04b/README.md); no creation on route/view mount. | [F:quick-capture](../../../../job-tracker-ui/src/quick-capture.test.tsx); [B:JobImportService](../../../../JobTrackerApi.Tests/JobImportServiceTests.cs); [B:JobImportHttpTransport](../../../../JobTrackerApi.Tests/JobImportHttpTransportTests.cs) | [Jobs/Trash four pairs and responsive](../p5-03/README.md); [shared Table/Board](../p5-04b/README.md). Capture/provider/manual gaps remain. | **PARTIAL** | Duplicate/company/date edge UI and creation-intent idempotency remain independent gaps; import network boundary evidence is separate from live site success. | Capture/API owner; H — audit reviewed duplicate/company/date boundaries and interrupted creation; creation-intent idempotency stays a separate contract. |
| **PRES-J04** — Extension/bookmarklet/share capture; post-create attachment/CV | `?add=`, `?addtext=`, Settings capture; [capture consumer](../../../../job-tracker-ui/src/App.tsx), [captureUrl](../../../../job-tracker-ui/src/captureUrl.ts), [QuickCaptureCard](../../../../job-tracker-ui/src/components/QuickCaptureCard.tsx). Capture/add/addtext review entry retained in [P5-01](../p5-01/README.md)/[P5-03](../p5-03/README.md); extension and post-create owners unchanged. | [F:captureUrl](../../../../job-tracker-ui/src/captureUrl.test.ts); [F:quick-capture](../../../../job-tracker-ui/src/quick-capture.test.tsx); [B:JobImportService](../../../../JobTrackerApi.Tests/JobImportServiceTests.cs); [B:CvBuilder](../../../../JobTrackerApi.Tests/CvBuilderTests.cs) | [Jobs/Trash four pairs and responsive](../p5-03/README.md); [shared Table/Board](../p5-04b/README.md). Capture/provider/manual gaps remain. | **PARTIAL** | Installed extension permissions/share flow and optional attachment failure recovery remain unverified. | Capture owner; H — audit installed extension/share/no-replay and post-create attachment failure recovery without auto-create. |
| **PRES-J05** — Job filters/sort/page/columns, saved views and row/mobile actions | `/jobs?view=table / board`; [JobTable](../../../../job-tracker-ui/src/components/JobTable.tsx), [SavedViewsMenu](../../../../job-tracker-ui/src/components/SavedViewsMenu.tsx), [jobsQuery](../../../../job-tracker-ui/src/jobsQuery.ts). Direct [P5-03](../p5-03/README.md) Jobs/Trash presentation and [P5-04b](../p5-04b/README.md) shared complete-query view integration. | [F:application-workspace-overlay](../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx); [F:account-scoped-state](../../../../job-tracker-ui/src/account-scoped-state.test.tsx); [B:JobApplicationsController](../../../../JobTrackerApi.Tests/JobApplicationsControllerTests.cs); [B:JobApplicationsEndpointBehavior](../../../../JobTrackerApi.Tests/JobApplicationsEndpointBehaviorTests.cs) | [Jobs/Trash four pairs and responsive](../p5-03/README.md); [shared Table/Board](../p5-04b/README.md). Capture/provider/manual gaps remain. | **PARTIAL** | Finite saved-view/filter/Back/error/selection fixtures do not exhaust saved-view CRUD or dirty nested page-size combinations; full-array scaling remains limited. | Jobs owner; H — audit full saved-view CRUD, Back/refresh/unknown query, dirty nested page-size and all-result scaling. |
| **PRES-J06** — Bulk status/delete, soft delete/trash/restore and job edit | `/jobs`, `/trash`; [JobTable](../../../../job-tracker-ui/src/components/JobTable.tsx), [EditJobDialog](../../../../job-tracker-ui/src/components/EditJobDialog.tsx). Direct [P5-03](../p5-03/README.md) table/Trash and [P5-04b](../p5-04b/README.md) selection/view integration; CRUD/soft-delete owner retained. | [F:application-workspace-overlay](../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx); [F:confirm-flow](../../../../job-tracker-ui/src/confirm-flow.test.tsx); [B:JobApplicationsController](../../../../JobTrackerApi.Tests/JobApplicationsControllerTests.cs); [B:JobApplicationsAuthorization](../../../../JobTrackerApi.Tests/JobApplicationsAuthorizationTests.cs) | [Jobs/Trash four pairs and responsive](../p5-03/README.md); [shared Table/Board](../p5-04b/README.md). Capture/provider/manual gaps remain. | **PARTIAL** | Scoped native restore and bulk/mutation fixtures supersede earlier bare-confirm gaps; all bulk partial-failure/dirty-state combinations and deeper manual AT remain unverified. | Jobs/API owner; H — audit selected scope, partial bulk failures and Trash restore with native persistence/dirty protection. |
| **PRES-J07** — Kanban grouped statuses, pointer/keyboard move and precise menu | `/jobs?view=board`, `/kanban` alias; [KanbanBoard](../../../../job-tracker-ui/src/components/KanbanBoard.tsx), [pipeline](../../../../job-tracker-ui/src/pipeline.ts). Direct [P5-04a](../p5-04a/README.md)/[P5-04b](../p5-04b/README.md); complete shared query, precise status and /kanban alias retained. | [F:kanban-grouped-board](../../../../job-tracker-ui/src/kanban-grouped-board.test.tsx); [F:pipeline](../../../../job-tracker-ui/src/pipeline.test.ts); [B:JobPipeline](../../../../JobTrackerApi.Tests/JobPipelineTests.cs) | [Board four pairs/narrow keyboard](../p5-04b/README.md). Physical touch/full-scale not proven. | **PARTIAL** | Physical touch/native drag, broader responsive focus/cancel combinations and full-result scaling remain open; grouped statuses are not a new pipeline. | Jobs/accessibility owner; H — audit keyboard cancel/view focus, physical touch/drag and complete filtered membership at scale; no new pipeline. |
| **PRES-J08** — Company/contact edits, pipeline dates and linked-job history | `/companies?edit=id`; [CompaniesTable](../../../../job-tracker-ui/src/components/CompaniesTable.tsx). Company/contacts/history entry only in [P5-01](../p5-01/README.md)/[P5-02](../p5-02/README.md); existing Companies form retained. | [F:companies-relationship](../../../../job-tracker-ui/src/companies-relationship.test.tsx); [F:quick-command-preservation](../../../../job-tracker-ui/src/quick-command-preservation.test.tsx); [B:CompanyRelationship](../../../../JobTrackerApi.Tests/CompanyRelationshipTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | All contact/date edits and source-URL safety browser journeys remain unverified; P4-02-D02 inaccessible modal-save error is open for its owner. | Companies/accessibility owner; H — fix and prove durable in-modal save error before form migration (P4-02-D02); audit contact/date/source links. |
| **PRES-J09** — Recorded offers/compensation/deadlines/notes and source links | `/offers`; [OfferComparisonPage](../../../../job-tracker-ui/src/views/OfferComparisonPage.tsx). Offers entry retained; report source links reviewed in [P5-06](../p5-06/README.md)/[P5-07](../p5-07/README.md); recorded offer page unchanged. | [F:offer-comparison](../../../../job-tracker-ui/src/offer-comparison.test.tsx); [B:AnalyticsSalary](../../../../JobTrackerApi.Tests/AnalyticsSalaryTests.cs); [B:JobApplicationsEndpointBehavior](../../../../JobTrackerApi.Tests/JobApplicationsEndpointBehaviorTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Mobile many-offer comparison and localized currency/date visual acceptance remain open; no new salary facts are claimed. | Offers owner; M — audit many-offer narrow layout, currency/period/date labels and safe source links across EN/NB. |
| **PRES-J10** — CSV/JSON export, JSON import and CSV-to-JSON conversion | `/settings` Data; [ImportExportJobs](../../../../job-tracker-ui/src/components/ImportExportJobs.tsx). Settings Data import/export entry retained by [P5-01](../p5-01/README.md)/[P5-03](../p5-03/README.md); serializers unchanged. | [F:csv-export](../../../../job-tracker-ui/src/csv-export.test.tsx); [B:CsvExport](../../../../JobTrackerApi.Tests/CsvExportTests.cs); [B:JobApplicationsController](../../../../JobTrackerApi.Tests/JobApplicationsControllerTests.cs) | [Inherited Settings loaded/mobile review](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [shell entry](../p5-01/README.md). No full current domain requalification. | **PARTIAL** | Full JSON import/count/roundtrip browser proof and spreadsheet-client compatibility remain separately bounded; byte/formula/Unicode fixtures are not exhaustive. | Settings/data owner; H — audit native JSON import counts/roundtrip, Unicode/formula-safe bytes and target spreadsheet compatibility. |
| **PRES-W01** — Full workspace, sections, legacy links and optional reusable overlay | `/jobs/:id`, `/applications/:id`; [ApplicationWorkspace](../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx), [section adapter](../../../../job-tracker-ui/src/applicationWorkspace.ts), [numeric-tab helper](../../../../job-tracker-ui/src/jobWorkspaceRoute.ts). Direct dedicated workspace header/Overview [P5-08a](../p5-08a/README.md) and URL sections [P5-08b](../p5-08b/README.md); Jobs/legacy aliases retained. | [F:application-workspace-overlay](../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx); [F:applicationWorkspace](../../../../job-tracker-ui/src/applicationWorkspace.test.ts); [B:ApplicationWorkspace](../../../../JobTrackerApi.Tests/ApplicationWorkspaceTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Reusable overlay has no active production host; followMode metadata retained but mode-specific UI explicitly deferred to mail. Full manual AT and historical transition-capture limits remain. | Workspace/mail owner; H — audit all canonical/legacy entries and numeric navigation-helper arguments, safe query/state, dirty/Back/focus; carry followMode UI to mail phase. |
| **PRES-W02** — Detail/status/progression, recruiter/dates/description/timeline | Job Overview/Timeline; [header/detail/progress](../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx), [ApplicationTimeline](../../../../job-tracker-ui/src/components/ApplicationIntelligence.tsx). Direct [P5-08a](../p5-08a/README.md)/[P5-08b](../p5-08b/README.md) header/progress/detail/timeline composition with existing status/date handlers. | [F:application-intelligence](../../../../job-tracker-ui/src/application-intelligence.test.tsx); [F:workflow-trust-signals](../../../../job-tracker-ui/src/workflow-trust-signals.test.tsx); [B:JobApplicationsWorkflowSignals](../../../../JobTrackerApi.Tests/JobApplicationsWorkflowSignalsTests.cs); [B:JobApplicationsAppliedDateHistory](../../../../JobTrackerApi.Tests/JobApplicationsAppliedDateHistoryTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Localized backend event/content text, timezone/reload/status-to-timeline combinations and human AT remain unverified; job revision semantics were not repaired. | Workspace/API owner; H — audit native edit/status/date-to-timeline and localized stored content/timezones; job revision debt separately. |
| **PRES-W03** — Analysis, match/gaps, strategy and reviewed status/workflow suggestions | Job Match/Overview suggestion; [analysis/match/strategy](../../../../job-tracker-ui/src/components/ApplicationIntelligence.tsx), [workflow assist](../../../../job-tracker-ui/src/components/ApplicationWorkflowAssist.tsx). Existing contextual analysis/match/strategy/status owners recomposed by [P5-08b](../p5-08b/README.md); opening does not invoke AI. | [F:application-intelligence](../../../../job-tracker-ui/src/application-intelligence.test.tsx); [F:application-workflow-assist](../../../../job-tracker-ui/src/application-workflow-assist.test.tsx); [B:ApplicationIntelligence](../../../../JobTrackerApi.Tests/ApplicationIntelligenceTests.cs); [B:StrategySnapshotOperation](../../../../JobTrackerApi.Tests/StrategySnapshotOperationTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Live model truthfulness, freshness/cancelled generation and provider quality remain unverified; P5-13 production CV withholding must not disable these unrelated AI paths. | Workspace/AI owner; H — audit reviewed suggestions/error/cancel/freshness/no-write entry; qualify live factuality separately from CV exception. |
| **PRES-W04** — Checklist create/edit/complete/delete/order and next action | Job Notes & tasks; [ApplicationChecklist](../../../../job-tracker-ui/src/components/ApplicationChecklist.tsx). Existing checklist owner/ordered controls recomposed by [P5-08b](../p5-08b/README.md); manual/system/dismissed distinctions retained. | [F:application-checklist](../../../../job-tracker-ui/src/application-checklist.test.tsx); [B:ApplicationChecklist](../../../../JobTrackerApi.Tests/ApplicationChecklistTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Real mobile interruption/edit/delete combinations and human AT remain open; no task due-date schema or automatic notification added. | Workspace owner; H — audit native mobile item edit/delete/reorder/interruption and manual/system/dismissed next actions. |
| **PRES-W05** — Attach/select/create/tailor CV and source context | Job Application/CV, builder job link; [ApplicationCvSection/TailoringSection](../../../../job-tracker-ui/src/components/ApplicationAssets.tsx). Existing job-CV attach/create/tailor source relationships recomposed by [P5-08b](../p5-08b/README.md); [native readiness](../p5-08b-readiness/README.md) supersedes P2-D01. | [F:application-assets](../../../../job-tracker-ui/src/application-assets.test.tsx); [F:cv-builder-deep-link](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:ApplicationAssets](../../../../JobTrackerApi.Tests/ApplicationAssetsTests.cs); [B:CvBuilder](../../../../JobTrackerApi.Tests/CvBuilderTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | P2-D01 is an ordinary passing native regression, not current expected failure. Broader attach-render combinations, provider tailoring quality and deployed restore remain unverified; CV review production exception stays distinct. | Workspace/CV owner; H — audit attach/render/detach/create/tailor with source and foreign-owner checks; retain ordinary native P2-D01 successor. |
| **PRES-W06** — Cover-letter manual/AI review, versions/restore and dirty protection | Job Application/Letter; [ApplicationCoverLetterSection](../../../../job-tracker-ui/src/components/ApplicationAssets.tsx). Existing manual/AI cover-letter/history/dirty owner recomposed in [P5-08b](../p5-08b/README.md); literal-context defect corrected in [readiness](../p5-08b-readiness/README.md). | [F:application-assets](../../../../job-tracker-ui/src/application-assets.test.tsx); [F:application-workspace-overlay](../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx); [B:ApplicationAssets](../../../../JobTrackerApi.Tests/ApplicationAssetsTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Native/mocked review/history evidence does not establish live-model or provider quality; full screen-reader and every reject/history sequence remain unverified. | Workspace/AI owner; H — audit native manual/AI reject/accept/save/history and dirty Cancel/Discard; actual model quality separately. |
| **PRES-W07** — Application drafts and immutable submitted package/archived binaries | Job Application/Answers/Submission and Documents; [drafts/submitted packages](../../../../job-tracker-ui/src/components/ApplicationAssets.tsx). Existing drafts/frozen submission/archive owners recomposed by [P5-08b](../p5-08b/README.md); [native SQLite/archive/ZIP proof](../p5-08b-readiness/README.md) retained. | [F:application-assets](../../../../job-tracker-ui/src/application-assets.test.tsx); [F:application-drafts](../../../../job-tracker-ui/src/application-drafts.test.ts); [B:SubmittedApplicationPackage](../../../../JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs); [B:JobApplicationsApplicationPackage](../../../../JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Earlier P2-D01 capture expected failure is superseded by ordinary native passing evidence. Production restore/rollback and all storage/provider combinations remain unverified; capture is not external send. | Workspace/storage owner; H — retain native capture→source mutation→archive/ZIP immutable-byte regression; release owner proves restore/rollback independently. |
| **PRES-W08** — Attachments upload/category/name/AI consent/preview/download/delete | Job Documents; [Attachments](../../../../job-tracker-ui/src/components/Attachments.tsx). Existing attachments CRUD/consent/protected downloads retained; named narrow table/empty state in [P5-08b](../p5-08b/README.md), archive proof in [readiness](../p5-08b-readiness/README.md). | [F:attachments](../../../../job-tracker-ui/src/attachments.test.tsx); [B:AttachmentsController](../../../../JobTrackerApi.Tests/AttachmentsControllerTests.cs); [B:AttachmentConsistency](../../../../JobTrackerApi.Tests/AttachmentConsistencyTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Archive gate is locally satisfied for recorded native fixtures; physical drag/drop, broad rename/download/manual AT and production storage behavior remain unverified. | Workspace/storage owner; H — audit upload/category/name/consent/preview/download/delete and physical drop with live/frozen identity. |
| **PRES-W09** — Interview questions/answers/ready/manual removal/AI review | Job Interview Prep; [InterviewPrep](../../../../job-tracker-ui/src/components/InterviewPrep.tsx). Existing interview questions/answers/manual removal/AI review/readiness recomposed by [P5-08b](../p5-08b/README.md). | [F:interview-prep](../../../../job-tracker-ui/src/interview-prep.test.tsx); [B:InterviewPrepPersistence](../../../../JobTrackerApi.Tests/InterviewPrepPersistenceTests.cs); [B:InterviewAiContext](../../../../JobTrackerApi.Tests/InterviewAiContextTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Real-model quality, physical mobile keyboard/populated reload and manual AT remain open; prep does not establish scheduled interview data. | Workspace/AI owner; H — audit populated mobile keyboard/reload/manual removal and explicit AI review; no scheduled-interview inference. |
| **PRES-W10** — Debrief/follow-up draft/date/readiness | Job Interview Prep and follow-up links; [InterviewPrep](../../../../job-tracker-ui/src/components/InterviewPrep.tsx), [followMode producer](../../../../job-tracker-ui/src/jobWorkspaceRoute.ts). Existing debrief/follow-up draft/date/readiness owner recomposed by [P5-08b](../p5-08b/README.md); no automatic send. | [F:interview-prep](../../../../job-tracker-ui/src/interview-prep.test.tsx); [B:JobApplicationsFollowUpDraft](../../../../JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs); [B:InterviewPrep](../../../../JobTrackerApi.Tests/InterviewPrepTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | Timezone/reload chains and provider delivery remain unverified; followMode-specific compose UI is deferred rather than implemented. | Workspace/mail/calendar owner; H — audit debrief/date/reload and metadata links; defer mode-specific compose UI under recorded decision. |
| **PRES-W11** — Reminder rules/actions/notifications, ICS and Google/Outlook events | `/reminders`, Settings rules, job Notes & tasks; [RemindersView](../../../../job-tracker-ui/src/components/RemindersView.tsx), [RulesSettingsCard](../../../../job-tracker-ui/src/components/RulesSettingsCard.tsx), [calendar actions](../../../../job-tracker-ui/src/components/ApplicationCalendarActions.tsx). Reminder/calendar links retained by [P5-01](../p5-01/README.md)/[P5-02](../p5-02/README.md), Dashboard and [P5-08b](../p5-08b/README.md); calendar/rules APIs unchanged. | [F:daily-control-loop](../../../../job-tracker-ui/src/daily-control-loop.test.tsx); [F:application-calendar](../../../../job-tracker-ui/src/application-calendar.test.tsx); [B:ApplicationCalendarController](../../../../JobTrackerApi.Tests/ApplicationCalendarControllerTests.cs); [B:RulesEngineProspect](../../../../JobTrackerApi.Tests/RulesEngineProspectTests.cs) | [Shell/notification entry](../p5-02/README.md); [workspace links](../p5-08b/README.md). Dedicated full calendar/worker responsive audit absent. | **PARTIAL** | F21 DST/date-only/provider timezone gap, actual Google/Outlook events, scheduler delivery and historical unconfirmed rules-save 500 remain open. | Calendar/API owner; H — investigate F21 DST/date-only semantics before event changes; audit real ICS/rules/reminder and approved provider writes. |
| **PRES-W12** — Async progress/failure/retry/cancel/notifications | `/operations`, Career processing and bell; [OperationsPage](../../../../job-tracker-ui/src/views/OperationsPage.tsx), [processing consumer](../../../../job-tracker-ui/src/views/CareerProfilePage.tsx). Operations remains reachable utility; progress/result/cancel/retry links retained by [P5-02](../p5-02/README.md)/[P5-08b](../p5-08b/README.md); store/worker unchanged. | [F:operations-page](../../../../job-tracker-ui/src/operations-page.test.tsx); [F:profile-page](../../../../job-tracker-ui/src/profile-page.test.tsx); [B:OperationsController](../../../../JobTrackerApi.Tests/OperationsControllerTests.cs); [B:UserOperationStore](../../../../JobTrackerApi.Tests/UserOperationStoreTests.cs) | [Shell/notification entry](../p5-02/README.md); [workspace links](../p5-08b/README.md). Dedicated full calendar/worker responsive audit absent. | **PARTIAL** | Long disconnect/reconnect and F20 enabled worker fault containment remain operational gaps; no live job/worker recovery was certified. | Operations/worker owner; H — audit disconnect/reconnect/late-result/no-duplicate starts/cancel/retry; F20 recovery before enabling producers. |
| **PRES-C01** — Canonical structured career data and long-tail/custom sections | `/career?section=profile`; [CareerProfilePage](../../../../job-tracker-ui/src/views/CareerProfilePage.tsx), [structured sections](../../../../job-tracker-ui/src/views/career/CareerProfileSections.tsx). Career entry retained; canonical/source scope reviewed in [P5-10](../p5-10/README.md), [P5-12](../p5-12/README.md) and [AI readiness](../p5-13-readiness/README.md). | [F:profile-page](../../../../job-tracker-ui/src/profile-page.test.tsx); [B:CareerProfileController](../../../../JobTrackerApi.Tests/CareerProfileControllerTests.cs); [B:CareerProfileService](../../../../JobTrackerApi.Tests/CareerProfileServiceTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Full long-tail Career/mobile save and canonical concurrent updates remain separate; scoped CV acceptance never implies canonical-profile revision safety. | Career/API owner; H — audit every long-tail/custom field and mobile save/source isolation; canonical concurrent saves remain separate. |
| **PRES-C02** — Profile overview/completeness/import guidance/raw copy/history/restore | `/career`; [CareerWorkspacePage](../../../../job-tracker-ui/src/views/CareerWorkspacePage.tsx), [raw/history/import](../../../../job-tracker-ui/src/views/CareerProfilePage.tsx). Career overview/import/raw/history owner unchanged; source relation regression retained by [P5-10](../p5-10/README.md)/[P5-12](../p5-12/README.md). | [F:career-workspace-page](../../../../job-tracker-ui/src/career-workspace-page.test.tsx); [F:profile-page](../../../../job-tracker-ui/src/profile-page.test.tsx); [B:CareerProfileService](../../../../JobTrackerApi.Tests/CareerProfileServiceTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Clipboard/avatar and complete native profile historical restore/manual AT remain unverified; real extraction quality is separate. | Career owner; M — audit raw copy, overview/completeness/import guidance and full historical restore without silent data replacement. |
| **PRES-C03** — Upload/extract/rebuild/reprocess/diff/select/accept/discard/retry/cancel | Career import/review; [extraction/diff/review consumer](../../../../job-tracker-ui/src/views/CareerProfilePage.tsx). Entry only: existing Career upload/extraction/reprocess/diff/accept/discard/retry/cancel owners retained. | [F:profile-page](../../../../job-tracker-ui/src/profile-page.test.tsx); [B:ProfileCvController](../../../../JobTrackerApi.Tests/ProfileCvControllerTests.cs); [B:CvProfileDiffService](../../../../JobTrackerApi.Tests/CvProfileDiffServiceTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Unusual/scanned/OCR document quality and full low-confidence deselection/discard browser acceptance remain unverified; no provider certification. | Career/extraction owner; H — audit low-confidence deselect/discard/retry/cancel and corpus quality; approve provider calls separately. |
| **PRES-C04** — Evidence bank source/category/tags/add/list/delete | Career overview/evidence; [CareerEvidenceBank](../../../../job-tracker-ui/src/views/career/CareerEvidenceBank.tsx). Evidence-bank owner unchanged; job source relationships retained through [P5-08b](../p5-08b/README.md). | [F:career-evidence](../../../../job-tracker-ui/src/career-evidence.test.tsx); [B:CareerEvidenceController](../../../../JobTrackerApi.Tests/CareerEvidenceControllerTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Full delete/many-item search/keyboard browser acceptance remains open; broader Career page work stays Phase 7. | Career owner; M — audit evidence source/category/tags/delete and large-list keyboard/source navigation. |
| **PRES-C05** — CV library create/copy/delete/templates/share/publication/PDF | `/career/builder`; [CvBuilderPage](../../../../job-tracker-ui/src/views/CvBuilderPage.tsx), [template gallery](../../../../job-tracker-ui/src/components/CvTemplateGallery.tsx). Library/CRUD/public ownership retained; editor actions in [P5-09](../p5-09/README.md) and shared template gallery in [P5-12](../p5-12/README.md). | [F:cv-builder-page](../../../../job-tracker-ui/src/cv-builder-page.test.tsx); [F:cv-template-thumbnail](../../../../job-tracker-ui/src/cv-template-thumbnail.test.tsx); [B:CvBuilder](../../../../JobTrackerApi.Tests/CvBuilderTests.cs); [B:PublicCvController](../../../../JobTrackerApi.Tests/PublicCvControllerTests.cs) | [P5-09–12 CV evidence](../p5-12/README.md); [P5-14 four pairs, 320–1440/landscape, keyboard/pointer/emulated touch](../p5-14/README.md). Human/physical/zoom/production unaccepted. | **PARTIAL** | Complete publish/unpublish/old-link revocation chain and every library/template combination remain unverified; library redesign is not claimed. | CV owner; H — audit create/copy/delete/gallery/share/publish/unpublish and old-public-link revocation; keep numeric/slug identity distinct. |
| **PRES-C06** — Studio tabs, preview debounce/pages/fit/save state/mobile panes | `/career/builder/:id`; [editor/preview owner](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx). Direct [P5-09](../p5-09/README.md) frame/navigation, [P5-11](../p5-11/README.md) live preview and [P5-12](../p5-12/README.md) controls; one save/preview/mobile owner. [P5-14 responsive/ownership successor](../p5-14/README.md) now supplements this record. | [F:cv-builder-deep-link](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:CvBuilder](../../../../JobTrackerApi.Tests/CvBuilderTests.cs) | [P5-09–12 CV evidence](../p5-12/README.md); [P5-14 four pairs, 320–1440/landscape, keyboard/pointer/emulated touch](../p5-14/README.md). Human/physical/zoom/production unaccepted. | **PARTIAL** | P5-14 now supplies the integrated held-PUT pane/viewport, preview boundary-key/scroll, reachable return, canvas and hit-test successor. Physical touch/software keyboard, 200%/400% zoom, human AT, broader wrapped/short-height states and production rendering remain unaccepted. | CV/accessibility owner; H — retain P5-14 held-PUT/responsive/scroll checks; obtain physical touch/software keyboard/zoom/manual AT evidence. |
| **PRES-C07** — Visibility/order/custom sections and item/document overrides | Builder Content; [ContentTab/EntryEditor](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx), [useDragReorder](../../../../job-tracker-ui/src/hooks/useDragReorder.ts). Direct [P5-10](../p5-10/README.md) source/item/custom editing and [P5-12](../p5-12/README.md) settings retention; explicit reset/inclusion/order retained. [P5-14 responsive/ownership successor](../p5-14/README.md) now supplements this record. | [F:cv-builder-deep-link](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [F:cvBuilder](../../../../job-tracker-ui/src/cvBuilder.test.ts); [B:CvBuilder](../../../../JobTrackerApi.Tests/CvBuilderTests.cs) | [P5-09–12 CV evidence](../p5-12/README.md); [P5-14 four pairs, 320–1440/landscape, keyboard/pointer/emulated touch](../p5-14/README.md). Human/physical/zoom/production unaccepted. | **PARTIAL** | P5-14 closes P5-10-O01 only for tested ownership/default-drop cases: entry/section order, inactive nested lists and foreign editable-title non-mutation. Physical touch/text selection/all-browser gestures and exhaustive saved override/reset combinations remain unqualified. | CV/accessibility owner; H — retain tested native nested ownership/default-drop checks; audit physical touch/text selection/all-browser overrides before broader claim. |
| **PRES-C08** — Capability-aware templates/typography/color/header/skills/sidebar/photo | Builder Template/Customize; [CvCustomizeTab](../../../../job-tracker-ui/src/components/cv/CvCustomizeTab.tsx), [gallery](../../../../job-tracker-ui/src/components/CvTemplateGallery.tsx). Direct [P5-12](../p5-12/README.md) nine-template capability/control presentation and [P5-11](../p5-11/README.md) preview; renderer/template IDs retained. | [F:cv-builder-deep-link](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [F:cvBuilder](../../../../job-tracker-ui/src/cvBuilder.test.ts); [B:CvBuilder](../../../../JobTrackerApi.Tests/CvBuilderTests.cs) | [P5-09–12 CV evidence](../p5-12/README.md); [P5-14 four pairs, 320–1440/landscape, keyboard/pointer/emulated touch](../p5-14/README.md). Human/physical/zoom/production unaccepted. | **PARTIAL** | All-template/font/photo/wrapped-line/browser/control combinations and broad custom-colour/manual AT remain unverified; finite capability matrix and Pro locks are not exhaustive. | CV/renderer owner; M — audit capability controls/locks and broader font/photo/wrapped text; manual custom-colour names and contrast. |
| **PRES-C09** — A4/Letter/density/margins/dates/document locale/section presentation | Builder Customize/Content; [document settings](../../../../job-tracker-ui/src/components/cv/CvCustomizeTab.tsx), [settings client](../../../../job-tracker-ui/src/cvBuilder.ts). Direct [P5-12](../p5-12/README.md) A4/Letter/density/margin/date/language/columns controls; [pagination repair](../p5-09-pagination-readiness/README.md) retained. | [F:cvBuilder](../../../../job-tracker-ui/src/cvBuilder.test.ts); [F:cv-builder-deep-link](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:CvBuilder](../../../../JobTrackerApi.Tests/CvBuilderTests.cs) | [P5-09–12 CV evidence](../p5-12/README.md); [P5-14 four pairs, 320–1440/landscape, keyboard/pointer/emulated touch](../p5-14/README.md). Human/physical/zoom/production unaccepted. | **PARTIAL** | Recorded unchanged-tolerance local fidelity supersedes prior six-fixture failures; all advanced combinations, deployment fonts/photo/wrapped text and manual print inspection remain open. | CV/renderer owner; H — retain unchanged numerical oracle/settings exports; audit advanced locale/layout combinations and actual deployed print/fonts. |
| **PRES-C10** — Undo/redo, save queue, dirty guard, history restore/preview lifecycle | Builder save/undo/history; [single editor/history owner](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx). Existing save/undo/history owner retained in [P5-09](../p5-09/README.md)–[P5-12](../p5-12/README.md); [CV revision protocol](../p5-09-readiness/README.md) and stale AI guard retained. [P5-14 responsive/ownership successor](../p5-14/README.md) now supplements this record. | [F:cv-builder-deep-link](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:CvBuilder](../../../../JobTrackerApi.Tests/CvBuilderTests.cs) | [P5-09–12 CV evidence](../p5-12/README.md); [P5-14 four pairs, 320–1440/landscape, keyboard/pointer/emulated touch](../p5-14/README.md). Human/physical/zoom/production unaccepted. | **PARTIAL** | CV stale-write/history safety has scoped native evidence; long offline/history combinations and profile/job concurrent edits remain separate. No new save owner or history store. | CV/API owner; H — audit long offline/history/conflict/undo/dirty transitions; retain downloadable draft and one save/history owner. |
| **PRES-C11** — Section and whole-document AI improve/translate/instruction/grammar review | Builder section/AI Tools; [AiSectionAssistant](../../../../job-tracker-ui/src/components/cv/AiSectionAssistant.tsx), [DocumentAiTab](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx); [Production service guard](../../../../JobTrackerApi/Program.cs). Retained existing section/document assistant affordances; [current Production service withholding](../../../../JobTrackerApi/Program.cs) and [validated historical exception](../release-readiness/README.md). P5-13 review UI remains unimplemented. | [F:ai-section-assistant](../../../../job-tracker-ui/src/ai-section-assistant.test.tsx); [F:cv-builder-deep-link](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:AiWorkspace](../../../../JobTrackerApi.Tests/AiWorkspaceTests.cs); [B:AiPrivacyPolicy](../../../../JobTrackerApi.Tests/AiPrivacyPolicyTests.cs) ; [Production no-write checks](../../../../JobTrackerApi.Tests/CvAiReadinessTests.cs), [isolated HTTP contract](../../../../job-tracker-ui/ai-tests/cv-ai-readiness.spec.ts) | [Deterministic readiness only](../p5-13-readiness/README.md); [P5-14 exclusion](../p5-14/README.md). No qualified or responsive AI-review visual journey. | **DEFERRED** | Full CV rewriting/review remains DEFERRED — BLOCKED / NOT QUALIFIED: deployed model identity unverified; frozen 32-case/366-call qualification has 0 completed calls and 0 human reviews; factuality unmeasured; P5-13 review UI unimplemented. Current Production guard returns 503 cv_ai_unavailable; safe withholding is an exception, not successful generation/review. Existing assistant affordances can report unavailable. | AI/CV/product owner; H — meet frozen model identity/corpus/rubric/human review and review-UI return conditions; retain Production 503/no-write/unrelated-AI checks. |
| **PRES-C12** — Private PDF and published anonymous CV/PDF, long searchable pages | Private builder export and `/cv/:slug`; [private export client](../../../../job-tracker-ui/src/cvBuilder.ts), [PublicCvPage](../../../../job-tracker-ui/src/views/PublicCvPage.tsx). Private/public PDF ownership and shared admission retained through [P5-11](../p5-11/README.md)/[P5-12](../p5-12/README.md); native preview/PDF corpus unchanged. | [F:public-cv-page](../../../../job-tracker-ui/src/public-cv-page.test.tsx); [B:PublicCvController](../../../../JobTrackerApi.Tests/PublicCvControllerTests.cs); [B:PdfRenderAdmission](../../../../JobTrackerApi.Tests/PdfRenderAdmissionTests.cs) | [P5-09–12 CV evidence](../p5-12/README.md); [P5-14 four pairs, 320–1440/landscape, keyboard/pointer/emulated touch](../p5-14/README.md). Human/physical/zoom/production unaccepted. | **PARTIAL** | P5-14 retains unchanged 16-fixture/36-page native preview/PDF and 8-settings/24-page export historical proof at unchanged tolerances. This is finite local evidence; deployed Chromium/Linux/fonts/photo/all-print-engine and manual print inspection remain unverified. | CV/rendering/release owner; H — audit public revoke/private denial/PDF busy recovery and deployed Linux/fonts/photos/manual print; preserve admission. |
| **PRES-M01** — Job-scoped manual correspondence/search/delete/paste import | Job Timeline/Correspondence; [Correspondence](../../../../job-tracker-ui/src/components/Correspondence.tsx). Existing job manual correspondence/search/import/delete owner recomposed by [P5-08b](../p5-08b/README.md); global entry retained. | [F:end-to-end-trust-loop](../../../../job-tracker-ui/src/end-to-end-trust-loop.test.tsx); [F:correspondence-search-context](../../../../job-tracker-ui/src/correspondence-search-context.test.ts); [B:CorrespondenceController](../../../../JobTrackerApi.Tests/CorrespondenceControllerTests.cs) | [Workspace correspondence entry](../p5-08b/README.md). Full mail/provider/mobile AT absent. | **PARTIAL** | Full manual edit/delete/paste-import browser combinations and manual AT remain unverified; logging correspondence is not sending mail. | Mail/workspace owner; H — audit native log CRUD/search/paste import and no-send distinction. |
| **PRES-M02** — Gmail candidate/thread import/refresh/sync/unlink/relink/move | Job Timeline/Correspondence Gmail tools; [Correspondence](../../../../job-tracker-ui/src/components/Correspondence.tsx). Existing job Gmail candidate/thread/import/sync/move/unlink owners recomposed by [P5-08b](../p5-08b/README.md); provider/API behavior unchanged. | [F:correspondence-gmail-import](../../../../job-tracker-ui/src/correspondence-gmail-import.test.tsx); [B:GmailController](../../../../JobTrackerApi.Tests/GmailControllerTests.cs); [B:EmailOwnershipIntegration](../../../../JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs) | [Workspace correspondence entry](../p5-08b/README.md). Full mail/provider/mobile AT absent. | **PARTIAL** | Live provider threads, multi-account reconnect/revoked grants and sync failures remain unverified. | Mail/provider owner; H — audit owned thread/job link/move/unlink/reconnect and approved live sync failures. |
| **PRES-M03** — Global inbox filters/page/provider/link/direction/detail/source links | `/correspondence`; [CorrespondenceInboxPage](../../../../job-tracker-ui/src/views/CorrespondenceInboxPage.tsx). Entry only via [P5-01](../p5-01/README.md); global inbox filters/page/provider/detail/source owners unchanged. | [F:correspondence-inbox-page](../../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx); [B:EmailController](../../../../JobTrackerApi.Tests/EmailControllerTests.cs); [B:EmailOwnershipIntegration](../../../../JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Real large-mailbox/attachment-binary flows and complete native inbox/AT acceptance remain open; global inbox redesign stays Phase 7. | Mail owner; H — audit large native inbox paging/provider failure/detail/attachment binaries and manual AT. |
| **PRES-M04** — Compose/reply/provider/recipient/job; draft conflicts; confirm send/uncertainty | `/correspondence` Drafts/Compose; [draft/send owner](../../../../job-tracker-ui/src/views/CorrespondenceInboxPage.tsx). Compose/reply/revision/send/uncertainty owner unchanged; [P5-08b](../p5-08b/README.md) navigation regression only. | [F:correspondence-inbox-page](../../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx); [B:EmailDraftsController](../../../../JobTrackerApi.Tests/EmailDraftsControllerTests.cs); [B:EmailDraftPersistence](../../../../JobTrackerApi.Tests/EmailDraftPersistenceTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Actual sandbox mail delivery/reconnect and every dirty/send interruption remain unverified; no automatic uncertain-send retry. followMode-specific UI remains deferred. | Mail/API owner; H — audit draft conflicts, explicit send/uncertain-new-attempt, reconnect/dirty interruption; followMode UI deferred, no automatic resend. |
| **PRES-M05** — Review proposed jobs/link/reject/keep/notes/sync/create | `/correspondence?view=review`, review alias; [GmailReviewPage](../../../../job-tracker-ui/src/views/GmailReviewPage.tsx), [inbox view adapter](../../../../job-tracker-ui/src/views/CorrespondenceInboxPage.tsx). Review alias and inbox entry retained in [P5-01](../p5-01/README.md)/[P5-08b](../p5-08b/README.md); reviewed decisions/create owner unchanged. | [F:gmail-review-page](../../../../job-tracker-ui/src/gmail-review-page.test.tsx); [F:correspondence-inbox-page](../../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx); [B:GmailController](../../../../JobTrackerApi.Tests/GmailControllerTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Real provider review and complete suggested-job creation browser journey remain unverified; no automatic creation from navigation. | Mail/capture owner; H — audit review alias, proposed-job/link/reject/keep/notes/sync/create confirmation and owner boundaries. |
| **PRES-M06** — Gmail/Graph/IMAP connect/status/disconnect separate from sign-in | `/settings/connected-accounts`; [ConnectedAccountsPage](../../../../job-tracker-ui/src/views/ConnectedAccountsPage.tsx), [provider connections](../../../../job-tracker-ui/src/components/EmailProviderConnections.tsx). Connections entry retained in [P5-01](../p5-01/README.md)/[P5-02](../p5-02/README.md); existing Gmail/Graph/IMAP controls separate from sign-in. | [F:email-provider-connections](../../../../job-tracker-ui/src/email-provider-connections.test.tsx); [B:MicrosoftGraphController](../../../../JobTrackerApi.Tests/MicrosoftGraphControllerTests.cs); [B:ImapController](../../../../JobTrackerApi.Tests/ImapControllerTests.cs) | [Inherited Settings loaded/mobile review](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [shell entry](../p5-01/README.md). No full current domain requalification. | **PARTIAL** | Actual provider authorization/revocation/token expiry/reconnect remain unverified; no credentials or live provider operations in this review. | Connections/provider owner; H — audit actual grants/revoke/expiry/reconnect and IMAP safety; provider sandbox authorization required. |
| **PRES-S01** — Personal metrics/activity/funnel/company/skills/stage/salary/next actions | `/dashboard`, added `/analytics`; [shared reports owner](../../../../job-tracker-ui/src/components/DashboardView.tsx), [AnalyticsPage](../../../../job-tracker-ui/src/views/AnalyticsPage.tsx). Direct accurate report labels/cohorts in [P5-06](../p5-06/README.md) and meaningful [P5-07 Analytics](../p5-07/README.md); existing server facts retained. | [F:daily-control-loop](../../../../job-tracker-ui/src/daily-control-loop.test.tsx); [F:workflow-trust-signals](../../../../job-tracker-ui/src/workflow-trust-signals.test.tsx); [B:StageAnalytics](../../../../JobTrackerApi.Tests/StageAnalyticsTests.cs); [B:AnalyticsSalary](../../../../JobTrackerApi.Tests/AnalyticsSalaryTests.cs) | [Dashboard](../p5-06/README.md), [Analytics](../p5-07/README.md) four pairs/narrow/exact-value states; [utilities](../p5-02/README.md). Human AT open. | **PARTIAL** | Scoped native chart/value/population transformations supersede earlier unmapped chart gaps; server timezone/date/population limits and unsupported NEW metrics remain explicit. | Reports/API owner; M — audit exact cohort/sample/date definitions and drill-down links; retain unsupported-metric boundaries. |
| **PRES-S02** — Owner-local five visibility preferences/onboarding dismiss/notifications | Dashboard visibility/onboarding and bell; [five local flags](../../../../job-tracker-ui/src/components/DashboardView.tsx), [OnboardingChecklist](../../../../job-tracker-ui/src/components/OnboardingChecklist.tsx), [NotificationsPopover](../../../../job-tracker-ui/src/components/NotificationsPopover.tsx). Direct [P5-02](../p5-02/README.md) notifications and [P5-06](../p5-06/README.md) five owner-local Dashboard flags/onboarding; Analytics independent. | [F:onboarding-checklist](../../../../job-tracker-ui/src/onboarding-checklist.test.tsx); [F:notifications-popover](../../../../job-tracker-ui/src/notifications-popover.test.tsx); [B:JobLifecycleEvent](../../../../JobTrackerApi.Tests/JobLifecycleEventTests.cs) | [Dashboard](../p5-06/README.md), [Analytics](../p5-07/README.md) four pairs/narrow/exact-value states; [utilities](../p5-02/README.md). Human AT open. | **PARTIAL** | Five owner-local Dashboard visibility flags and scoped reload/account evidence remain; order/resize/reset is deferred. Recorded P5-06-O01 generic language-preference 500 during overlapping Dashboard/setup reads has no established exception/root cause; sequential fixture setup does not close concurrent save reliability. | Dashboard/shell/identity owner; H — investigate recorded P5-06-O01 language-save 500 during reads; audit five flags A/B/reload plus bell/onboarding; order/resize/reset deferred. |
| **PRES-S03** — Rules/reminder/table/theme/language preferences and account links | Settings tabs/mobile selector and shell preferences; [SettingsView](../../../../job-tracker-ui/src/components/SettingsView.tsx), [rules](../../../../job-tracker-ui/src/components/RulesSettingsCard.tsx), [language save](../../../../job-tracker-ui/src/i18n/I18nProvider.tsx). P4 Settings controls retained; [P5-00](../p5-00/README.md) feedback/shared tokens and [P5-03](../p5-03/README.md)/[P5-04b](../p5-04b/README.md) table preferences integration. | [F:settings-view](../../../../job-tracker-ui/src/settings-view.test.tsx); [F:theme-state](../../../../job-tracker-ui/src/theme-state.test.tsx); [B:NotificationSettingsController](../../../../JobTrackerApi.Tests/NotificationSettingsControllerTests.cs); [B:RulesEngineProspect](../../../../JobTrackerApi.Tests/RulesEngineProspectTests.cs) | [Inherited Settings loaded/mobile review](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [shell entry](../p5-01/README.md). No full current domain requalification. | **PARTIAL** | P4-04-O02 recorded SQLite notification saves had 2/10 HTTP 500/database-locked attempts; isolated rules 500 remains unconfirmed. P5-06-O01 language-preference 500 and rule drafts lost on tab unmount stay open; sequential success does not establish concurrency safety. | Settings/API/identity owner; H — investigate P4-04-O02 concurrent notification 500 and P5-06-O01 language-save 500; audit rule draft/tab lifecycle, unknown route/preferences. |
| **PRES-S04** — AI privacy/usage/limits/Free-Pro/server entitlement/conditional billing | Settings AI/plan and domain locks; [privacy](../../../../job-tracker-ui/src/components/AiPrivacySettingsCard.tsx), [usage](../../../../job-tracker-ui/src/components/AiUsageCard.tsx), [AccountPlanProvider](../../../../job-tracker-ui/src/accountPlan.tsx). Existing privacy/usage/entitlements/billing readiness retained; deterministic AI metering in [readiness](../p5-13-readiness/README.md); Production CV review exception only. | [F:settings-view](../../../../job-tracker-ui/src/settings-view.test.tsx); [F:ai-usage-card](../../../../job-tracker-ui/src/ai-usage-card.test.tsx); [B:AiPrivacyPolicy](../../../../JobTrackerApi.Tests/AiPrivacyPolicyTests.cs); [B:AiUsageMeter](../../../../JobTrackerApi.Tests/AiUsageMeterTests.cs) | [Inherited Settings loaded/mobile review](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [shell entry](../p5-01/README.md). No full current domain requalification. | **PARTIAL** | Actual checkout/webhooks/portal and provider consent/delivery remain unverified. Production CV unavailability is temporary authorized P5-13 debt, not fulfillment or disabling other AI. | AI/commerce/API owner; H — retain entitlement/privacy/metering and bounded Production CV exception; separately prove checkout/webhooks/portal before activation. |
| **PRES-S05** — Account ZIP/encrypted backup/lifecycle/deletion confirmations | Settings Backup; [BackupCard](../../../../job-tracker-ui/src/components/BackupCard.tsx). Account ZIP/backup/deletion controls and independent saves retained; [P5-00](../p5-00/README.md) feedback clearance and [native package/ZIP evidence](../p5-08b-readiness/README.md). | [F:account-data-export](../../../../job-tracker-ui/src/account-data-export.test.tsx); [B:AccountDataExport](../../../../JobTrackerApi.Tests/AccountDataExportTests.cs); [B:BackupController](../../../../JobTrackerApi.Tests/BackupControllerTests.cs) | [Inherited Settings loaded/mobile review](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [shell entry](../p5-01/README.md). No full current domain requalification. | **PARTIAL** | Actual database/account restore, verified recoverable backups, paid deletion/provider cancellation and rollback remain production release gates; no destructive rehearsal occurred. | Account lifecycle/release owner; H — audit exact confirmations/ZIP/backup gates; current recoverable restore/paid deletion/provider cancellation/rollback require authorized rehearsal. |
| **PRES-A01** — Admin user/create/roles/reset/delete/last-admin/self guards | `/admin/users`; [AdminUsersPage](../../../../job-tracker-ui/src/views/AdminUsersPage.tsx). Admin Users route/entry retained by [P5-01](../p5-01/README.md); server authorization/last-admin/self guards unchanged. | [F:admin-users-page](../../../../job-tracker-ui/src/admin-users-page.test.tsx); [B:UsersController](../../../../JobTrackerApi.Tests/UsersControllerTests.cs); [B:ApiAuthorizationPosture](../../../../JobTrackerApi.Tests/ApiAuthorizationPostureTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Mounted-view role revocation, full mutations and actual reset delivery remain unverified; hidden nav/synthetic shell never proves authorization. | Admin/identity owner; H — audit full guarded mutations, mounted-role revoke and real reset; crafted API denial remains mandatory. |
| **PRES-A02** — Audit list/detail/supported undo/job restore | `/admin/audit`; [AdminAuditPage](../../../../job-tracker-ui/src/views/AdminAuditPage.tsx). Admin Audit route/entry retained by [P5-01](../p5-01/README.md); supported server undo/restore owner unchanged. | [F:admin-audit-page](../../../../job-tracker-ui/src/admin-audit-page.test.tsx); [B:AuthAndSystemController](../../../../JobTrackerApi.Tests/AuthAndSystemControllerTests.cs); [B:ApiAuthorizationPosture](../../../../JobTrackerApi.Tests/ApiAuthorizationPostureTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Complete successful native undo/job restore browser acceptance remains open; role posture is not undo behavior proof. | Admin/API owner; H — audit persisted successful undo/job restore, unsupported actions and non-admin denial. |
| **PRES-A03** — System/build/DB/AI/mail/SMTP/test/probe/benchmark/maintenance | `/admin/system` and admin badge; [AdminSystemPage](../../../../job-tracker-ui/src/views/AdminSystemPage.tsx), [metadata disclosure](../../../../job-tracker-ui/src/layout/AppShell.tsx). Admin System route/entry/build metadata retained in [P5-00](../p5-00/README.md)/[P5-01](../p5-01/README.md); diagnostics/maintenance owner unchanged. | [F:admin-system-page](../../../../job-tracker-ui/src/admin-system-page.test.tsx); [B:AuthAndSystemController](../../../../JobTrackerApi.Tests/AuthAndSystemControllerTests.cs); [B:MaintenanceJobDispatcher](../../../../JobTrackerApi.Tests/MaintenanceJobDispatcherTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | Actual production SMTP/model/probes/benchmark/maintenance and sensitive-output qualification remain unverified; no live jobs launched. | Admin/operations owner; H — audit metadata/diagnostic sensitive outputs and guarded controls; production SMTP/model/maintenance proof separately authorized. |
## Source disagreements resolved without closing acceptance
- **Native package/tailoring:** Phase 2/Phase 3/P4 rows retain the historical P2-D01 expected failure. [P5-08b readiness](../p5-08b-readiness/README.md), ordinary native [preservation regression](../../../../job-tracker-ui/e2e/redesign-preservation.spec.ts) and [P5-14](../p5-14/README.md) supersede it with recorded passing SQLite capture/tailoring, source-mutation/archive/ZIP/binary proof. Do not report P2-D01 as a current expected failure. Actual production restore/storage/provider acceptance remains NOT VERIFIED.
- **CV integrity/rendering:** earlier stale-CV and six pagination failures have scoped [revision](../p5-09-readiness/README.md) and [pagination](../p5-09-pagination-readiness/README.md) successors. P5-14 retains the same numerical tolerances and source hashes. Profile/job revisions, wider font/photo/browser combinations and deployed rendering are distinct open obligations.
- **Responsive and drag failures:** the release-candidate matrix predates P5-14 and calls the integrated responsive journey and P5-10-O01 open. P5-14 records reproduced geometry, boundary-key, retained-scroll and nested/foreign-drop failures plus final scoped repairs. Those exact demonstrated cases have inherited success; physical device, human AT and broader combinations remain NOT VERIFIED. Planning adds no closure.
- **Dashboard preference-save 500:** P5-06-O01 is an observed generic **language** preference response while Dashboard/setup reads overlap; the five Dashboard visibility flags are owner-local storage in [DashboardView](../../../../job-tracker-ui/src/components/DashboardView.tsx). Root cause is unknown. This is open reliability evidence, not proof that every Dashboard toggle fails. P4-04-O02 notification concurrency is a separate recorded SQLite failure. Neither is cleared by sequencing a passing fixture.
- **followMode:** [Phase 3 route successor decision](../../phase-3/ROUTE_PLAN.md) and [P5-08b readiness](../p5-08b-readiness/README.md) explicitly preserve metadata while deferring mode-specific UI to mail. Current [producer](../../../../job-tracker-ui/src/jobWorkspaceRoute.ts) emits it; [workspace navigation](../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx) changes section/sub keys without dropping safe query metadata. No current mode consumer was found. Metadata retention earns no compose-mode UI acceptance.
- **CV AI:** [current service registration](../../../../JobTrackerApi/Program.cs) omits `CvAiSuggestionService` in Production, and the optional-service [controller boundary](../../../../JobTrackerApi/Controllers/CvVariantController.cs) returns `503 cv_ai_unavailable` for generation/Apply. Inherited negative/no-write and unrelated-AI tests prove only that controlled local boundary. P5-13 model semantic qualification and review UI remain DEFERRED — BLOCKED / NOT QUALIFIED. The guarded capability is not fulfilled; existing visible controls may return unavailable. [Exact return conditions](../OPEN_BLOCKERS.md#p5-13-deferred-debt-and-return-conditions--2026-10-08) remain mandatory.
## P5-15 execution acceptance obligations
The future acceptance audit must expand the original sub-workflows, execute mapped tests at its declared source, and record route/state/role/data/viewport/theme/locale/keyboard outcomes with evidence provenance. Use [route acceptance](ROUTE_ACCEPTANCE.md) for the 31-original/32-current patterns, alias/query lifetime, removed-primary-entry replacements and visible-control actions. High-risk identity, dirty draft, revision, send uncertainty, delete/restore, immutable archives, export and source/variant relationships need behavioral evidence; screenshots cannot replace them.
Manual utility screen-reader operation (P5-02-D01), command entry/focus timing (P5-04b-R01), attachment-confirmation focus (P5-07-O01), company in-modal save error (P4-02-D02), incomplete axe checks and physical/zoom qualification remain explicit future audits under the [open register](../OPEN_BLOCKERS.md). These are separate from production ingress, current backups/restore/configuration/schema/rollback, protected CI/deployed SHA and actual authenticated deployment acceptance. [Production decision remains NO-GO](../production-release-decision/README.md). This plan issues no acceptance GO, completion claim, new release exception or deployment authorization.
@@ -0,0 +1,156 @@
# P5-15 — readiness debt and operator exit proof
Planning-only P5-15-00, 2026-10-09; source `46a0c0c6d23464869f50c0d88552963c29cfdacf`, `codex/ui-redesign-phase4`. **Production: NO-GO. Full Phase 5: CONDITIONAL / PARTIAL.** Prepared procedures are not executed or verified evidence. No application change, test execution, infrastructure/provider call, Docker recovery, migration, production action, commit or push occurred here. The [Part A decision](../production-release-decision/README.md) records actual production branch `main` and automatic deployment on a successful `main` push; no unconditional GO, merge/push/deploy approval follows from this plan.
Reconciled against [OPEN_BLOCKERS](../OPEN_BLOCKERS.md), [P4-06](../../phase-4/p4-06/README.md), [known issues](../../../roadmap/known-issues.md), [TODO](../../../roadmap/todo.md), [root blockers](../../../../BLOCKERS.md), [release readiness](../release-readiness/README.md), [Part A](../production-release-decision/README.md), [P5-14](../p5-14/README.md), [semantic qualification](../p5-13-semantic-qualification/README.md), and current operational sources below. Historical records keep their original outcomes; successor evidence closes only its demonstrated scope. The broad known-issues F01 statement predates local CV revision repair; **profile/job revision debt remains**, while CV's scoped guard is passing locally.
## Classification
| Class | Meaning |
|---|---|
| **A — production-release blocker** | Critical actual-runtime/recovery/security/deployment acceptance is missing, or a conditional feature would be unsafe to release enabled. A main push can auto-deploy, so do not push/merge `main` while its critical gates are unresolved. |
| **B — full Phase 5 scope blocker** | Mandatory planned capability or affected-screen human/accessibility/preservation acceptance is incomplete. Independent approved local slices can continue; full Phase 5 is not accepted. |
| **C — approved deferred scope** | Explicit decision permits omission for the bounded checkpoint. Deferral is neither implementation nor verification and can coexist with B (or A if the unavailable workflow is exposed in production). |
| **D — non-blocking conditional risk** | Separately owned limitation does not block the unchanged, bounded local presentation checkpoint. It becomes a gate when its trigger applies; it is not proof that the defective workflow is accepted. Known failures are never closed by unrelated passing suites. |
Owners below are responsible roles, not invented assignees. Each next checkpoint is a work boundary, not automatic permission to operate. Resolve a row with linked reproduction/change/exit evidence and a dated owner decision; do not erase the original failed trace. Multiple classes are deliberate.
## Debt register
| ID / current status and exact scope | Class | Owner / next checkpoint | Exit proof |
|---|---|---|---|
| **RD01 F04/B06 actual production ingress — OPEN.** Real Traefik socket peer, generated nginx trust, effective API client identity, listeners/networks/NAT/firewall/IPv6/TLS/restart are unobserved. Historical HTTP redirect reached an unreachable `:444`; public HTTPS/connection failures do not close it. | **A** | Deployment/security operator; authorized G-RELEASE ingress assessment before any main release | Current SHA/images/topology, trusted vs untrusted socket-source evidence, external A/AAAA direct/spoofed denial, canonical reachable redirect/TLS, real-chain A/B limiter/session tests and isolated invalid-config/restart proof. Shared NAT source for both paths is a stop condition. |
| **RD02 current complete backup/restore — UNVERIFIED.** Fresh DB plus uploaded/CV data, required exports, Data Protection keys and separately protected tombstones are not demonstrated. Historical seeded MariaDB restore/old gzip-valid DB-only dump is insufficient. | **A** | Backup/data operator; pre-release recovery rehearsal | Timestamp/hash/manifest/custody/retention/off-host evidence for a current complete set; isolated restore with row/content/non-ASCII/attachment/package/PDF comparisons, application boot, protected-data decryption and tombstone replay. Existence/format checks alone are not a restore. |
| **RD03 current configuration/provider/schema/startup — UNVERIFIED; F19 OPEN.** `Program.cs` defaults missing provider to SQLite and changes missing connection to SQLite. Candidate adds no DDL migration, but startup still migrates/reconciles; actual provider/schema/counts are unknown. | **A**; **D** for unrelated local UI | Deployment/database owner; pre-release runtime/schema inspection | Verify non-secret effective provider/origin/auth/ingress/gates, secret presence/custody privately, schema and `__EFMigrationsHistory`, before/after counts on restored current data. Missing server connection must not be accepted as an empty fallback database. Repair F19 only in separately scoped backend work if necessary. |
| **RD04 rollback/failure recovery — UNVERIFIED.** Commit-tagged core images/automatic rollback code exist; real failure-injection rehearsal and complete prior images/config are not proved. Database restore loses newer writes. | **A** | Release operator; disposable Linux topology rehearsal before release | Deliberate post-replacement failure returns nonzero/failed CI, restores previous core images, retains DB/files/keys/tombstones and existing counts/login, then passes smoke. Rehearse schema/data rollback only if needed, on isolated restore; never blindly restore production DB. |
| **RD05 protected CI/deployed SHA/authenticated acceptance — UNVERIFIED.** Part A recorded `main` at `27657f31131cd95d42f0e1290853ec9c9b3959a4`; that is a repository observation, not current deployed identity. Remote branch protection/runner and candidate deployment have no acceptance evidence. | **A** | Release/CI owner; after RD01–04 permit release | Complete candidate protected test/browser results; approved history-preserving main release without force; actual deployment outcome, matching SHA/version, health/readiness/public auth, existing-account/owner/data/Career/workspace/CV/PDF/attachment smoke and rollback decision. A feature-branch push or public health 200 is insufficient. |
| **RD06 human accessibility / incomplete axe — OPEN.** Actual P5-14 JSON: **242 scans, 0 reported violations, 1,839 repeated incomplete target occurrences**: contrast 1,574; hidden-focus 34; prohibited-attribute 209; valid-value 18; table-header 4. Counts are not distinct issues or passes. P5-02-D01 spoken names/live-state remains mandatory. | **B**; **A** where an unresolved serious failure prevents safe release acceptance | Accessibility/UI owners + human reviewer; P5-15 authorized manual checkpoint | Execute [M01–M12](MANUAL_ACCEPTANCE.md#numbered-manual-scripts), including real NVDA/Narrator and M12 physical-device/mobile-AT evidence, full affected matrix and contextual rule dispositions; retain exact names/reading order/live/errors/focus evidence. M13 remains blocked by deferred P5-13. Do not suppress rules, remove modal isolation or count AX-tree inspection as spoken acceptance. |
| **RD07 physical touch/software keyboard/mobile AT/zoom/forced-colors/text spacing — NOT VERIFIED.** P5-14 emulated taps/keyboard/geometry qualify only demonstrated cases. 320px CV fit is an overview. | **B** | UI/accessibility + device reviewer; P5-15 device/reflow checkpoint | Actual phone/tablet and mobile reader, keyboard/rotation/selection/drag/cancel/alternative results; browser 200%/400%, text spacing and forced colors with reachable primary actions/drafts/focus. All missing lanes remain explicit. |
| **RD08 P5-13 configured-model semantics and AI review UI — DEFERRED, BLOCKED / NOT QUALIFIED / NOT IMPLEMENTED.** Frozen **32 synthetic cases; 0/366 actual required calls; 0 human reviews; critical factuality unmeasured**. Current candidate Ollama `qwen2.5:7b` is not deployed identity. Docker AF_UNIX/error-1920 environment remains unresolved. | **B + C**; **A** if unqualified proposal generation/Apply is exposed | AI/backend + human reviewer/UI owner; separately authorized P5-13 return task | Exact [return conditions](../OPEN_BLOCKERS.md#p5-13-deferred-debt-and-return-conditions--2026-10-08): deployed provider/model/digest/settings/runtime/prompt identity; supported non-destructive isolated equivalent; uncached smoke; unchanged 366 calls with repeats/output/errors; human rubric; no fabricated/false-approved/ambiguous claims; bounded fixes/full rerun; actual review UI and responsive/AT regression. Do not retry Docker recovery during P5-15. |
| **RD09 Production CV proposal withholding — local proof only.** Existing `Program.cs` omits `CvAiSuggestionService` in Production; generation/Apply return `503 cv_ai_unavailable` before provider/write. Other AI registrations remain available. Current deployment is unverified. | **A** verification gate + **C** temporary withholding | API/release owner; authorized deployed-service check | Matching deployed SHA/environment plus authenticated unavailable generation/Apply with no CV/profile/history mutation or provider call, ordinary editing/save/history/PDF and unrelated AI still available. Keep guard until RD08 passes; a UI deferral alone does not withhold an API. |
| **RD10 production Linux/fonts/photos/print/other browsers — UNVERIFIED.** Local 16/16 standard (36=36 pages) and 8/8 settings (24=24) unchanged fidelity are finite. Photo/wrapped-line/template/font/native-print qualification remains open. | **B** for full affected CV acceptance; **A** for release environment font/data smoke | CV/rendering + release reviewer; isolated production-equivalent render checkpoint | Effective Linux/browser/fonts/image revisions; native preview/private/public PDF/photo/non-ASCII/long-line/template checks at unchanged tolerances and manual readability/print; supported alternate-browser/device evidence. Do not infer missing production fonts from local success or alter tolerances. |
| **RD11 P5-06-O01 language preference 500 — OPEN, root cause unproven.** Actual PUT `/api/auth/preferences/language` uses `UserManager.UpdateAsync`; source caller applies UI/localStorage first and swallows failed PUT. This can silently leave server preference stale; concurrent Dashboard reads accompany the historical 500, not a proved root cause. | **B** for reliable affected Settings/locale acceptance; **A** if reproduced on intended production provider/workflow; **D** only for independent presentation scope | Backend/identity + i18n owner; scoped reliability investigation before locale persistence acceptance | Reproduce overlapping native path on disposable intended provider with sanitized exception/status/correlation and before/after preference; verify failure feedback and recovery, successful readback/relogin, account isolation and regression. Fixture sequencing/204 on later saves does not close original 500 or swallowed failure. |
| **RD12 P4-04-O02 notification-setting contention — OPEN.** Native PUT `/api/notification-settings` through `UserManager.UpdateAsync` produced SQLite error 5/DB locked in **2/10**; readback retained old value. Settings currently retains draft and in-page error; sequential success is not a contention fix. | **B** for complete affected settings reliability; **A** if intended deployed provider reproduces; **D** for unchanged independent UI | Backend/identity owner; scoped concurrent API reproduction before more polling/writes | Trace exact locking/transaction/provider cause and bounded fix, concurrent success/failure/draft/retry/readback evidence on real disposable DB. Never treat GET 200 as PUT success or hide a 500 with generic retries. |
| **RD13 P2-O01 rules-save 500 — historical unconfirmed, still OPEN.** Rules GET can create per-user settings; PUT gets/creates then `SaveChangesAsync`. Creation-race catch/reload exists, but does not prove the historical failure cause. Save error is currently transient toast; draft remains. | **D** conditional reliability; **B** if recurrence/failure feedback prevents affected flow acceptance; **A** if deployed critical persistence fails | Backend/rules + Settings owner; scoped triage if recurring and M07 error acceptance | Retain trace/status/exception and native before/after rule values; investigate actual concurrent/create/save path. Prove accessible actionable error and deliberate successful recovery; do not equate this unproven cause with notification locking. |
| **RD14 command/dialog focus observations P5-04b-R01/P5-07-O01 — OPEN.** Command focus gained/lost around entry; attachment Shift+Tab failed while existing `onEntered` refocused Cancel. Unchanged focused reruns passed; transition race is not instrumented/proven. | **B** affected shared focus acceptance | Shared dialog/shell owner; targeted instrumented investigation plus M02/M05/M09 | Preserve failed observations; reproduce/instrument entry/exit focus ownership, keyboard trap and return under normal/reduced motion and AT, then bounded fix/retest if warranted. Rerun alone does not close it. |
| **RD15 P5-04b-R02 CV section expansion — cause unproven.** One unchanged full-run smoke failed before PDF; three unchanged focused runs passed. | **D** baseline investigation; **B** if recurring affected CV preservation failure | CV readiness owner; targeted expansion reproduction before broader CV acceptance | Actual event/focus/expanded-state trace and retained assertion, diagnosis or bounded reproduction-backed disposition. Keep original failure; do not mark fixed from later broad pass. |
| **RD16 P4-02-D02 company error outside modal — OPEN.** Failed save retains draft, but transient toast is outside modal's accessible subtree. P5-00 bottom feedback placement does not repair this. | **B** for full affected dialog acceptance; **D** for unrelated local P5 slices | Company form/Phase 7 owner; M07/M09 targeted accessibility checkpoint | Durable visible/spoken in-modal failure, retained draft, retry/recovery and focus/return evidence without disabling background isolation. No universal dialog pass while this counterexample remains. |
| **RD17 Board full-array scaling — O(N) ceiling retained.** One settled complete read, no duplicate Table read/page crawl; entire matching array renders. Finite fixture is not large-account performance proof. | **D** conditional capacity gate | Jobs/API owner; measured representative large-account checkpoint before scaling claims | Agreed representative data/load/latency/request/render/memory budget; prove current bound or separately scoped paging/virtualization preserving full membership/filter/status semantics. No speculative infrastructure rewrite in P5-15. |
| **RD18 Board/CV physical dragging — NOT VERIFIED beyond scoped automation.** P5-10-O01 closes only tested entry/section ownership/default-drop cases; physical selection/drop/cancel/browser variants remain separate. Named alternatives exist. | **B** mandatory physical acceptance; **D** unsupported cross-section move feature | Jobs/CV/device reviewer; M03/M06/M12 | Actual hardware/pointer/selection/cancel/default-drop evidence and accessible equivalents; preserve source/sibling/title/order/no-write. Cross-section entry movement is not an implemented feature to invent. |
| **RD19 `followMode` — approved metadata-only deferral.** Query retention repaired; no compose-mode consumer. Connor's 2026-10-07 decision preserves metadata and defers UI to mail phase. | **C** | Mail/route owner; authorized mail-phase design | Retain query/history regressions now; future explicit reviewed compose context, draft/source/entitlement/no-send/uncertain-delivery acceptance. Do not claim mode activation or generation/send from this parameter. |
| **RD20 P5-05 / NEW-10 quick preview and future product scope — explicitly deferred/reserved.** Phase 7 full Career/library/Documents/mail/Settings/Admin/Notifications; Phase 8 dashboard order/resize/reset/cross-device persistence; NEW/OD contracts remain separate. | **C** | Product/domain owners; authorized future-phase scope decision | Accepted data/ownership/route/privacy contract and separately approved implementation/evidence. Preserve existing capabilities/routes now; no fake quick-preview, global AI/chat, favorite/goals/admin metrics/integration. |
| **RD21 profile/job stale saves and creation-intent idempotency — OPEN, distinct from CV revision/account isolation.** Scoped CV expected-version/history/draft recovery is passing locally; no automatic B07. | **D** for unchanged local UI; **B/A** if changed or relied-on workflow risks overwrite/duplicate production data | Domain/backend integrity owner; separate concurrency/idempotency task before expansion | Actual two-client source revision and no-overwrite/latest-state proof for profile/job; duplicate creation-intent/request proof separately. Do not use B02 identity or CV success to close other entities. |
| **RD22 worker survival F20 / durability — OPEN conditional feature gate.** AI worker disabled by default; enabled loop lacks outer unexpected DB recovery. Other worker gates/configuration must be inspected, not assumed disabled. | **D** while disabled; **A** before enabled production/new producers | Operations/backend owner; before worker enablement | Intended gate state, isolated unexpected DB/provider outage with surviving/recovering worker, bounded retry/deadline/cancel/no-loss/duplicate safety and independent failure alert. No worker enablement here. |
| **RD23 calendar DateTime/offset/DST F21 — OPEN.** Unspecified values treated as UTC; deadline/follow-up export links retained, no new interview scheduling. | **D** unchanged; **B/A** before calendar semantics change/claim | Calendar/backend owner; dedicated offset/DST qualification | Actual source/output offsets across DST boundaries, all-day/timed intent and export/provider readback; explicit timezone contract and regression. Mock navigation is not provider calendar correctness. |
| **RD24 billing/deletion/retention/provider cleanup — configuration/policy proof pending.** Stripe recurring price/portal/webhook/secrets; deletion tombstone retention/legal holds/provider purge/restore policy unaccepted. Gates remain disabled as intended; current runtime gate state needs inspection. | **D** + **A** before activation (not an approved implementation pass) | Product/legal/operations/billing owners; separately authorized activation/restore rehearsal | Approved policy, protected complete recovery keys/tombstones, sandbox lifecycle/cleanup/replay and live configuration proof without secret disclosure. Keep account deletion/billing activation out of P5-15; production exposure unexpectedly enabled is a stop condition. |
| **RD25 provider mail/AI/calendar/OAuth/signup — partial local proof.** Mocks/local HTTP tests do not certify live delivery, reconnect, email verification, Turnstile, uncertain send, real model or external calendar. | **D** unchanged presentation; **A** configured required production/auth paths or before changed provider behavior | Provider/auth + operator; authorized sandbox/existing-account smoke | Explicit provider/session consent, real configured test accounts, identity/privacy/no-loss/no-duplicate/uncertain-delivery and recovery evidence. Never auto-resend uncertain delivery. P5-13 factuality gate remains separate. |
| **RD26 legacy Job/Application cutover — OPEN contract stage.** Compatibility dual writes/reads/columns remain; no drop authorized. | **D** current compatibility; **A** before schema cutover | Database/domain owner; restored-production expand/verify/contract checkpoint | Four read-only reports in [migrations](../../../database/migrations.md#production-cutover-validation) return zero in production and fresh restore; old-client requirement reviewed, one observation release, then separately approved later migration and rollback proof. |
| **RD27 monitoring/alerts/recovery operations — current coverage UNVERIFIED.** Container logs bounded to three 10MB files; centralized aggregation not configured. Health/ready, backup age, worker failures and delivery signals need actual owner/action evidence. | **A** for required release failure detection/recovery; **D** centralized sink until need proven | Operations owner; pre-release alert/runbook exercise | Sanitized alert routing/ownership, stale-backup/worker/provider failure and health/readiness failure drill on isolated target, retained failed deployment status/logs, recoverable incident record. Central aggregation only if incident/multi-host needs justify it. |
| **RD28 evidence boundaries — preserve scoped closures.** Original unnamed-target/preview-keyboard/Tooltip/mobile shell/status/date/query/package/CV revision fixes have successor proof, not universal certification. Settled-transition capture waits and historical NB missing glyph/cropped/blank-tail captures remain finite. | **D** record quality; **B** if only evidence for mandatory acceptance is deficient | Test/UI reviewer; authorized P5-15 evidence collection | Capture before axe where necessary, DOM/text and native content assertions, full viewport/start/focused scroll; retain failures and exact actual/expected outcomes. P2-D01 is ordinary passing now; no expected-failure resurrection. TS2571 is not current debt. |
## Investigated 500 path and limits
This checkpoint inspected the current callers and controllers without running them:
- [I18nProvider](../../../../job-tracker-ui/src/i18n/I18nProvider.tsx) `setLanguage` calls `applyLanguage` (React state, local storage and document language), then PUTs `/auth/preferences/language` with `.catch(() => undefined)`. [AuthController](../../../../JobTrackerApi/Controllers/AuthController.cs) reads the current user, validates EN/NB, mutates `UiLanguage` and calls `UserManager.UpdateAsync`; ordinary unsuccessful Identity results become 400. The recorded generic 500 can therefore be an exception, but the trace does not prove which one. An exception through the same Identity store as notifications is a hypothesis, **not** a confirmed SQLite root cause.
- [NotificationSettingsController](../../../../JobTrackerApi/Controllers/NotificationSettingsController.cs) reads/mutates the current Identity user and calls `UpdateAsync`; an unsuccessful result returns 500, and prior diagnostic exceptions are specifically SQLite error 5 through `UserStore.UpdateAsync`. [SettingsView](../../../../job-tracker-ui/src/components/SettingsView.tsx) preserves the draft and sets an in-page error on failed PUT. Waiting for PUT before polling readback protects sequential fixture correctness; it does not repair concurrent server locking.
- [RulesController](../../../../JobTrackerApi/Controllers/RulesController.cs) has read-side get/create plus PUT save; its create-race catch detaches/reloads only when another settings row exists. [RulesSettingsCard](../../../../job-tracker-ui/src/components/RulesSettingsCard.tsx) leaves draft in place and reports failed save through toast. Neither proves the cause of P2-O01 or durable AT-visible failure.
No root cause was invented, provider equivalence assumed, retry added or failure downgraded to visual-only. Actual deployed provider/configuration and concurrent endpoint behavior must be verified before treating these as release-safe. A later runtime investigation can change classification with proof; this plan cannot.
## Production readiness operator checklist — prepared, not executed
Use [current deployment](../../../infrastructure/deployment.md), [backups](../../../infrastructure/backups.md), [disaster recovery](../../../infrastructure/disaster-recovery.md), [migrations](../../../database/migrations.md), [monitoring](../../../infrastructure/monitoring.md), [configuration](../../../configuration/environment-variables.md), [deploy script](../../../../deploy/deploy.sh), [protected workflow](../../../../.gitea/workflows/ci-deploy.yml) and the [B06 exact safe handoff](../../../_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b06-completion.md#required-deployment-verification--exact-safe-procedure). The historical first-deployment runbook is supplementary; current G-RELEASE gates take precedence over its older migration/runtime claims.
All items below are **NOT EXECUTED / NOT VERIFIED**. Commands are for a later authorized operator task, not this documentation checkpoint. `VERIFIED_*` names and `/operator-approved/*` paths are safe placeholders: replace privately from verified inventory/session, never guess a host/user/key/password. Read secret-bearing output locally and record only allowlisted non-secret facts, hashes/counts and outcome; do not paste live `.env`, rendered Compose environment, full container inspect, cookies, tokens, private text or provider payloads. Every shell command is RTK-prefixed; if the approved Linux host lacks RTK, arrange the approved equivalent separately rather than implicitly installing tooling.
1. **Establish target and authorization.** Confirm the current candidate SHA/branch, production `main`, protected workflow/runner policy and explicit release authority. A successful `main` push deploys automatically; preserve NO-GO until pre-release items pass. Establish an operator-approved session using existing protected deployment credentials, without copying them into notes. Record current backend/frontend images/version/SHA, app/company counts and fallback/feature gates before replacement. Do not run `deploy.sh` for inventory.
```bash
rtk proxy bash -lc 'cd /opt/job-tracker/app && git rev-parse HEAD'
rtk proxy bash -lc 'cd /opt/job-tracker/app && docker compose --env-file /opt/job-tracker/shared/.env -f docker-compose.yml ps'
rtk proxy docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}'
```
Privately confirm actual provider/connection, canonical origin, auth-required/verification/registration/OAuth configuration, precise ingress peers and all worker/deletion/billing/external-AI gates. Record presence/custody/rotation evidence for secrets, not values. Confirm no unqualified CV proposal path is accidentally deployed/enabled. **Exit:** current baseline and intended configuration known; no F19 fallback masquerading as valid empty data.
2. **Validate configuration securely; inspect actual ingress boundary.** The existing validator consumes rendered production Compose without printing environment. Its pass is only repository configuration proof. Read generated nginx configuration, actual Traefik configuration/placement/network and trusted forwarding locally; inspect host/provider firewall, Docker NAT/FORWARD and IPv6 separately. Obtain actual socket peer through the handoff's bounded SYN-only namespace capture while controlled health requests run. If trusted/untrusted paths share a NAT source, stop and review binding/firewall/dedicated proxy topology.
```bash
rtk proxy bash -lc 'cd /opt/job-tracker/app && docker compose --env-file /opt/job-tracker/shared/.env -f docker-compose.yml --profile bundled-ollama config --format json | python3 scripts/validate-ingress.py'
rtk proxy sudo ss -lntp
rtk proxy sudo nft list ruleset
rtk proxy sudo iptables-save
rtk proxy sudo ip6tables-save
rtk proxy docker network inspect jobtracker_shared --format '{{json .IPAM.Config}} {{json .Containers}}'
rtk proxy docker exec VERIFIED_FRONTEND_CONTAINER nginx -T
rtk proxy sudo nsenter -t VERIFIED_FRONTEND_PID -n tcpdump -nn -i any -c 10 'tcp dst port 80 and (tcp[tcpflags] & tcp-syn != 0)'
```
Use only installed applicable firewall tools; unavailable tools require equivalent operator evidence. **Exit:** actual trust source/network/listener/firewall/NAT proof, no backend/AI/Ollama public exposure and no trust-all workaround. These inspection commands do not authorize network changes or restart.
3. **Verify external DNS/TLS/redirect/direct/spoofed paths.** On an independently controlled external machine, verify every current A/AAAA address and actual hostname; keep TLS validation enabled. Inspect the effective API client IP/scheme/host with flow/configuration evidence; a public auth-config 200 alone cannot prove header sanitization. Repeat IPv6 with bracketed direct addresses and `-6`; do not infer it from IPv4.
```bash
rtk proxy dig VERIFIED_CANONICAL_HOST A
rtk proxy dig VERIFIED_CANONICAL_HOST AAAA
rtk proxy curl --max-time 10 -sS -D - -o /dev/null https://VERIFIED_CANONICAL_HOST/api/auth/config
rtk proxy curl --max-time 10 -sS -D - -o /dev/null https://VERIFIED_CANONICAL_HOST/api/auth/config -H 'X-Forwarded-For: 198.51.100.10' -H 'X-Forwarded-Proto: http' -H 'X-Forwarded-Host: attacker.example.test'
rtk proxy curl --max-time 5 -sS -D - -o /dev/null http://VERIFIED_PUBLIC_IP:3000/api/auth/config -H 'Host: VERIFIED_CANONICAL_HOST' -H 'X-Forwarded-For: 198.51.100.10' -H 'X-Forwarded-Proto: https'
rtk proxy curl --max-time 5 -sS -o /dev/null http://VERIFIED_PUBLIC_IP:5202/health
rtk proxy curl --max-time 5 -sS -o /dev/null http://VERIFIED_PUBLIC_IP:8080/health
rtk proxy curl --max-time 10 -sS -D - -o /dev/null http://VERIFIED_CANONICAL_HOST/api/auth/config
```
**Exit:** canonical certificate/chain/hostname valid, HTTP redirects to a reachable intended HTTPS origin (the old `:444` failure rechecked), direct app/backend denied, spoofed edge metadata overwritten/rejected and actual identity verified. Probe only recorded app listeners, not unrelated services or production login limits.
4. **Take and inspect a fresh complete recovery set — separately authorized mutation.** Use the established backup-only script on the confirmed provider/configuration after operator approval. This mode also creates links/files, applies retention and may copy off-host; it is not a read-only preflight. Do not skip DB backup. Confirm DB format matches provider; pair matching stamp with files/CV/exports/Data Protection keys and separate tombstones, manifests/hash/freshness/custody/retention/encrypted off-host copy. Script permits absent tombstone volume at first deployment; that is not proof deletion/restore is safe.
```bash
rtk proxy bash -lc 'cd /opt/job-tracker/app && DEPLOY_BACKUP_ONLY=true bash deploy/deploy.sh'
rtk proxy ls -lt /opt/job-tracker/backups
rtk proxy gzip -t /operator-approved/current-recovery/database.sql.gz
rtk proxy tar -tzf /operator-approved/current-recovery/files.tar.gz
rtk proxy sha256sum /operator-approved/current-recovery/database.sql.gz /operator-approved/current-recovery/files.tar.gz /operator-approved/current-recovery/tombstones.tar.gz
```
Choose the actual MariaDB dump or SQLite archive, not the illustrative filenames above. Keep archive names/contents private if they identify users. **Exit:** verified manifest includes complete required artifacts and keys; gzip/schema/trailer checks are merely format proof, not restore proof.
5. **Restore current production recovery into an isolated target — separately authorized rehearsal.** Never point the restore client at production. Use an operator-created protected client-options file; no inline password. Restore DB plus owned files/keys and tombstones independently; boot the matching app in isolated equivalent topology. Verify table/application/company/CV/profile/history/frozen-package counts/content, exact attachment hashes, languages/non-ASCII, protected-provider-data decryption, and deleted-account tombstone replay after restart. Keep deletion disabled until policy/provider cleanup is approved.
```bash
rtk proxy bash -lc 'gzip -dc /operator-approved/current-recovery/database.sql.gz | mariadb --defaults-extra-file=/operator-approved/isolated-client.cnf --database=VERIFIED_ISOLATED_DATABASE'
rtk proxy mariadb --defaults-extra-file=/operator-approved/isolated-client.cnf --database=VERIFIED_ISOLATED_DATABASE --execute='SELECT COUNT(*) AS applications FROM JobApplications; SELECT COUNT(*) AS companies FROM Companies; SELECT MigrationId FROM __EFMigrationsHistory ORDER BY MigrationId;'
```
This example applies to MariaDB/MySQL only. SQLite uses the documented archive/backup path; choose the actual provider's isolated restore, preserving side files/keys. File/tombstone restore paths must be explicitly reviewed against the isolated target; this plan invents no volume names or destructive extraction command. **Exit:** actual restorable app/key/deletion semantics, not merely equal DB counts.
6. **Rehearse startup/schema and ingress failure paths in isolated equivalent Linux topology.** Verify current migration history/provider and guarded reconciler on the restored data, including repeated startup, non-empty counts and failure on invalid intended configuration. Preserve legacy columns/dual writes. Run the existing synthetic ingress probe only on an approved disposable engine with already-installed image; it is supplementary to real Traefik+app/Compose evidence.
```bash
rtk proxy python3 scripts/test-ingress.py
rtk proxy python3 scripts/test-ingress-topology.py --image nginx:1.29.8-alpine
```
Execute the four read-only [production-cutover SQL reports](../../../database/migrations.md#production-cutover-validation) on current production and isolated fresh restore only when authorized; retain all four zero results. No column drop/reset/history edit follows. **Exit:** required startup/schema/restart proof; actual-chain B04 A/B budgets and B02 sessions verified without consuming live login quotas; no missing-config fallback data accepted.
7. **Rehearse release failure and code/image rollback before release.** On disposable equivalent Linux topology with restored synthetic/current authorized data, retain prior backend/frontend images and protected configuration; run the established script under a reviewed deliberate post-replacement failure. Capture its nonzero exit/failed CI, automatic restoration of both previous images, app/key/file/tombstone preservation and after-rollback health/login/count smoke. There is no documented one-flag failure-injection shortcut; agree the injection with the operator instead of inventing one. Database rollback is separately required only if data/schema is the confirmed problem. **Exit:** recoverable prior release and a failed deployment that remains failed; logs/manifest preserved, no silent retry-deploy loop.
8. **Complete protected CI and authorize release only after critical exits.** Collect the candidate's protected test/browser results, runner/branch policy and relevant [P5-14 baseline](../p5-14/README.md#final-validation--2026-10-09) preservation checks without changing assertions or retry/skip accounting. A CI pass alone does not clear RD01–04/06–10 or enable deferred features. Operator records explicit scope, candidate SHA, NO-GO/conditional exclusions and rollback readiness; only then can a separately authorized history-preserving main merge/push trigger deployment. No release command is supplied or executed by this plan.
9. **Verify deployed outcome and authenticated owner/data workflows.** Record actual workflow/deploy status, matching SHA/image/version, healthy containers and canonical health/readiness/auth config; health does not establish login or data preservation. Confirm anonymous private API remains 401. Use existing approved accounts through the browser, keeping credentials out of notes: A/B isolation, existing counts, Companies/Career languages, Dashboard/Analytics/Jobs/Table/Board/workspace, ordinary CV editing/history/templates/preview/private/public PDF and existing attachment. Verify intended-provider locale/notification/rules persistence, including scoped concurrency diagnosis, and expected Production CV proposal unavailability. Providers/registration/Turnstile/email/OAuth require separately approved dedicated test accounts; record uncertain delivery without auto-resend.
```bash
rtk proxy curl --max-time 10 -fsS https://VERIFIED_CANONICAL_HOST/health
rtk proxy curl --max-time 10 -fsS https://VERIFIED_CANONICAL_HOST/ready
rtk proxy curl --max-time 10 -fsS https://VERIFIED_CANONICAL_HOST/api/auth/config
rtk proxy curl --max-time 10 -sS -o /dev/null -w '%{http_code}\n' https://VERIFIED_CANONICAL_HOST/api/jobapplications
```
**Exit:** SHA/version and existing owned data match, auth/session boundary and actual user journeys pass; failures trigger the rehearsed decision. P5-13 remains unqualified even if the unavailable guard passes.
10. **Verify monitoring and failure handling.** Record operator-owned health/ready/container, backup freshness/manifest, worker and provider delivery signals plus alert response/runbook. Exercise stale-backup, failed-ready, disabled/unavailable provider and worker failure in isolated target, ensuring actionable failure/no data loss/no duplicate delivery, without enabling production workers. Keep failed-deployment evidence/logs and confirm three×10MB local log retention; assess an external sink only if justified. **Exit:** a named operator can detect/respond/recover; prepared probes or unconfigured alert ideas are not evidence.
## Decision boundary
The next authorized local acceptance task can execute the manual plan and appropriate regression evidence for implemented screens. It cannot declare deferred P5-13 complete, substitute screenshots/emulation for human/device proof, fix unrelated backend/operational debt implicitly, or perform G-RELEASE. Production remains **NO-GO** while A gates are unresolved; full Phase 5 remains **CONDITIONAL / PARTIAL** while B obligations remain. Approved C exclusions permit only their documented bounded scope. D rows stay open until their trigger and exit proof are reconciled.
+93
View File
@@ -0,0 +1,93 @@
# P5-15-00 — Phase 5 final acceptance planning
**Planning only — Phase 5 is not complete; Production remains NO-GO.** Reviewed 2026-10-09 from `46a0c0c6d23464869f50c0d88552963c29cfdacf` on `codex/ui-redesign-phase4`. Actual production branch is `main`, with automatic deployment on push; its inspected revision is `27657f31131cd95d42f0e1290853ec9c9b3959a4`. No application/test/CI/schema/configuration changes, deployment, production access, provider qualification, Docker recovery, P5-13 UI or B07 work belongs to this checkpoint.
This package audits the implemented product and prepares the remaining acceptance work. It does **not** rerun the application baseline or turn the P5-14 conditional verdict into full acceptance. Static source/commit/evidence checks and documentation hygiene are new planning evidence; reported regression/visual results below remain explicitly inherited.
## Acceptance package and authority
| Record | Purpose |
|---|---|
| [Slice inventory](SLICE_INVENTORY.md) | Every planned slice, verified implementation commit/current capability/test presence, readiness successors and plan discrepancies |
| [57-group acceptance matrix](PRESERVATION_ACCEPTANCE.md) | Complete original contracts, implemented touch, automated/manual/visual/responsive/localisation evidence, remaining action, severity and owner |
| [Route and navigation acceptance](ROUTE_ACCEPTANCE.md) | Original 31 patterns versus current 32, compatibility/query/permission/entry limits and runtime audit tasks |
| [Manual accessibility/responsive script](MANUAL_ACCEPTANCE.md) | Actual axe incomplete categories, practical human/screen-reader/device/zoom tasks and evidence requirements |
| [Debt and production-readiness register](READINESS_DEBT.md) | A/B/C/D classifications, known failures, safe executable operator checklist and release conditions |
| [Numbered execution plan](EXECUTION_PLAN.md) | Bounded P5-15-00–06 scopes, dependencies, tests/evidence, exit criteria and immediate commit/push boundaries |
Sources remain [Phase 1 full functionality](../../audit/FUNCTIONALITY_INVENTORY.md) and [routes](../../audit/ROUTE_MAP.md), [Phase 2 preservation](../../phase-2/PRESERVATION_MATRIX.md) and [traceability](../../phase-2/TRACEABILITY.md), [Phase 3 architecture/impact](../../phase-3/README.md), [Phase 4 completion and conditional gates](../../phase-4/p4-06/README.md), [approved Phase 5 plan](../PHASE5_PLAN.md), [visual protocol](../VISUAL_ACCEPTANCE.md), every linked implementation/readiness successor, [production assessment](../production-release-decision/README.md), [P5-13 deferral](../OPEN_BLOCKERS.md#p5-13-deferred-debt-and-return-conditions--2026-10-08) and [P5-14 final source/evidence](../p5-14/README.md). Later approved, evidenced successors govern current status; original failed/historical records remain intact.
**Status meanings:** PASS means only the precisely named criterion has adequate evidence at its declared source/runtime. PARTIAL means some criteria have evidence but mandatory scope/proof remains; FAIL means demonstrated behavior contradicts the criterion; DEFERRED requires an explicit approved exclusion, not merely missing evidence; NOT VERIFIED means evidence is absent or inadequate. A test file's existence is an anchor, not an execution. Missing tests do not prove failure. A successful mocked/local test cannot satisfy a human, real provider, physical-device or production criterion.
## Inventory decision
Implementation checkpoints exist for **P5-00, 01, 02, 03, 04a, 04b, 06, 07, 08a, 08b, 09, 10, 11 and 12**; **P5-14** is a completed **conditional subset** checkpoint for implemented P5-09–12. The exact commits and current implementations are independently reconciled in [SLICE_INVENTORY](SLICE_INVENTORY.md), rather than inferred from chronology.
In particular, **P5-11 `673cff114546a0976ae01ca9ca0d1086d36fee6a`** changes real preview chrome/readiness/fit/return behavior and adds owner/native browser evidence; **P5-12 `d8d262e4d1a6223f4b6c5fa52b8419013a929d35`** changes the real gallery/settings grouping, retains advanced controls and adds six frontend/four browser cases plus eight settings exports. Both commits are ancestors of this source and their components/tests/evidence remain present. Neither is accepted merely because P5-14 passed. Manual/device/font and combinatorial settings limits remain.
**P5-05 is deliberately reserved/deferred**, not a missing completed ticket: a new active quick-preview host is an unapproved new workflow. **P5-13 is unfinished/deferred**, despite completed deterministic safety work and release withholding. **P5-15 is planning in progress**, with no final acceptance verdict. Broader Career Profile, CV library, global Documents, mail, Settings/Admin and Notifications presentation migrations remain Phase 7; advanced Dashboard ordering/resizing/reset/persistence remains Phase 8. Their existing protected capabilities still require preservation review, even though this phase does not redesign those pages.
## Workstream acceptance summary
This table summarizes **current acceptance**, not implementation percentage. The linked 57-row matrix carries the complete original sub-workflows and per-group routes/components/evidence/owners. Existing screenshot/browser evidence is finite; human/device evidence is not supplied by this planning session.
| Workstream / planned criterion | Current implementation; routes/components/PRES | Automated evidence | Visual / accessibility / responsive / locale evidence | Status; remaining action, severity/owner |
|---|---|---|---|---|
| Five shell readiness gates and grouped navigation; all existing destinations accessible | Existing App/AppShell navigation/providers/collapse retained; `/settings`, Jobs and all authenticated entries; E07–E09/A01–A03/S03 | P5-00/01 shell, active-nav, dirty/account/permission fixtures retained | Recorded expanded/rail/drawer, EN/NB × themes, 320px/boundary keyboard and long-admin evidence | **PARTIAL** full acceptance; bounded implementation proof present. Current route/control traversal plus human names/focus/zoom needed; high if navigation inaccessible; shell/accessibility owner, 01/02 |
| Command/notification utility semantics, no unintended mutation or stale account data | QuickCommandDialog/NotificationsPopover/App; existing destinations and `/operations`; E07–E09/S02/W11/W12 | P5-02 keyboard/IME/query cancellation/read-dismiss/no-write and account regressions | Recorded populated/empty/error/focus and phone four-pair evidence; broader spoken names/live announcements absent | **PARTIAL**; mandatory P5-02 manual screen-reader item, command entry timing and transient feedback review; high interaction risk, 02/04 |
| Jobs Table/mobile, paging/saved filters/selection/Trash/density/Back | JobTable/JobsView and `/jobs`, `/trash`, `/jobs/:id`; J03–J07/W01/W02/S03 | P5-03, density and integration cases; native Back/query/row focus; owner/server read tests | Recorded Comfortable/Compact, light/dark EN/NB, populated/empty/error, desktop/tablet/phone cards | **PARTIAL** full edge/AT/device acceptance; audit current saved-view/bulk failure/control actions and return semantics; high preservation risk, Jobs owner 01/02 |
| Board native/keyboard alternatives, exact custom statuses and complete same query | KanbanBoard/shared Jobs query; `/jobs?view=board`, `/kanban`; J05–J07/W01/W02 | Readiness ID-membership/owner/trash tests, native pointer/keyboard/failed move and alias integration | P5-04a/b recorded desktop/phone/theme/locale/scroll evidence; native physical touch absent | **PARTIAL**; larger-result request/memory review and actual device/no-drag usability; potential medium/high scale/device impact, Jobs owner 01/02/04 |
| Personal Dashboard honest available metrics/actions/five flags | DashboardView/shared existing reports; `/dashboard`; S01/S02/E07–E09/W11/W12 | P5-06 report/definition/error/owner-local tests and native browser readback | Real populated/sparse/empty/error, value alternatives, EN/NB/themes/desktop/tablet/phone records | **PARTIAL**, preference-save 500 remains a recorded failure needing provider/concurrency/root-cause triage, not cosmetic acceptance; high reliability if reproducible; report/auth-storage owner 04 |
| Analytics existing report families, exact definitions/sample/period and safe drill-down | Shared reports + AnalyticsPage; `/analytics`; S01/S02/J05/J09/E07–E09 | P5-07 period/query/exact-value/independent-error regression evidence | Existing 6/12/24/current/all-time distinctions, sparse/custom categories, exact tables and four-pair responsive records | **PARTIAL** full AT/category/provider/timezone acceptance; current metric limits retained, no invented new denominators; report/accessibility owner 01/02 |
| Job header/Overview actions/status/dates and safe section entry | ApplicationWorkspacePage/progress/detail; `/jobs/:id`, `/applications/:id`; W01/W02/W03/J05–J07/E07–E09 | P5-08a real detail/status/missing/foreign/Back plus targeted progress keyboard cases | Recorded long/sparse/custom/interview/deadline states and theme/locale/phone reflow | **PARTIAL** full role/long-content/menu/SR review; no new job mutation semantics; high if an existing action is lost, workspace owner 01/02 |
| Deeper sections/native frozen packages/documents/notes/tasks/timeline/mail/interview | Seven canonical URL sections and legacy text aliases, plus numeric navigation-helper arguments; retained domain children; W01–W12/M01/M02/M04/M05/C05–C12 | P5-08b readiness native ZIP/immutable/readback/ownership, current ordinary P2-D01 and section/dirty/history proof | P5-08b recorded populated/empty/frozen/document scroll/phone; generated English events in NB and manual dialog semantics remain | **PARTIAL**; all-child action and external/provider/AT proof; `followMode` metadata preserved but compose UI **DEFERRED**, mail owner. High package/navigation boundary, 01–03 |
| CV frame/navigation/save/history/undo and separate named editor/preview | CvBuilderEditor, identified route `/career/builder/:id`; C05/C06/C10/C12/E07–E09 | P5-09 frame tests + revision readiness, current P5-14 draft/focus/conflict recovery | Four-pair local native viewport/mode/long-section evidence; human/device/zoom gaps | **PARTIAL** complete acceptance, implemented frame proven locally; current controls/reflow/assistive technology needed, CV owner 01–03 |
| Source/override/CV-only/omitted content, reset/order and safe revisions | Existing canonical profile plus selected CV settings lens; `/career`, editor; C01/C02/C06/C07/C10/W05 | P5-10 source/sibling/reset/save tests; P5-14 four nested owner/default-drop cases and native persisted order | Recorded inherited/custom/hidden/edit/error states, phone named alternatives, EN/NB/themes | **PARTIAL** all long-tail entries/manual scope understanding; P5-10-O01 closed only for tested gesture ownership. No whole-container dimming; high data-boundary risk, CV owner 01–03 |
| Preview chrome, independent busy/error/retry/fit/count/keyboard scroll | Existing native HTML/iframe renderer + preview pane; C06/C08–C10/C12/E08/E09 | **Independent P5-11** focused owner/native tests plus final fidelity/scroll suites | White output in dark surround; one/multi/long pages, fit and return captures; P5-14 shell/landscape corrections | **PARTIAL** complete AT/device/zoom/production qualification; no manual zoom/fullscreen workflow is implied; CV/rendering owner 02/03 |
| Template/appearance/layout controls retain all supported IDs/fields/default/reset | CvCustomizeTab/CvTemplateGallery, same settings/renderer; C06–C10/C12/E08/E09 | **Independent P5-12** controls/Pro locks/reset/value-preservation tests and **8 exports/24 aligned pages** | Recorded Template/Style/Layout/Advanced controls, invalid input/reset/menu focus and four theme/locale pairs at desktop/tablet/phone | **PARTIAL** finite combinations/AT/production fonts/photos; some saved-only dormant values are not new controls. Document controls owner 02/03 |
| Revision/override/frozen package and authoritative PDF correctness | Current API revision/CV settings and native package/PDF owners; C01/C05–C12/W05/W07/E09 | Bounded **5/5 revision; 16/16 standard, 36=36; 8/8 settings, 24=24**, native package/P2-D01 and ownership | Inherited local measurements/comparisons at fixed tolerances; Linux deployment/font/photo/wrapped-line combinations unqualified | **PASS for those exact local oracle cases; PARTIAL overall.** Preserve historical settings semantics versus frozen archived bytes, not an invented profile snapshot; critical document correctness, CV/native owner 03 |
| CV AI factuality, proposal/review/apply and full responsive journey | Deterministic API guards implemented; Production service withheld; review UI not migrated; C11/C07/C10/S04 | 108 focused backend subset, sidecar49, realHTTP2; stale/tenant/history isolation retained | **0/366 real configured-model calls, 0 human reviews, semantic accuracy unmeasured; new UI/missing AI responsive evidence absent** | **DEFERRED / NOT QUALIFIED**; full planned Phase 5 blocked. No qualification/recovery/UI/activation here; product+AI owner only after a separate instruction |
| P5-14 responsive implemented CV subset | Same editing/settings/preview owners; C05–C12/E07–E09/S04 | +4 frontend/+5 browser journeys; retained conflict/latest source/native renderer | 33 selected captures, 320–1440px and short landscape; real mouse and emulated taps, four pairs | **PARTIAL / CONDITIONAL GO for P5-09–12 only**; physical/software-keyboard/SR/zoom/font and missing P5-13 journey remain, 02/03 |
| Non-migrated original auth/security/account/Career/library/mail/Settings/Admin/capture/import/export | All original entries/owners retained; remaining E/J/C/M/S/A groups in 57-row matrix | Existing unit/service/native/security suites and original route census | Shared foundations affect these surfaces; some local representative Settings/canonical/public/Admin evidence, not all journeys | **PARTIAL / NOT VERIFIED where missing evidence**; unchanged code is not automatic acceptance. Provider/operator/low-frequency UI audits 01/02/05 |
| Production ingress/recovery/config/schema/rollback/CI and actual auth/tenant health | Current `main` and existing deployment/backup mechanisms | Local security/config tests pass **historically**, not deployed proof | Required current operator/infrastructure verification missing | **NOT VERIFIED — Production NO-GO**; release-critical high/critical, operator+release owner 05; no push/deploy |
## Preservation, route and design reconciliation
All **57 original PRES groups** remain required: 9 E, 10 J, 12 W, 12 C, 6 M, 5 S and 3 A. The [matrix](PRESERVATION_ACCEPTANCE.md) maps every group without redefining its full original row. Mapping completeness is not behavioral coverage. Account identity/Career Profile/CV/frozen package/send-attempt remain separate authorities; a scope label does not enforce ownership.
Current static routing has **35 declarations / 32 concrete patterns**, preserving all **31 original patterns** and adding `/analytics`. `/kanban` is now a compatible Board alias; `/applications/:id` and correspondence-review aliases retain their actual documented semantics. Static path presence does not prove entry/redirect/hash/dirty/history/permissions. The [route audit](ROUTE_ACCEPTANCE.md) lists explicit limitations and runtime checks. No actual `/career/profile`, global `/documents`, full `/notifications` or aggregate `/admin` destination is inferred from proposal/historical prose. Low-frequency destinations must remain reachable through existing primary/secondary/account/command/context paths.
Current known discrepancies require reconciliation, not invented features: historic blocked 04b and P2-D01 expected-failure text are superseded; `followMode` has an approved metadata-only exception; historical CV settings are not a full canonical Career Profile snapshot; manual preview zoom/new quick preview/global Documents/new metrics/customisation are separately proposed work. The existing P5-12 template reset/default/capability contract governs actual controls, even where a Phase 3 recommendation described different future UX.
Acceptance also compares cross-screen hierarchy, semantic surfaces/focus, P4 page widths/gutters/typography/section rhythm, table density/statuses/filters, action/menu/form/tab/dialog consistency, information density and dark mode. Retain actual useful data/actions rather than hiding controls to obtain cleaner screenshots. The [visual protocol](../VISUAL_ACCEPTANCE.md) defines representative states and dimensions, not a mandate for a new component system or final branding decision.
## Accessibility and responsive decision
P5-14 retains **242 axe scans, zero reported violation entries and 1,839 incomplete target occurrences**: contrast 1,574; hidden-focus 34; prohibited ARIA 209; invalid ARIA values 18; table header/data association 4. These are repeated observations across states, not 1,839 distinct defects and not passing checks. [MANUAL_ACCEPTANCE](MANUAL_ACCEPTANCE.md) classifies exact rule/context handling, potentially serious traps/names/state/header failures, browser/iframe/transition limitations and required human visual/assistive-technology proof.
Existing native keyboard and screenshot review passes are evidence for their declared tasks. **No suitable human screen-reader review, real-device/software-keyboard acceptance, actual 200%/400% browser zoom/forced-colours/text-spacing or production font/photo qualification is newly supplied here.** Those remain NOT VERIFIED. Review commands/notifications, all mobile navigation, Board alternatives, charts/exact values, Job sections/dialogs, CV scope/settings/mode/focus/scroll/conflict and Settings, including loading/error. Emulated taps are not physical-device proof. Device/AT absence does not allow an agent to self-certify.
## Production and debt decisions
**Production stays NO-GO.** Missing F04 actual proxy/socket peer/trust/IP/firewall/NAT/IPv6/DNS/TLS, current complete backup/isolated restore, real provider/config/schema/keys and tested rollback are A-class release blockers. Protected remote CI/deployment revision/authenticated owner smoke and operational monitoring/failure recovery also require actual proof. Read-only preparation or scripts' presence does not establish verification. [READINESS_DEBT](READINESS_DEBT.md) assigns A/B/C/D classifications, severity/owner/evidence to every retained issue and gives an executable operator sequence. No production endpoint is contacted by this plan.
Preference-save HTTP 500, SQLite concurrent saves, silent language-save failure, company-modal inaccessible feedback and dialog/command focus observations need bounded impact/root-cause investigation; this plan does not close them after a successful rerun. Board scaling/native touch, calendar/DST, startup fallback/worker containment, billing/deletion/provider delivery and all other recorded debt retain their specific enablement/release boundaries. P2-D01 is **closed/ordinary passing**. Tested shell/tooltip/toast/nested drag fixes remain scoped closures, never universal certification.
**P5-13 remains DEFERRED — BLOCKED / NOT QUALIFIED.** The frozen 32-case corpus/rubric and 366 required uncached generation/evaluation calls stay unchanged; configured deployed identity and semantic correctness remain unverified, zero human reviews, review UI unfinished. Deterministic grounding/source-version/tenant/no-write/history guards protect the authoritative API; they cannot replace model/human qualification. Production `503 cv_ai_unavailable` withholding before provider/write stays active, and unrelated AI remains subject to its existing operational/privacy boundaries. Future qualification/UI/activation each needs its separate instruction/decision; none starts during P5-15-00.
## Execution and verdict rules
The proposed checkpoints are **00 inventory → 01 functional/preservation → 02 responsive/accessibility → 03 CV/document correctness → 04 debt triage/individual remediation → 05 production evidence → 06 final regression/decision**. Their entry/exit criteria, dependencies, test commands, reviewer/operator tasks and immediate commit/push boundaries are in [EXECUTION_PLAN](EXECUTION_PLAN.md). Infrastructure/manual packet preparation can proceed independently; missing evidence cannot be recast as a pass. Each completed logical fix/evidence checkpoint is separately pushed and its SHA recorded before proceeding.
- Implemented product scope receives its own explicit PASS/PARTIAL/NO-GO decision, describing finite coverage and approved exclusions.
- **Original full Phase 5 acceptance cannot be unconditional GO** with mandatory P5-13 and human/device/other acceptance requirements incomplete. Deferral records obligations; it does not fulfill them.
- Production receives a separate **NO-GO** until actual A-class evidence passes. A later GO assessment and separate owner authorization are required before any production merge/push/deployment.
- Any demonstrated preservation/security/revision/frozen-output regression blocks its affected scope and release as appropriate. Missing evidence stays NOT VERIFIED; do not average it away or mask it with retries, tests or screenshots.
## Baseline and planning validation
Inherited from P5-14: **1,023 backend; 459 frontend; 117 actual browser; 49 sidecar; 108 focused AI and 5 revision cases (backend subsets); 2 real HTTP; 9/6/1/3 rate-limit/ingress/PDF/config; 16/16 with 36=36 pages; 8/8 settings with 24=24 pages**. App/E2E TypeScript, lint, frontend production/API/test Release builds, security/secret/whitespace/document checks have inherited passing records. **No application suite, new rendered UI inspection, live-model test or production verification is claimed fresh for this planning-only checkpoint.** Count changes: zero application/test changes and no new cases.
Planning validation checks exact source ancestry/path/test/evidence presence, all 57 unique IDs, original/current routes, inherited axe/fidelity/count reconciliation, local links/anchors, Markdown tables/fences, source-tree unchanged, staged secret/whitespace and development remote/tree state. Its sanitized [planning check record](PLANNING_CHECKS.json) distinguishes these new static checks from inherited regressions. The SHA is the commit introducing this package, obtainable from the command in the execution plan and the checkpoint's final report; no self-referential fabricated hash is stored.
**Stop after committing and pushing P5-15-00 for review.** No P5-15-01 implementation, production deployment, P5-13 work, B07 or next redesign phase starts automatically.
@@ -0,0 +1,123 @@
# P5-15 route and visible-action acceptance plan
Planning checkpoint: **`46a0c0c6d23464869f50c0d88552963c29cfdacf`**, branch `codex/ui-redesign-phase4`, 2026-10-09. This is source characterization and a future audit plan. **No fresh route/browser/provider/manual checks have run; no acceptance or route-removal decision is made.** The [57-group matrix](PRESERVATION_ACCEPTANCE.md) retains every original sub-workflow.
## Original versus current census
The [original audited route inventory](../../audit/ROUTE_MAP.md) at Phase 1 contains **31 concrete patterns: 29 pages and two redirect aliases**. The [Phase 3 route/query plan](../../phase-3/ROUTE_PLAN.md), [Phase 5 navigation migration](../NAVIGATION_MIGRATION.md) and [release-candidate census](../release-readiness/PRESERVATION_REVIEW.md#route-census-and-compatibility) establish the compatibility chain.
Current [App routing](../../../../job-tracker-ui/src/App.tsx) declares **35 routes** across its outer data-router objects and inner `Route path` elements. Exclude outer `/*`, inner `*` and the duplicate inner `/` redirect infrastructure: **32 unique concrete patterns = all 31 originals + `/analytics`**. Current disposition is **29 pages and three redirects**: `/analytics` adds a page while original `/kanban` becomes a redirect to the integrated Board. The public outer LandingPage owns `/`; its private inner Dashboard redirect is not a second page. RouteErrorPage is an error boundary, not another pattern.
[P5-01](../p5-01/README.md) moved navigation entries while retaining original routes; [P5-04b](../p5-04b/README.md) introduced the integrated `/jobs?view=board` and legacy Board redirect; [P5-07](../p5-07/README.md) added meaningful personal `/analytics`. P5-08a/b and P5-09–14 enhance existing workspace/editor paths without adding concrete route patterns. Static presence proves declarations only; direct URL, refresh, Back/Forward, real permissions, dirty Cancel/Discard, safe errors and deployed health remain to be audited.
## Exactly 32 current concrete patterns
Every row is **PARTIAL** for route acceptance: current source plus linked historical regression exists, but fresh-current, provider or required manual checks remain NOT VERIFIED. No missing test is labelled a functional FAIL. Route columns characterize the actual current behavior rather than narrowing the original capability.
| Concrete pattern | Original/current disposition | Current actual owner | Query / action / compatibility semantics and limit | PRES scope | Historical regression anchors / remaining acceptance limit | Planning status |
|---|---|---|---|---|---|---|
| `/` | Preserved public page | [LandingPage](../../../../job-tracker-ui/src/views/LandingPage.tsx) | Public product/plans. Authenticated mount replaces to /dashboard; protected-route state is forwarded by login action. Query/capture/landing continuity is a future audit. | E01/E02/E07/E08 | [landing/auth redirect](../../../../job-tracker-ui/src/LandingPage.authRedirect.test.tsx), [landing](../../../../job-tracker-ui/src/landing-page.test.tsx); provider/mobile limits in E01 | **PARTIAL** |
| `/login` | Preserved public page | [LoginPage](../../../../job-tracker-ui/src/views/LoginPage.tsx) | Local/provider/challenge/configured registration controls; validates local state.from then replaces after sign-in. SessionChanged notice and reset-email prefill remain. | E02–E05/E09 | [login](../../../../job-tracker-ui/src/login-page.test.tsx), [smoke](../../../../job-tracker-ui/e2e/smoke.spec.ts); live auth/provider limits E02–E04 | **PARTIAL** |
| `/register` | Preserved public page | [LoginPage](../../../../job-tracker-ui/src/views/LoginPage.tsx) | initialMode=register, subject to configuration; uses the same safe post-auth target and provider/challenge boundaries. | E02/E03 | [login](../../../../job-tracker-ui/src/login-page.test.tsx), [local auth](../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs); configured/provider limits E02 | **PARTIAL** |
| `/forgot-password` | Preserved public page | [ForgotPasswordPage](../../../../job-tracker-ui/src/views/ForgotPasswordPage.tsx) | email prefill; explicit reset request. Runtime mail/configuration/browser completion remains unverified. | E02 | [local auth](../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs); complete browser/mail journey remains E02 gap | **PARTIAL** |
| `/reset-password` | Preserved public page | [ResetPasswordPage](../../../../job-tracker-ui/src/views/ResetPasswordPage.tsx) | email/token query; explicit password submit. Invalid/expired/already-used token and sensitive URL handling need acceptance. | E02 | [local auth](../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs); complete token submit/mail journey remains E02 gap | **PARTIAL** |
| `/verify-email` | Preserved public page | [VerifyEmailPage](../../../../job-tracker-ui/src/views/VerifyEmailPage.tsx) | userId/email/token query; verification outcomes remain under identity owner, not shell page placement. | E02 | [verification](../../../../job-tracker-ui/src/verify-email-page.test.tsx), [local auth](../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs); actual mail E02 | **PARTIAL** |
| `/confirm-email-change` | Preserved public page | [VerifyEmailPage emailChange](../../../../job-tracker-ui/src/views/VerifyEmailPage.tsx) | Same page in email-change mode; existing userId/email/token confirmation, independent from Career data. | E06 | [verification](../../../../job-tracker-ui/src/verify-email-page.test.tsx), [local auth](../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs); account mutation gaps E06 | **PARTIAL** |
| `/microsoft-legacy-relink` | Preserved public page | [MicrosoftLegacyRelinkPage](../../../../job-tracker-ui/src/views/MicrosoftLegacyRelinkPage.tsx) | userId/tenantId/objectId/token recovery metadata; actual provider popups/consent/revoke and origin/state unverified. | E03 | [relink](../../../../job-tracker-ui/src/microsoft-legacy-relink-page.test.tsx), [token validator](../../../../JobTrackerApi.Tests/MicrosoftTokenValidatorTests.cs); real consent E03 | **PARTIAL** |
| `/cv/:slug` | Preserved public page | [PublicCvPage](../../../../job-tracker-ui/src/views/PublicCvPage.tsx) | Published slug owner and anonymous HTML/PDF. No numeric private-editor redirect; publication/revocation and PDF capacity remain protected. | C05/C12 | [public CV](../../../../job-tracker-ui/src/public-cv-page.test.tsx), [PublicCvController](../../../../JobTrackerApi.Tests/PublicCvControllerTests.cs), [smoke](../../../../job-tracker-ui/e2e/smoke.spec.ts); deployed fonts/publication lifecycle C05/C12 | **PARTIAL** |
| `/dashboard` | Enhanced original page — P5-06 | [DashboardView](../../../../job-tracker-ui/src/components/DashboardView.tsx) | Home reports/onboarding/five owner-local flags and contextual links. Snapshot/trend retries remain separate; period is component state here. | S01/S02/E07–E09 | [P5-06 evidence](../p5-06/README.md), [daily loop](../../../../job-tracker-ui/src/daily-control-loop.test.tsx); metric/preference limits S01/S02 | **PARTIAL** |
| `/analytics` | Added enhanced page — P5-07 | [AnalyticsPage → DashboardView(mode=analytics)](../../../../job-tracker-ui/src/views/AnalyticsPage.tsx) | Authenticated personal reports use the same existing facts/cohorts. months=6/12/24 is URL state; defaults 12; independent of Dashboard visibility flags. | S01/S02/E07–E09/J05/J09 | [P5-07 evidence](../p5-07/README.md); no new server facts/populations or deployed acceptance S01 | **PARTIAL** |
| `/discover` | Preserved page; Jobs secondary entry | [JobDiscoveryPage](../../../../job-tracker-ui/src/views/JobDiscoveryPage.tsx) | NAV discovery, saved searches/alerts and detail controls unchanged; no new source/provider scope from relocation. | J01/J02 | [discovery](../../../../job-tracker-ui/src/job-discovery.test.tsx), [smoke](../../../../job-tracker-ui/e2e/smoke.spec.ts); live NAV J01/J02 | **PARTIAL** |
| `/jobs` | Enhanced original page — P5-03/P5-04b | [JobTable(mode=jobs)](../../../../job-tracker-ui/src/components/JobTable.tsx) | Table default; view=board mounts KanbanBoard within same owner. Shared complete logical query; page/columns/density/selection lifetime remains explicit. | J03–J07/W01/S03 | [P5-03](../p5-03/README.md), [P5-04b](../p5-04b/README.md), [native Board/query integration](../../../../job-tracker-ui/e2e/board-presentation.spec.ts), [integration component](../../../../job-tracker-ui/src/jobs-view-integration.test.tsx); finite-query/scaling limits J03–J07 | **PARTIAL** |
| `/jobs/:id` | Enhanced original page — P5-08a/b | [ApplicationWorkspacePage](../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx) | Seven URL sections, Application/Timeline sub-navigation, existing domain owners/dirty guards. Legacy section strings and numeric navigation-helper tab arguments retained; numeric values are not URL `section` aliases. followMode is metadata only. | W01–W12/M01/M02/E07–E09 | [P5-08b](../p5-08b/README.md), [route contracts](../../../../job-tracker-ui/src/application-route-contracts.test.ts), [preservation browser](../../../../job-tracker-ui/e2e/redesign-preservation.spec.ts); deferred followMode/manual/provider limits W01–W12 | **PARTIAL** |
| `/reminders` | Preserved page; Jobs secondary entry | [RemindersView](../../../../job-tracker-ui/src/components/RemindersView.tsx) | Follow-ups retains grouped reasons and workflow actions; existing calendar/rule/date contracts, no newly scheduled interview semantics. | W10/W11 | [daily loop](../../../../job-tracker-ui/src/daily-control-loop.test.tsx), [calendar](../../../../job-tracker-ui/src/application-calendar.test.tsx); F21/provider W11 | **PARTIAL** |
| `/operations` | Preserved page; utility entry | [OperationsPage](../../../../job-tracker-ui/src/views/OperationsPage.tsx) | Activity/processing list/progress/result/retry/cancel. Bell View all points here; no /notifications page exists. | W12/S02 | [operations](../../../../job-tracker-ui/src/operations-page.test.tsx), [OperationsController](../../../../JobTrackerApi.Tests/OperationsControllerTests.cs); worker/disconnect W12 | **PARTIAL** |
| `/kanban` | Legacy original pattern; redirect after P5-04b | [LegacyBoardRedirect](../../../../job-tracker-ui/src/App.tsx) | Navigate replace to /jobs with view=board. Clones search and overwrites only view; explicitly preserves hash and location.state. No removal date approved. | J07/W01/E07 | [P5-04b](../p5-04b/README.md), [native Board/query integration](../../../../job-tracker-ui/e2e/board-presentation.spec.ts), [App redirect](../../../../job-tracker-ui/src/App.tsx); physical touch/scaling J07 | **PARTIAL** |
| `/companies` | Preserved page; Jobs secondary entry | [CompaniesTable](../../../../job-tracker-ui/src/components/CompaniesTable.tsx) | edit=id opens company editor, including command result destination; contacts/pipeline/history remain with existing form owner. | J08 | [companies](../../../../job-tracker-ui/src/companies-relationship.test.tsx), [command](../../../../job-tracker-ui/src/quick-command-preservation.test.tsx); modal-save accessibility J08 | **PARTIAL** |
| `/offers` | Preserved page; Jobs secondary entry | [OfferComparisonPage](../../../../job-tracker-ui/src/views/OfferComparisonPage.tsx) | Recorded compensation/notes/deadline/source comparison; Dashboard/Analytics offer links continue; no inferred salary calculator. | J09/S01 | [offers](../../../../job-tracker-ui/src/offer-comparison.test.tsx), [P5-07 links](../p5-07/README.md); full mobile/currency review J09 | **PARTIAL** |
| `/correspondence` | Preserved primary page | [CorrespondenceInboxPage](../../../../job-tracker-ui/src/views/CorrespondenceInboxPage.tsx) | view=review selects GmailReviewPage; other URL view values select inbox. Compose/drafts remain existing in-page state/actions, not new routes. | M01–M06 | [inbox](../../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx), [draft persistence](../../../../JobTrackerApi.Tests/EmailDraftPersistenceTests.cs); live mail/reconnect M01–M06 | **PARTIAL** |
| `/correspondence/review` | Preserved legacy redirect | [Navigate review alias](../../../../job-tracker-ui/src/App.tsx) | Hard-coded replace to /correspondence?view=review. Does not pass incoming other query, hash or state. Record this existing limit; audit required metadata before parity claims. | M05 | [inbox](../../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx), [review](../../../../job-tracker-ui/src/gmail-review-page.test.tsx); actual provider/create chain M05 | **PARTIAL** |
| `/profile` | Preserved page; Settings/account entry | [ProfilePage](../../../../job-tracker-ui/src/views/ProfilePage.tsx) | Account identity/avatar/password/email and local security/session cards retained; same page, distinct from canonical Career Profile. | E04–E06 | [profile](../../../../job-tracker-ui/src/profile-page.test.tsx), [2FA](../../../../job-tracker-ui/src/two-factor-settings.test.tsx); complete account/device journeys E04–E06 | **PARTIAL** |
| `/applications/:id` | Preserved legacy redirect | [LegacyApplicationRedirect](../../../../job-tracker-ui/src/App.tsx) | Replace to /jobs/:id + location.search and state=location.state. Hash is not passed by the current adapter; no alias removal approved. | W01/E07 | [P5-08b](../p5-08b/README.md), [workspace](../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx), [App redirect](../../../../job-tracker-ui/src/App.tsx); legacy sections/followMode W01 | **PARTIAL** |
| `/career` | Preserved page; Career Profile entry | [CareerWorkspacePage → CareerProfilePage](../../../../job-tracker-ui/src/views/CareerWorkspacePage.tsx) | section=profile/evidence/import; default overview. Structured source/import/evidence/history owners remain; /career/profile is not an App route. | C01–C04 | [Career workspace](../../../../job-tracker-ui/src/career-workspace-page.test.tsx), [profile](../../../../job-tracker-ui/src/profile-page.test.tsx); long-tail/import/provider C01–C04 | **PARTIAL** |
| `/career/builder` | Preserved page; CVs entry | [CvBuilderPage](../../../../job-tracker-ui/src/views/CvBuilderPage.tsx) | CV library create/copy/delete/templates/manage/publish/share/export. Creates/open navigate to numeric owned editor, public slug remains distinct. | C05 | [builder library](../../../../job-tracker-ui/src/cv-builder-page.test.tsx), [P5-12](../p5-12/README.md); full library/publication chain C05 | **PARTIAL** |
| `/career/builder/:id` | Enhanced original editor — P5-09–12/P5-14 | [CvBuilderEditor](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx) | One save/revision/history/preview owner, Content-first local studio tabs and responsive panes. Production CV generation/Apply unavailable guard; P5-13 review deferred. | C06–C12/W05/E07–E09 | [editor](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx), [P5-12](../p5-12/README.md), [AI readiness](../p5-13-readiness/README.md); P5-13/P5-14/manual/rendering limits C06–C12 | **PARTIAL** |
| `/admin/audit` | Preserved authorized admin page | [AdminAuditPage](../../../../job-tracker-ui/src/views/AdminAuditPage.tsx) | Separate audit/history/supported undo/restore; API role checks remain authoritative. Shell visibility is not authorization proof. | A02 | [audit](../../../../job-tracker-ui/src/admin-audit-page.test.tsx), [authorization](../../../../JobTrackerApi.Tests/ApiAuthorizationPostureTests.cs); native undo A02 | **PARTIAL** |
| `/admin/users` | Preserved authorized admin page | [AdminUsersPage](../../../../job-tracker-ui/src/views/AdminUsersPage.tsx) | Separate users/role/reset/delete/last-admin/self guards; no aggregate Admin page invented. | A01 | [users](../../../../job-tracker-ui/src/admin-users-page.test.tsx), [UsersController](../../../../JobTrackerApi.Tests/UsersControllerTests.cs); revoke/reset A01 | **PARTIAL** |
| `/admin/system` | Preserved authorized admin page | [AdminSystemPage](../../../../job-tracker-ui/src/views/AdminSystemPage.tsx) | Separate diagnostics/configuration/mail/AI/probe/benchmark/maintenance; visible admin metadata retained, production actions unverified. | A03 | [system](../../../../job-tracker-ui/src/admin-system-page.test.tsx), [maintenance](../../../../JobTrackerApi.Tests/MaintenanceJobDispatcherTests.cs); deployed probes A03 | **PARTIAL** |
| `/trash` | Enhanced original page — P5-03 | [JobTable(mode=trash)](../../../../job-tracker-ui/src/components/JobTable.tsx) | Deleted-only list and restore/edit; Table-specific utility, no Board view or permanent-delete substitution. | J06/S03 | [P5-03](../p5-03/README.md), [table density](../../../../job-tracker-ui/e2e/table-density.spec.ts); finite restore/bulk/manual J06 | **PARTIAL** |
| `/settings` | Preserved page; Account entry | [SettingsView](../../../../job-tracker-ui/src/components/SettingsView.tsx) | Existing tabs/mobile selector/data/rules/notifications/AI/privacy/backup/account lifecycle, Profile and Connections links; saves retain existing owners. | S03–S05/J10/E08 | [Settings](../../../../job-tracker-ui/src/settings-view.test.tsx), [native layout](../../../../job-tracker-ui/e2e/settings-page-layout.spec.ts); concurrent saves/billing/restore S03–S05 | **PARTIAL** |
| `/settings/connected-accounts` | Preserved page; Settings secondary entry | [ConnectedAccountsPage](../../../../job-tracker-ui/src/views/ConnectedAccountsPage.tsx) | Gmail/Graph/IMAP connection status/connect/disconnect distinct from sign-in identity; mail/calendar grants do not authorize new routing/send behavior. | M06/E03 | [connections](../../../../job-tracker-ui/src/email-provider-connections.test.tsx), [native Settings](../../../../job-tracker-ui/e2e/settings-page-layout.spec.ts); actual OAuth/mail/expiry M06 | **PARTIAL** |
## Query state and alias behavior to audit
| Contract / actual owner | Current source behavior | Required execution acceptance / owner / priority |
|---|---|---|
| Jobs filters and shared Board query — [jobsQuery](../../../../job-tracker-ui/src/jobsQuery.ts), [JobTable](../../../../job-tracker-ui/src/components/JobTable.tsx) | `q/status/companyId/location/needsFollowUp/readiness/includeDeleted/sortBy/sortDir` are shared logical inputs. `view=board` is Board only in Jobs mode; other values use Table. Table page uses positive URL page and zero-based local index; Board does not reinterpret it as a population limit. | Audit identical complete IDs, custom statuses, owner/deleted/derived filters, saved-view CRUD, unknown/invalid values and scale. Preserve nonavailable/error semantics and selected scope. Jobs/API owner; H. |
| Table↔Board view and list mutation — [JobTable](../../../../job-tracker-ui/src/components/JobTable.tsx) | View link clones query, sets `view`, keeps hash and router state while clearing `focusJobId`; switching clears Table page selection. Filter/sort/page update clones other query and replaces history with state, but does not explicitly pass hash. Density is local presentation state, not account/saved-view/API data. | Direct entry, refresh, Back/Forward, page two, zero matches, unknown safe query/hash and select→switch→return; characterize list update hash before promising fidelity. Jobs owner; H. |
| Legacy Board — [App LegacyBoardRedirect](../../../../job-tracker-ui/src/App.tsx) | `/kanban` clones incoming search, sets `view=board`, replaces history, explicitly retains hash/state. Query-supplied `view=table` is deliberately overwritten. | Native direct/refresh/back and unknown query/hash/state with filtered all-result membership, no loops or mutation. Jobs/shell owner; H. |
| Legacy application — [App LegacyApplicationRedirect](../../../../job-tracker-ui/src/App.tsx) | `/applications/:id` replaces to `/jobs/:id` with the exact search string and router state. It does not pass hash. | Every legacy section/sub/followMode, invalid/missing/foreign id, state return and hash limit; no implicit AI/send/capture/write. Workspace owner; H. |
| Review alias — [App Navigate](../../../../job-tracker-ui/src/App.tsx), [inbox adapter](../../../../job-tracker-ui/src/views/CorrespondenceInboxPage.tsx) | `/correspondence/review` hard-codes replace to `/correspondence?view=review`; other incoming query/hash/state are not passed. Inbox reads `view=review`; drafts/compose use existing in-page state. | Direct/refresh/back and required old metadata, reviewed job create/no-write navigation, dirty draft and send-uncertainty boundaries. Existing fidelity limit is not silently declared repaired. Mail owner; H. |
| Seven job sections — [applicationWorkspace adapter](../../../../job-tracker-ui/src/applicationWorkspace.ts), [workspace navigation](../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx) | Canonical: `overview/match/application/documents/timeline/tasks/interview`. Legacy: analysis→match; cv/cover-letter→application; job-details→overview; checklist/notes→tasks; communication→timeline; portfolio→documents. Unknown section→overview. `sub` selects Application cv/letter/answers/submission or Timeline activity/correspondence. Old cv/letter/communication sections take priority over unrelated sub metadata. | All canonical/legacy entries, disclosure reveal/focus, tab keyboard, unknown key no-write, Back/Forward/refresh, job missing/denied/retry and unsaved letter/answers Cancel/Discard. Workspace/accessibility owner; H. |
| Numeric navigation-helper tab arguments and follow-up metadata — [jobWorkspaceRoute](../../../../job-tracker-ui/src/jobWorkspaceRoute.ts) | Helper tab arguments map 0→overview, 1→communication, 2→documents, 3→cv, 4→communication, 5→match, 6→analysis, 7→interview, 8→checklist, 9→timeline. These generate section strings, not numeric URL `section` aliases; the helper preserves optional `followMode`. Workspace section/sub change clones current query and retains location.state. **No mode-specific UI consumer exists.** | Retain helper tab-to-section outputs and metadata through section/history/reload; honor [recorded mail-phase deferral](../p5-08b-readiness/README.md). Do not count metadata preservation as compose/follow-up UI acceptance. Workspace/mail owner; H. |
| Jobs return/focus — [JobTable](../../../../job-tracker-ui/src/components/JobTable.tsx), [workspace close](../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx) | Row entry records numeric `jobListFocusId` on originating history and sends state `from` + `focusJobId`. `from` is pathname/search only. Workspace close replaces to local `from` or `/jobs` and sends numeric focus; no mounted background Jobs assumption. | Real loaded row/card/Board workflow entry, explicit Back/browser Back, safe from/unknown state and missing row, filter/page/focus recovery, dirty cancellation across all shell routes. Workspace/Jobs owner; H. |
| Capture — [App Shell effect](../../../../job-tracker-ui/src/App.tsx), [captureUrl](../../../../job-tracker-ui/src/captureUrl.ts) | Private Shell resolves `add/addtext`, opens prefilled review, consumes only those keys with history replacement while keeping other search. That navigate call does not explicitly pass hash/state. Opening is not creation. Root public LandingPage authenticated redirect goes to `/dashboard` without explicitly forwarding search. | Characterize root/private/unauthenticated extension/bookmarklet/PWA share, invalid URL, Cancel/reload/no replay/no duplicate write, safe metadata and optional post-create failure. Capture/identity owner; H. |
| Protected route/login continuity — [App auth guard](../../../../job-tracker-ui/src/App.tsx), [LandingPage](../../../../job-tracker-ui/src/views/LandingPage.tsx), [LoginPage](../../../../job-tracker-ui/src/views/LoginPage.tsx) | Shell denied entry replaces to public `/` with state.from **pathname only**, not search/hash. Landing forwards state to login. Login accepts a local slash path excluding `//` and backslashes, else Dashboard. Authenticated public Landing replaces straight to Dashboard. | Deep links with Jobs filters/sections/capture after session expiry/login, safe malformed external targets, remember/challenge/provider paths and stale-account cancellation. Characterize loss limits; no complete deep-link continuity claim from path presence. Identity owner; H. |
| Career section — [CareerProfilePage](../../../../job-tracker-ui/src/views/CareerProfilePage.tsx) | `section=profile/evidence/import`, default overview. Canonical source remains separate from account Profile and CV variant settings/history. | Section direct/refresh/back and dirty import/edit/navigation, long-tail saves, raw/history restore and source/variant separation. Career owner; H. |
| Analytics period — [DashboardView](../../../../job-tracker-ui/src/components/DashboardView.tsx), [AnalyticsPage](../../../../job-tracker-ui/src/views/AnalyticsPage.tsx) | `months=6/12/24`, invalid/default 12; setQuery clones unrelated query. Dashboard uses local period state and five owner-local flags; Analytics shows reports independently. | Exact values/cohorts, Back/refresh/query preservation, independent snapshot/trend failures, no invented metrics and Dashboard flag isolation. Reports owner; M. |
| Company command/deep edit — [CompaniesTable](../../../../job-tracker-ui/src/components/CompaniesTable.tsx), [QuickCommandDialog](../../../../job-tracker-ui/src/components/QuickCommandDialog.tsx) | Company search result enters `/companies?edit=id`; positive edit key requests existing company form. Form is not relocated or auto-saved by route presence. | Command/direct/refresh, missing/foreign id, retained draft and durable modal error; P4-02-D02 remains open. Companies/accessibility owner; H. |
| Token and provider URLs — [reset](../../../../job-tracker-ui/src/views/ResetPasswordPage.tsx), [verification](../../../../job-tracker-ui/src/views/VerifyEmailPage.tsx), [relink](../../../../job-tracker-ui/src/views/MicrosoftLegacyRelinkPage.tsx) | Reset email/token; verify userId/email/token; Microsoft relink userId/tenantId/objectId/token. Backend OAuth callbacks/postMessage are separate from React page patterns. | Expired/invalid/missing/used token and safe logs/titles/history, real sandbox popup origin/state/revoke, no identity leakage. Explicit provider approval at execution time. Identity/provider owner; H. |
| Numeric private CV and public slug — [editor](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx), [public page](../../../../job-tracker-ui/src/views/PublicCvPage.tsx) | Private variant id controls saved lens/history; public slug publication is independent. Current Production CV suggestion-service generation/Apply returns 503; old assistant affordances may still be visible. P5-13 review UI is absent. | Missing/foreign/unpublished/revoked entry, dirty editor/library/Back, no source/sibling mutation, public/private PDF admission and honest unavailable AI. Preserve [P5-13 exception](../OPEN_BLOCKERS.md#p5-13-deferred-debt-and-return-conditions--2026-10-08); CV/AI owner; H. |
## Navigation entries and forbidden removal without replacement
Current [App navigation arrays](../../../../job-tracker-ui/src/App.tsx), [AppShell menus/drawer](../../../../job-tracker-ui/src/layout/AppShell.tsx) and [Jobs view owner](../../../../job-tracker-ui/src/components/JobTable.tsx) supply the actual reachable entries. A future audit must demonstrate expanded desktop, collapsed rail menu and scrollable labelled mobile drawer plus successful heading focus and dirty Cancel preservation. A declaration or hidden menu is insufficient.
| Original / required entry | Current reachable replacement or retained entry | Removal constraint / required acceptance |
|---|---|---|
| Dashboard | Home primary `/dashboard` | Retain reports/flags/onboarding/attention and exact-value links; no replacement by Analytics-only page. |
| Job applications | Jobs primary `/jobs`; Table default | Preserve filters/saved views/pagination/columns/density/mobile row actions and reviewed Add. |
| Kanban board separate primary | Jobs Table/Board switch `/jobs?view=board`; legacy `/kanban` redirect retained | Only old primary entry is consolidated; full query/status/mutation/keyboard parity remains protected. No alias removal date. |
| Discover jobs | Jobs secondary `/discover` | Remain reachable, labelled in narrow/collapsed shell; preserve saved-search/alerts. |
| Reminders | Jobs secondary `/reminders` with count | Preserve every reminder reason, count and workflow/calendar action; do not replace with only overdue cards. |
| Companies / Offers / Trash | Jobs secondary `/companies`, `/offers`, `/trash` | Every low-frequency entry stays reachable; Trash is deleted-only restore, never hard delete. Company edit query remains. |
| Correspondence | Independent primary `/correspondence`; inbox/drafts/review | Never hide global mail in Documents or confuse log with send. Retain review alias and uncertain-send safeguards. |
| Career workspace | Career Profile `/career` | Canonical facts/import/evidence remain distinct from account Profile and CV editing. No invented `/career/profile` route. |
| CV Builder | CVs `/career/builder` and numeric editor | Retain create/copy/delete/publication/export, all controls and one persistence owner; new review remains deferred. |
| Profile former duplicate primary | Settings secondary `/profile` **and** account-menu profile | Both accessible replacement entries exist; security/session/avatar/email/password forms remain under same owner. |
| Settings / Connections | Settings primary, secondary Connections `/settings/connected-accounts`; existing Settings link | Preserve all tabs/mobile selector/data/privacy/backup/account lifecycle and distinct provider grants. |
| Audit / Users / System | Separate admin-only bottom navigation entries | Server role checks remain mandatory; do not invent an aggregate `/admin` landing or drop an operational tool. |
| Language/theme/account Sign out | Header/account controls reuse existing owners | Remain reachable at narrow/collapsed widths and keyboard; UI locale is separate from CV document locale. |
| Quick search/Add | Header search + Ctrl/Cmd+K; six static commands, job/company results; AddJobModal | Retain exact destinations, failure Retry/stale-result disposal and no-create-on-open boundary. |
| Bell/activity | Bell NotificationsPopover; View all→`/operations`; operation/result deep links | Preserve read/dismiss/status/retry/cancel. No `/notifications` route or new notification producer inferred. |
| Admin version/commit | Admin-only shell/account disclosure | Same authorized information remains reachable without narrow-header overlap; public metadata scope not expanded. |
| Proposed Documents / Notifications / global AI / aggregate Admin | No current standalone routes or dead placeholders | Explicitly deferred/absent. Existing job Documents and contextual AI entries remain; absent new pages cannot justify removing their old owners. |
| Analytics | Added meaningful `/analytics` primary in Insights | Existing personal facts/cohorts only; no fabricated metric or new aggregate/admin analytics. |
## Visible control action audit required for P5-15
This is a **source-level action map plus a future manual/native audit checklist**, not a click-through result or complete control census. The larger feature inventory owns sub-actions. Audit role/data/state combinations on every relevant route and all currently visible controls; record named control, expected destination/request, actual result, error/empty/locked/loading/dirty state and focus. H identifies controls requiring behavioral proof beyond a screenshot.
| Surface / actual owner | Visible controls and source-defined actions | Required audit / owner / priority |
|---|---|---|
| [Shell](../../../../job-tracker-ui/src/layout/AppShell.tsx), [App callbacks](../../../../job-tracker-ui/src/App.tsx) | Navigation parent/child/rail menu/mobile drawer, collapse, skip/main, search, Add on Jobs, bell, Settings/profile, theme/language, Sign out, admin badge disclosure | Every entry in prior table; Escape/close/resize focus, active child/parent, dirty navigation Cancel/Discard and account disposal. Shell/accessibility/identity; H. |
| [Command palette](../../../../job-tracker-ui/src/components/QuickCommandDialog.tsx) | Six commands: Dashboard, Jobs, Reminders, Companies, Settings, Add review; job→numeric workspace, company→edit query; keyboard selection, Retry, Escape | No mutation on palette/search/route mount, late-result rejection, IME/Enter/arrow behavior, focus after opening/cancel and manual spoken result/error states. P5-02-D01/P5-04b-R01 remain open. Shell; H. |
| [Bell](../../../../job-tracker-ui/src/components/NotificationsPopover.tsx), [Operations](../../../../job-tracker-ui/src/views/OperationsPage.tsx) | Notification open/read/dismiss/Retry, View all→Operations; operation result link/retry/cancel | Correct owner/deep-link result, no duplicated start, missing/error/long reconnect, announcements/focus; operation utility is not a new notifications page. Operations/shell; H. |
| [Dashboard/report owner](../../../../job-tracker-ui/src/components/DashboardView.tsx) | Five checkbox flags, month buttons, snapshot/trends Retry, exact-value details, Jobs/Offers and workflow attention links, onboarding actions | Audit owner-local flags vs language-save endpoint, exact existing denominators, loading/error independent states, link destinations and all-hidden fallback. **P5-06-O01 observed language-preference 500 during reads remains unresolved.** Reports/identity; H. |
| [Jobs/Trash](../../../../job-tracker-ui/src/components/JobTable.tsx), [saved views](../../../../job-tracker-ui/src/components/SavedViewsMenu.tsx) | Filters/sort/page/size/columns/density/view switch, row/card actions, selected bulk status/soft-delete/restore, edit, Settings data link | Correct selected scope/partial failure, no row open from nested action, dirty/Back/focus, all-result parity, native persisted restore and readable long EN/NB. Jobs/API; H. |
| [Board](../../../../job-tracker-ui/src/components/KanbanBoard.tsx) | Card/workflow entry, pointer/keyboard move, exact-status menu, collapse/group states | Keyboard pickup/drop/cancel, failed move retained, custom-stage group, physical touch/native drag and scale; preserve API raw status identity. Jobs; H. |
| [Workspace](../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx) | Back/edit, seven sections, Application CV/letter/answers/submission, Timeline activity/correspondence, Documents shortcuts, Notes edit/checklist/calendar | All source-defined destinations and disclosures, legacy key priority, source/archived distinction and independent draft guards. **followMode mode-specific compose UI remains deferred; metadata is not action fulfillment.** Workspace/mail; H. |
| [Workspace assets](../../../../job-tracker-ui/src/components/ApplicationAssets.tsx), [attachments](../../../../job-tracker-ui/src/components/Attachments.tsx) | Attach/create/copy/detach/tailor CV, manual/AI letter review/save/history, draft save, package capture/detail/archive download, attachment consent/upload/rename/delete | CV source/variant/sibling ownership, reject no-write, dirty Cancel, frozen bytes after mutation/delete, actual upload/download/error; capture is not send. Workspace/storage/AI; H. |
| [Career](../../../../job-tracker-ui/src/views/CareerProfilePage.tsx) | Overview/structured profile/evidence/import, fields/raw copy/history restore, upload/extract/diff/select/accept/discard/retry/cancel | Canonical scope, low-confidence review, source navigation, long-tail/mobile save, no silent overwrite and interrupted operation behavior. Career/extraction; H. |
| [CV library](../../../../job-tracker-ui/src/views/CvBuilderPage.tsx), [editor](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx), [settings](../../../../job-tracker-ui/src/components/cv/CvCustomizeTab.tsx) | Create/copy/delete/templates/publish/share/PDF; Content/Template/Customize/AI Tools/History; source/override/reset/reorder/visibility; undo/redo/save retry/conflict recovery; editor/preview return | Retain P5-14 measured/keyboard/pointer cases; every capability control and locked/unsupported/error state, publication old-link revoke, revision/draft/source/sibling/frozen invariants and private/public export. Physical/zoom/manual AT remains open. CV/renderer; H. |
| [CV AI affordances](../../../../job-tracker-ui/src/components/cv/AiSectionAssistant.tsx), [DocumentAiTab](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx) | Existing section/whole-document assistant controls request generation/accept; Production optional service gives 503 unavailable. P5-13 review frame is unimplemented. | Honest error/entitlement/privacy/metering, no provider/write in Production withheld scope, unchanged unrelated AI. No model/UI/responsive review acceptance until exact return conditions. AI/CV; H. |
| [Inbox](../../../../job-tracker-ui/src/views/CorrespondenceInboxPage.tsx), [job correspondence](../../../../job-tracker-ui/src/components/Correspondence.tsx), [review](../../../../job-tracker-ui/src/views/GmailReviewPage.tsx) | Inbox filters/page/detail/source/link, compose/reply/drafts/confirm send, uncertain new attempt, job manual log/import, Gmail thread/link/move/unlink/sync, reviewed proposed jobs | Native drafts/revisions/context, no automatic resend/create, no log/send conflation, approved sandbox provider/reconnect/attachment proof and human AT; mail-phase followMode remains outstanding. Mail/API; H. |
| [Settings](../../../../job-tracker-ui/src/components/SettingsView.tsx), [backup](../../../../job-tracker-ui/src/components/BackupCard.tsx), [Connections](../../../../job-tracker-ui/src/components/EmailProviderConnections.tsx) | Tabs/mobile selector; rules/scenario/notification retry, table/theme/language, import/export, privacy/usage/plans, ZIP/backup/deletion confirmation, connection grants/revoke | Correct save owner and dirty tab lifetime; retained notification concurrency 500/rules observation/language 500 investigation, configured billing/deletion/restore guards; provider/production work separately authorized. Settings/API/identity; H. |
| [Companies](../../../../job-tracker-ui/src/components/CompaniesTable.tsx), [Offers](../../../../job-tracker-ui/src/views/OfferComparisonPage.tsx), [Discovery](../../../../job-tracker-ui/src/views/JobDiscoveryPage.tsx) | Contact/company edit/delete/history/source links, recorded offers/notes/deadline, discovery search/source/sort/detail/save searches/run/pause/delete/dismiss | Durable company modal error P4-02-D02, safe source URLs, native contact/date/saved-search persistence and narrow many-offer/long result traversal. Domain/accessibility; H. |
| [Admin Users](../../../../job-tracker-ui/src/views/AdminUsersPage.tsx), [Audit](../../../../job-tracker-ui/src/views/AdminAuditPage.tsx), [System](../../../../job-tracker-ui/src/views/AdminSystemPage.tsx) | Role/create/reset/delete, permitted undo/restore, SMTP/probes/benchmarks/maintenance/diagnostics | API role/last-admin/self/recent-auth gates, mounted revoke, persisted successful actions and safe sensitive output. Actual provider/production actions are outside this plan. Admin/operations; H. |
## Evidence required before a later acceptance decision
Run the agreed applicable regressions at a named source only after execution is authorized; associate each route/visible-action outcome with the original PRES sub-workflow, role/owned fixture, URL/query/state, request/no-write assertions, viewport/theme/locale and focus result. Capture direct entry, refresh, Back/Forward, legacy alias, loading/empty/error/locked state, missing/foreign record, dirty Cancel/Discard and account switch where relevant. Audit human screen-reader names/live announcements, physical touch/software keyboard, 200%/400% zoom, forced colours and text spacing rather than substituting axe incompletes or emulated taps.
The source limitations above are future audit inputs, not fresh regression failures or approval to change semantics. Preserve [recorded deferred scope and open issues](../OPEN_BLOCKERS.md). Current deployment/ingress/backup/schema/configuration/rollback/protected CI and actual deployed route acceptance remain NOT VERIFIED under the separate [production NO-GO](../production-release-decision/README.md). This plan does not close P5-15 or authorize implementation, suite execution, provider calls or release.
@@ -0,0 +1,133 @@
# P5-15-00 — Phase 5 slice inventory
Planning audit dated **2026-10-09**, against `46a0c0c6d23464869f50c0d88552963c29cfdacf` on `codex/ui-redesign-phase4`. This inventories the [approved Phase 5 plan](../PHASE5_PLAN.md), every attempted readiness/implementation checkpoint, relevant current owners/tests and their historical evidence. **No application test, browser journey, provider call, Docker operation or production check was executed for this document.** Test results below are attributed to their original records, not a fresh P5-15 baseline.
The hashes below were resolved from Git history, including application-file history rather than just README history. `git rev-list --ancestry-path 2a2f9e4..46a0c0c` contains every listed Phase 5 commit; the linked component and test files remain present at the audited HEAD. The [P4-06 record](../../phase-4/p4-06/README.md) is the original conditional foundation baseline, not current acceptance. Sources and successor decisions take precedence over historical future-tense text.
## Status meaning
| Status | Meaning in this inventory |
|---|---|
| **PASS** | The stated bounded implementation/readiness scope has source, retained tests and recorded local passing evidence. It does not certify all manual, provider, production or 57-contract acceptance. |
| **PARTIAL** | Implemented or measured scope passes only a subset; a required acceptance obligation remains explicit. |
| **FAIL** | A stated measured gate failed at that checkpoint. A later repair can supersede its current decision without erasing the failure. |
| **DEFERRED** | Planned capability/qualification was expressly postponed and is excluded from completed implementation. |
| **NOT VERIFIED** | Required execution or target/human evidence is absent. File presence, intended behavior and a prior green run do not fill it. |
## Checkpoint and implementation ledger
“Implementation commit” means the commit introducing the bounded change, not the source SHA named at the beginning of its README. Documentation-only entries are identified explicitly.
| ID / current bounded status | Actual implementation or record commit | Capability and authoritative record |
|---|---|---|
| **P5-00 — PASS** | `926f2e516432b0ae1f57970ed2492075fd81839d` | Existing shell readiness: mobile collapse/occlusion, long account/admin metadata, valid command lists, shared Tooltip contrast and actionable-toast overlap. [Record](../p5-00/README.md). |
| P5-00 backend prerequisite — **PASS** | `38cf37ef96effc9a10188fc53f67c4c553f5e8d0`; initialization repair `57a6bd02c6fbe46ae169ba1d08ab2fde16179c5a` | Deterministic existing worker clock, then concurrent default Rules/checklist initialization; distinct prerequisites rather than shell redesign. [P5-00 correction](../p5-00/README.md#p5-00-d01--unrelated-date-dependent-backend-fixture), [P5-01 count reconciliation](../p5-01/README.md#validation-baseline). |
| **P5-01 — PASS** | `8e56ceabf58f9c94afd643f8243f1722388d94cf` | Grouped authenticated shell, sidebar/rail/mobile hierarchy, exact active parent/child, skip link/main/route-heading focus and retained permissions/routes. [Record](../p5-01/README.md). |
| **P5-02 — PARTIAL** | `0f540070156165f1279edea477af6dd44a5f83df` | Six existing commands, job/company search, keyboard/IME operation, genuine outage/Retry, request cancellation; notification load/read/dismiss/links. **Human screen-reader tasks remain mandatory.** [Record](../p5-02/README.md). |
| **P5-03 — PASS** | `7127005e48703eb2147e6f44bd98975975d0eb62` | Jobs/Trash table and phone cards, localized standard status/date display, optional columns, mounted density, filters/saved views/page/sort/selection, partial bulk retry and row Back/focus. [Record](../p5-03/README.md). |
| **P5-04a — PASS** | `42a696bc866c3eae17afa618d5ae1290d58db076` | Grouped Board presentation, full population, precise/custom statuses, pointer and keyboard moves, no-drag status action, failure/Retry and Back. Its original separate-population limitation is repaired by the next two rows. [Record](../p5-04a/README.md). |
| **P5-04b readiness — PASS** | `6fc8937701a073f89fb680235bce58029a27550b` | Shared server-owned Table/Board search/filter/deletion/tenant read, deterministic tie ordering, complete Board array and post-write membership reload. Native 62-owned-row parity covers every Table page. [Record](../p5-04b-readiness/README.md). |
| **P5-04b integration — PASS** | `384dfa8a4b619fb1dec1d4e650f863f7f6fd5ebd` | One Jobs workspace with `view=table\|board`, shared query/filters/creation refresh, explicit selection/density lifetime, active-view reads, history/page/return focus and compatible `/kanban` replacement. Board remains full-array O(N). [Record](../p5-04b/README.md). |
| **P5-05 — DEFERRED** | None | Reserved quick-preview drawer/production host is **NEW-10**, not an existing mounted production workflow. Full-page job opening and Back are retained. [Approved deferral](../PHASE5_PLAN.md#order-and-conditional-branches). |
| **P5-06 — PASS** | `ec6baaeddd3e950b1eb20abb992182deb0747ca9` | Personal Dashboard snapshot/attention/reports, exact populations, shared chart scale/text values, five existing owner-local visibility flags, error/empty states and current links. [Record](../p5-06/README.md). |
| **P5-07 — PASS** | `42a6e425b6e4765c2b41c651b3c7ec8a3235d9f2` | Authenticated `/analytics` and Insights navigation, eight existing report families using the shared report owner, URL 6/12/24-month period, exact values and supported status/company links. [Record](../p5-07/README.md). |
| **P5-08a — PASS** | `fadf99a3f55f7cb8bcd85fe489c46259f525f3ef` | Job identity/actions/Overview and keyboard-scrollable progression; current aggregate data only. Package/deeper sections were deliberately separate. [Record](../p5-08a/README.md). |
| **P5-08b readiness — PASS** | `acd1d94684fe44906005d5e245530bc7c96d28a9` | Native SQLite capture/ZIP/attachment ownership, frozen readback after source changes/deletion, route/history/query/numeric helper and navigation readiness. **P2-D01 becomes an ordinary passing regression.** `followMode` UI remains deferred. [Record](../p5-08b-readiness/README.md). |
| **P5-08b — PASS** | `ac6d78289d487c5ceae3e59db435f7ede24bb6f2` | Seven sections: Overview, Match, Application, Documents, Timeline, Notes & tasks, Interview; Application CV/Letter/Answers/Submission and Timeline Activity/Correspondence. Existing children, aliases, drafts/AI guards and package owners retained. [Record](../p5-08b/README.md). |
| **P5-09 readiness — PARTIAL; original render gate FAIL** | `046dc304aa68d67e15a019057f9bdec0c89bf475` | Expected-version/atomic save and restore, recoverable drafts, source/lens/history distinction **PASS**; original same-source preview/PDF corpus failed six fixtures (**10/16**, 31 preview versus 36 PDF pages). This original NO-GO is historical; successor below owns the current render decision. [Record](../p5-09-readiness/README.md). |
| **P5-09 pagination readiness — PASS** | `efc9e7bdd481a7edf67a9a8d0b545888ee89a670` | Native fragmentation and settled font/image/layout measurement; all **16/16** original fixtures and **36 preview = 36 PDF pages** pass unchanged tolerances/PDF truth. Revision protection retained. [Record](../p5-09-pagination-readiness/README.md). |
| **P5-09 — PASS** | `44b944e5edd22f9f826663719aa581b5e6db8a83` | Compact CV identity/scope/save/actions, Content-first five-tab studio, ordered section jump navigation, retained expanded Content and keyboard pane entry. [Record](../p5-09/README.md). |
| **P5-10 — PASS** | `fc9598be8e1de0192c53270d7a331dd6bbfbe093` | CV-only/source-backed editing, independent field reset/inheritance, omitted content, twelve standard sections, presets/custom/free text, section/item reorder and confirmation/focus. Nested-drop caveat has a bounded P5-14 successor. [Record](../p5-10/README.md). |
| **P5-11 — PASS** | `673cff114546a0976ae01ca9ca0d1086d36fee6a` | **Separately implemented live-preview presentation:** automatic fit/count/return chrome, neutral canvas/white document, settled busy state, latest-result protection, error/Retry and long-document scroll retention. Details and limits below. [Record](../p5-11/README.md). |
| **P5-12 — PASS** | `d8d262e4d1a6223f4b6c5fa52b8419013a929d35` | **Separately implemented controls:** Template gallery/locks/reset confirmation; common Style/Layout and Advanced controls; nullable validated numeric values, inherited/sidebar and dormant/saved-value preservation. Details and limits below. [Record](../p5-12/README.md). |
| **P5-13 grounding readiness — PARTIAL** | `2398ff354ed680c750500d1b417eee23e18f181d` | Authoritative owned source, strict assessment/shape/numeric/entry guards, protected proposal and final freshness/explicit Apply through existing revision save. Deterministic protocol passes; configured-model semantic qualification remains required. **No P5-13 review-layout migration.** [Record](../p5-13-readiness/README.md). |
| **P5-13 semantic declaration — DEFERRED / NOT VERIFIED** | `14e9e60ce5f37bbf4449087612e345d7186c9f81` — docs only | Frozen 32 semantic cases, repeat procedure, baseline probes and human rubric prepared; no qualified real model/human outcomes. [Record](../p5-13-semantic-qualification/README.md), [corpus](../p5-13-semantic-qualification/corpus.json), [rubric](../p5-13-semantic-qualification/RUBRIC.md). |
| **P5-13 environment/recovery — FAIL availability; target NOT VERIFIED** | `d37b97ce390ba31ec3b7bcea6b371aff1057992c`; `9c9157507937b3e084a7ca1e79a2ebd77d0b0928` — docs only | Configured-target/recovery blockers recorded; no established reachable authorized runtime, deployed model digest/options/prompt/image identity or successful qualification. These are historical observations, not a new Docker/health probe. [Environment/recovery record](../p5-13-semantic-qualification/README.md). |
| **P5-13 release safety — PASS guard only** | `fe045b9e015549f3d9101228149af9f9c9f876e5` | Candidate Production registration withholds CV suggestion service; generation/Apply fail before provider/writes. Ordinary CV and unrelated AI remain separately owned. [Release safety](../release-readiness/README.md). |
| **P5-13 qualification/UI — DEFERRED / NOT QUALIFIED** | `1095ef1d29856a2984cd800abd2bbd65dd472d38` — docs only | **0 attempted / 0 completed / 0 failed real qualification calls; 366 not run; 0 human reviews.** Error/fabrication/false-approval/rejection rates are unmeasured. Existing AI controls are not the planned P5-13 redesigned review UI. [Qualification](../p5-13-qualification/README.md). |
| Production decision/P5-14 scope — **PARTIAL local / production NO-GO** | `ef661983a0660541eac1ccee0f8e7b82493cfc2a` — docs only | Later instruction permits implemented 09–12 responsive acceptance independently of release; P5-13 deferral and Production withholding remain. [Decision](../production-release-decision/README.md). |
| **P5-14 — PARTIAL / CONDITIONAL GO** | `46a0c0c6d23464869f50c0d88552963c29cfdacf` | Implemented **P5-09–12 subset**: measured shell/sticky clearance, preview accessibility/reachability, pending-save/conflict retention, owned nested drops and touch alternative. Full AI-assisted journey and human/device/production qualifications remain unaccepted. [Record](../p5-14/README.md). |
| **P5-15 — NOT VERIFIED execution; planning only** | No P5-15 execution/acceptance commit at audited HEAD | This P5-15-00 package prepares bounded acceptance work. No final baseline, manual screen-reader, visual reviewer acceptance, unconditional Phase 5 GO or release decision is supplied by this inventory. [Approved acceptance scope](../PHASE5_PLAN.md#p5-15--representative-screen-acceptance). |
## Current capability and runnable evidence presence
These source/test links were checked against the audited tree. They establish where the capability and permanent checks exist, not that those checks were freshly executed.
| Scope / route | Current owner | Permanent checks / retained evidence |
|---|---|---|
| P5-00/01, authenticated routes | [AppShell](../../../../job-tracker-ui/src/layout/AppShell.tsx), [App](../../../../job-tracker-ui/src/App.tsx), [theme](../../../../job-tracker-ui/src/theme.ts), [toast](../../../../job-tracker-ui/src/toast.tsx) | [Shell unit](../../../../job-tracker-ui/src/shell-readiness.test.tsx), [navigation](../../../../job-tracker-ui/src/app-shell-navigation.test.tsx), [active owner](../../../../job-tracker-ui/src/sidebar-active-nav.test.ts), [real-App shell](../../../../job-tracker-ui/e2e/shell-readiness.spec.ts), [P5-00 results](../p5-00/RESULTS.json). |
| P5-02, command/bell overlays | [QuickCommandDialog](../../../../job-tracker-ui/src/components/QuickCommandDialog.tsx), [NotificationsPopover](../../../../job-tracker-ui/src/components/NotificationsPopover.tsx) | [Command preservation](../../../../job-tracker-ui/src/quick-command-preservation.test.tsx), [notifications](../../../../job-tracker-ui/src/notifications-popover.test.tsx), existing [real-App utility cases](../../../../job-tracker-ui/e2e/shell-readiness.spec.ts); [conditional human gate](../p5-02/README.md#verification-and-visual-evidence). |
| P5-03/04, `/jobs`, `/jobs?view=board`, `/trash`, `/kanban` alias | [JobTable](../../../../job-tracker-ui/src/components/JobTable.tsx), [KanbanBoard](../../../../job-tracker-ui/src/components/KanbanBoard.tsx), [shared query](../../../../job-tracker-ui/src/jobsQuery.ts), [server reads](../../../../JobTrackerApi/Controllers/JobApplicationsController.cs) | [Density](../../../../job-tracker-ui/src/job-table-density.test.tsx), [Board](../../../../job-tracker-ui/src/kanban-grouped-board.test.tsx), [integration](../../../../job-tracker-ui/src/jobs-view-integration.test.tsx), [native query parity](../../../../JobTrackerApi.Tests/JobQueryParityTests.cs), [Table browser](../../../../job-tracker-ui/e2e/table-density.spec.ts), [Board browser](../../../../job-tracker-ui/e2e/board-presentation.spec.ts), [integration summary](../p5-04b/evidence/final-browser-summary.json). |
| P5-06/07, `/dashboard`, `/analytics` | [DashboardView/reporting mode](../../../../job-tracker-ui/src/components/DashboardView.tsx), [AnalyticsPage](../../../../job-tracker-ui/src/views/AnalyticsPage.tsx) | [Dashboard unit](../../../../job-tracker-ui/src/dashboard-presentation.test.tsx), [Analytics unit](../../../../job-tracker-ui/src/analytics-presentation.test.tsx), [Dashboard browser](../../../../job-tracker-ui/e2e/dashboard-presentation.spec.ts), [Analytics browser](../../../../job-tracker-ui/e2e/analytics-presentation.spec.ts), [Dashboard evidence](../p5-06/evidence/final-browser-summary.json), [Analytics evidence](../p5-07/evidence/final-browser-summary.json). |
| P5-08a/b, `/jobs/:id`, `/applications/:id` alias and section query keys | [ApplicationWorkspacePage](../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx), [route adapter](../../../../job-tracker-ui/src/jobWorkspaceRoute.ts), retained domain child components | [Route contracts](../../../../job-tracker-ui/src/application-route-contracts.test.ts), [workspace](../../../../job-tracker-ui/src/applicationWorkspace.test.ts), [Overview browser](../../../../job-tracker-ui/e2e/job-overview-presentation.spec.ts), [sections browser](../../../../job-tracker-ui/e2e/job-sections-presentation.spec.ts), [native preservation](../../../../job-tracker-ui/e2e/redesign-preservation.spec.ts), [readiness invariants](../p5-08b-readiness/evidence/native-preservation-invariants.json). |
| P5-08b native frozen packages | [SubmittedApplicationPackageService](../../../../JobTrackerApi/Services/SubmittedApplicationPackageService.cs) | [Native package controller tests](../../../../JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs), [package service tests](../../../../JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs), ordinary P2-D01 browser capture/readback/ZIP checks in [preservation](../../../../job-tracker-ui/e2e/redesign-preservation.spec.ts). |
| P5-09 readiness / pagination, builder and private/public output | [CvVariantService](../../../../JobTrackerApi/Services/CvVariantService.cs), [CvBuilderEditor](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx), [ThemedCvRenderer](../../../../JobTrackerApi/Services/ThemedCvRenderer.cs) | [Revision readiness](../../../../JobTrackerApi.Tests/CvRevisionReadinessTests.cs), [native readiness](../../../../job-tracker-ui/e2e/cv-readiness.spec.ts), [pagination](../../../../job-tracker-ui/e2e/cv-pagination.spec.ts), [unchanged oracle](../../../../scripts/verify-cv-fidelity.py), [accepted original corpus measurements](../p5-09-pagination-readiness/evidence/fidelity/measurements.json). |
| P5-09/10, `/career/builder/:id` | [CvBuilderEditor Content/SectionRow/EntryEditor](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx) | [Editor unit](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx), [frame browser](../../../../job-tracker-ui/e2e/cv-editor-frame.spec.ts), [source scope browser](../../../../job-tracker-ui/e2e/cv-section-scope.spec.ts), [P5-10 source/render hashes](../p5-10/evidence/renderer-source-hashes.json). |
| **P5-11**, same builder preview owner | [CvBuilderEditor preview state/observer/pane](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx) | Four labelled P5-11 [owner unit cases](../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx), [native presentation](../../../../job-tracker-ui/e2e/cv-preview-presentation.spec.ts), inherited [keyboard](../../../../job-tracker-ui/e2e/builder-preview-keyboard.spec.ts), [scroll retention](../p5-11/evidence/scroll-retention.json), [browser summary](../p5-11/evidence/browser-summary.json). |
| **P5-12**, Template/Customize and shared gallery | [CvCustomizeTab](../../../../job-tracker-ui/src/components/cv/CvCustomizeTab.tsx), [CvTemplateGallery](../../../../job-tracker-ui/src/components/CvTemplateGallery.tsx), existing [settings helper](../../../../job-tracker-ui/src/cvBuilder.ts) | Six [control unit cases](../../../../job-tracker-ui/src/cv-document-controls.test.tsx), [template thumbnail](../../../../job-tracker-ui/src/cv-template-thumbnail.test.tsx), four [native settings journeys](../../../../job-tracker-ui/e2e/cv-settings-presentation.spec.ts), [settings fidelity](../p5-12/evidence/settings-fidelity/fidelity-results.json), [browser summary](../p5-12/evidence/browser-summary.json). |
| P5-13 protected generation/Apply; UI migration absent | [CvAiSuggestionService](../../../../JobTrackerApi/Services/CvAiSuggestionService.cs), [CvAiGrounding](../../../../JobTrackerApi/Services/CvAiGrounding.cs), [controller](../../../../JobTrackerApi/Controllers/CvVariantController.cs), [existing assistant](../../../../job-tracker-ui/src/components/cv/AiSectionAssistant.tsx), [Production guard](../../../../JobTrackerApi/Program.cs) | [Grounding](../../../../JobTrackerApi.Tests/CvAiGroundingTests.cs), [readiness](../../../../JobTrackerApi.Tests/CvAiReadinessTests.cs), [qualification results](../p5-13-qualification/RESULTS.json). Deterministic mocks/synthetic HTTP establish enforcement only; missing model/human output is not a pass. |
| P5-14 responsive subset | [CvBuilderEditor](../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx), [AppShell](../../../../job-tracker-ui/src/layout/AppShell.tsx), [owned drag hook](../../../../job-tracker-ui/src/hooks/useDragReorder.ts) | Four [drag ownership checks](../../../../job-tracker-ui/src/use-drag-reorder.test.tsx), five [responsive/touch-emulation journeys](../../../../job-tracker-ui/e2e/cv-responsive-workflow.spec.ts), [browser summary](../p5-14/evidence/browser-summary.json), [build provenance](../p5-14/evidence/build-provenance.json), [responsive geometry](../p5-14/evidence/responsive-geometry.json). |
## Independent P5-11 and P5-12 findings
**P5-11 is implemented**, not missing or subsumed by P5-14. Current code retains `measuredHtml`, `previewBusy`/`previewReady`, the settings-ready observer attachment, automatic width fit, named scroll region, measured count, retained page-label slots and return-to-existing-editor action. Four P5-11 unit tests cover initial fit, settled announcement, overlapping success/failure rejection and retained pending draft/focus. Two native presentation cases cover one/multiple/ten-page documents, loading/error/Retry, fit/reflow, keyboard return and unchanged source/sibling state. The historical final baseline was **941 backend / 434 frontend / 108 actual browser passes**, with **16/16 original fixtures, 36 = 36 pages**, 44 captures and 211 axe scans. Held/failed long-document checks record **0px scroll change**; all 16 renderer HTML hashes match pagination readiness. Native keyboard and agent screenshot review do not establish human spoken announcements, complete sticky/reflow behavior, production fonts/photos or exhaustive document fidelity. Automatic fit exists; manual preview zoom/fullscreen/fit-page/thumbnails were not implemented or required by this bounded slice.
**P5-12 is implemented independently**, with current common Style/Layout headings, Advanced accordion, nullable numeric validation, effective template/sidebar layout, saved-value options and capability-dependent controls. The [setting-to-control/normalization/render matrix](../p5-12/README.md#setting--control--normalized-value--renderer-matrix) accounts for all supported controls and saved-only values; all nine existing template IDs and Pro policies remain. Six unit cases cover disclosure no-write, range/reset behavior, inheritance/dormant values, locks/confirmed resets, Bokmål naming and exact legacy values such as `15.24mm`. Four native settings journeys cover state/preview/save/Undo/history/reset/template/sidebar/keyboard/mobile readback. Its historical final baseline was **941 / 440 frontend in 81 suites / 112 actual browser passes**; original fidelity remains **16/16, 36 = 36 pages**, and eight additional settings exports pass **8/8, 24 = 24 pages**. Forty-four UI captures and 223 axe scans are recorded, with incomplete checks retained. The gallery thumbnails remain schematic, and the shared gallery consumer is touched without a CV-library redesign. Saved-only `showPageNumbers` has no renderer implementation; this is documented existing debt, not a newly working P5-12 control. No normalization, renderer, font-installation or document-history model was added.
## Historical baseline reconciliation
This ledger counts **actual browser successes**. `+ XF` denotes the unchanged P2-D01 expected failure at that historical checkpoint; it is not an actual success. Later ordinary package passes supersede that annotation. Focused subsets and render fixtures are not added again to whole-suite totals.
| Historical checkpoint | Backend | Frontend | Actual main Chromium passes | Important delta / limit |
|---|---:|---:|---:|---|
| P4-06 / original Phase 5 planning | 916 | 354 | 51 + XF | Conditional foundations only. |
| P5-00 after separate backend clock correction | 916 | 359 | 66 + XF | Shell prerequisites; original 915/1 backend result preserved. |
| P5-01 | 918 | 365 | 70 + XF | +2 backend initialization regressions precede the shell. |
| P5-02 | 918 | 373 | 74 + XF | Human screen-reader gate remains open. |
| P5-03 | 918 | 377 | 74 + XF | Existing table fixture expanded. |
| P5-04a | 918 | 381 | 76 + XF | Separate Board population at this checkpoint. |
| P5-04b readiness / integration | 934 / 934 | 384 / 390 | 76 + XF / 77 + XF | +16 native query cases; then +6 integration units/+1 alias browser case. |
| P5-06 / P5-07 | 934 / 934 | 398 / 403 | 79 + XF / 81 + XF | Existing metric/report definitions only. |
| P5-08a | 934 | 408 | 83 + XF | Native package gate still open here. |
| P5-08b readiness / implementation | 936 / 936 | 412 / 418 | 88 / 93 | **P2-D01 now genuinely passes**; +2 native package tests and +4 new readiness browser cases. |
| P5-09 readiness / pagination | 941 / 941 | 422 / 422 | 96 / 98 | Ordinary browser success did not hide original 6/16 render failures; successor passes 16/16. |
| P5-09 / P5-10 | 941 / 941 | 426 / 430 | 102 / 106 | +4 units/+4 native journeys at each UI checkpoint. |
| P5-11 | 941 | 434 | 108 | +4 owner units/+2 native presentation cases. |
| P5-12 | 941 | 440 | 112 | +6 control units/+4 native settings cases. |
| P5-13 readiness | 1,021 | 455 | 112 | 49 sidecar; 106 focused AI; synthetic HTTP 1. No real model qualification. |
| Release-safety / P5-13 qualification parent | 1,023 | 455 | 112 | 49 sidecar, 108 focused AI, 2 isolated HTTP, 5 revision; [validation](../release-readiness/VALIDATION.json). |
| **P5-14 — latest recorded complete local baseline** | **1,023** | **459, 82 suites** | **117** | +4 drag units/+4 theme/locale responsive cases/+1 touch emulation. [Results](../p5-14/README.md#final-validation--2026-10-09). |
| **P5-15-00** | Not rerun | Not rerun | Not rerun | Planning/document/source audit only. |
At P5-14 the retained ancillary counts are sidecar **49**, focused AI/revision **108/5**, isolated HTTP **2**, rate-limit/ingress/PDF admission/configuration **9/6/1/3**, original render fidelity **16/16; 36 = 36**, settings exports **8/8; 24 = 24**. TypeScript, lint and production/API/test builds were recorded passing there. These are historical local checks; ingress configurations are not F04 deployed-ingress evidence and HTTP synthetic sidecars are not live-model qualification. Zero axe violations coexist with incomplete checks and absent human acceptance.
## Plan-versus-current-code discrepancies
1. **Blocked gates are historical, not current missing implementation.** The original plan's P5-04b “blocked contract” heading and P5-04a mismatch are superseded by `6fc8937`/`384dfa8`; this planning package reconciles the current heading to “read prerequisite satisfied.” Original P5-08a G-PACKAGE NO-GO is superseded by `acd1d946`/`ac6d782`. Original P5-09 rendering NO-GO is superseded by `efc9e7b`. Preserve their failed evidence while using successor decisions.
2. **P2-D01 is required to pass now.** The plan's “retain P2-D01 until separately proven fixed,” P4-06 and early slice expected-failure statements describe history. Native capture/immutable readback/ZIP repair proved it locally at P5-08b readiness; no P5-15 expected-failure waiver is supported.
3. **P5-11 and P5-12 both exist.** P5-11's “stop before P5-12” and P5-13 qualification's “P5-12 latest completed CV UI/no P5-14” describe their own checkpoints. P5-14 is the current successor. Independent implementation hashes, owners and checks above prevent treating a later frame fix as either earlier slice's implementation proof.
4. **P5-13 prerequisites are not P5-13 UI completion.** Protocol guards/typed transport/Production withholding were implemented; semantic/environment/qualification records are documentation. Real calls remain **0/366**, human reviews **0**, rates unmeasured, redesigned current/proposed/diff/error/locked review presentation absent. Retain the [full return conditions](../OPEN_BLOCKERS.md#p5-13-deferred-debt-and-return-conditions--2026-10-08).
5. **P5-14 scope was revised, not fully completed.** The later approved 09–12 subset can proceed despite Production NO-GO. It cannot satisfy the original edit→preview→AI review→Undo/history→save→export journey while P5-13 is deferred. P5-10-O01 closes only the demonstrated owned nested-drop/default-cancellation cases, not cross-section transfer or all touch hardware.
6. **Source/version words need their actual domain meaning.** Current CV is a lens over current canonical source; saved versions contain settings, not an immutable Career Profile/name/PDF snapshot. Restore appends settings against current source. Submitted packages separately freeze source/settings/rendered content/files. This is an established preserved contract, not a missing “historical PDF” Phase 5 feature.
7. **P5-12 corrects the older date-format inventory.** The original readiness prose calls `DateFormat` a frontend hint; the existing resolver actually formats supported Experience/Education/Project dates, while Certification dates remain source strings. P5-12 documents this existing behavior rather than claiming it introduced formatting. Stored `showPageNumbers` remains unrendered.
8. **Evidence incompleteness is not completion.** P5-03 still contains a historical “screenshots/manual review pending” sentence followed by final rendered review; the final paragraph is the executed evidence. Across slices, screenshot review, keyboard automation, finite synthetic output corpora and zero axe violations do not supply the still-required human, physical-device, production or complete visual acceptance matrix. Prior candidate failures and unaccepted interrupted runs remain outside accepted totals.
## Retained Phase 5 gaps versus later-phase scope
Sources: [Phase 3 CV workspace](../../phase-3/CV_WORKSPACE.md), [AI contract](../../phase-3/AI_INTERACTION_MODEL.md), [route plan](../../phase-3/ROUTE_PLAN.md), [Phase 3 sequencing](../../phase-3/PHASE4_IMPLEMENTATION_PLAN.md), and [Phase 5 ownership/scheduling](../PHASE5_PLAN.md#ownership-and-scheduling). A Phase 3 proposal is not automatically a retained Phase 5 implementation requirement.
| Capability / evidence | Current classification |
|---|---|
| P5-13 redesigned section/document AI review, qualified factual source evaluation and complete responsive AI journey | **DEFERRED / NOT VERIFIED retained Phase 5 obligations.** Production path withheld; existing controls and deterministic tests cannot substitute. |
| Command/notification and CV human spoken-name/state-announcement tasks; broader human visual observations | **NOT VERIFIED acceptance evidence.** P5-02 explicitly carries its mandatory task to P5-15. |
| 200%/400% browser zoom, forced colours/text spacing, physical touch/software keyboard/mobile screen reader, broader pointer/reflow/sticky conditions | **NOT VERIFIED** beyond the finite automated viewport/keyboard/touch-emulation scope. |
| Production Linux/fonts/photo/wrapped-line/all-template/all-font/other-browser output and F04/backup-restore/configuration/rollback/protected deployment | **NOT VERIFIED / production NO-GO.** Local fidelity/configuration does not close them. |
| Board full-array scale/native touch; Dashboard preference-save 500; retained dialog/command focus/timing observations | Carried debt with existing owners, not blanket passing claims. Later baseline success does not prove a race fixed. |
| `followMode` metadata versus mode-specific composer | Metadata preserved; compose activation **DEFERRED by approved scope decision to mail work**. Do not silently claim the composer implemented. |
| P5-05 quick-preview production host | **DEFERRED NEW-10**, deliberately reserved rather than a missing redesigned mounted screen. |
| Manual preview zoom/fullscreen/fit-page/thumbnails and manual page-break editor | Optional/incremental/new capability, outside P5-11/12 approved presentation scope. Existing automatic fit/native pagination remain. |
| Career Profile UX, CV-library UX, global Documents projections, provider mail/calendar, Settings/Admin and full Notifications destination | **Phase 7** route/domain work; entry/shared-gallery/regression touches in Phase 5 are not full redesigns and are not missing Phase 5 slices. |
| Dashboard layout/order/resize/reset customization and speculative new metrics/status/favourite/goal fields | **Phase 8 / separate NEW/OD and data contracts.** Five existing flags remain implemented; no widget framework/new data implied. |
| B07 and Phase 6 review | Separate later authorization; not started by this inventory. |
**Planning conclusion:** implemented independent slices and repaired readiness gates are identifiable and retained; **unconditional Phase 5 acceptance is not established**. P5-15 execution must use this inventory and current source, run its authorized fresh baseline, obtain required real reviewer evidence, retain exclusions and assign any preservation regression to its originating owner. This document supplies no production GO and no human sign-off.
+2
View File
@@ -4,6 +4,8 @@ Status reconciled: 2026-10-09.
## Current repository work
- **P5-15-00 — acceptance planning only:** [final acceptance programme](../redesign/phase-5/p5-15/README.md) reconciles every Phase 5 slice, all 57 original PRES groups and retained routes, incomplete axe/manual/device qualifications, CV/native/revision boundaries and A/B/C/D debt/release gates. No new application/test change or fresh suite result; inherited 1,023 backend / 459 frontend / 117 browser remains. P5-13 deferred, full Phase 5 incomplete and production NO-GO. Push this documentation checkpoint and stop for review; each subsequently completed logical P5-15 checkpoint must be separately committed/pushed. No production `main` push, B07 or automatic 01 execution.
- **P5-14 — scoped responsive CV checkpoint, CONDITIONAL GO:** [implementation/acceptance record](../redesign/phase-5/p5-14/README.md) covers implemented P5-09–12, measured shell clearance, bounded preview chrome/canvas, pane-owned Ctrl+Home/End, nested drag/drop protection, save/conflict recovery and 320–1440px/landscape evidence. Final baseline: **1,023 backend / 459 frontend / 117 actual browser passes**, sidecar 49, real HTTP 2, security/configuration 9/6/1/3; revision 5/5, original fidelity 16/16 with 36 aligned pages and settings exports 8/8 with 24 aligned pages. Production remains NO-GO and no `main` deployment occurred. P5-13 stays deferred/unqualified; incomplete/human/device/zoom/font/production gates remain open. Stop before P5-15/B07; acceptance planning is the next recommendation only.
- **P5-13 — DEFERRED / BLOCKED / NOT QUALIFIED:** [outstanding-work register](../redesign/phase-5/OPEN_BLOCKERS.md#p5-13-deferred-debt-and-return-conditions--2026-10-08) retains 32 frozen cases, 366 required/0 completed model calls, 0 human reviews, unmeasured factuality, unavailable environment/unverified deployed identity and unimplemented AI review UI. Deterministic protections and Production withholding remain; no unrelated Docker recovery retries. The separate [fresh production assessment](../redesign/phase-5/production-release-decision/README.md) identifies automatic deployment from `main` and records **PRODUCTION NO-GO** pending actual ingress/current backup-restore/configuration/rollback evidence. Connor authorizes scoped P5-14 independently of release success; missing AI-review acceptance remains explicit. P5-15 must carry the debt and commit/push every individual change/checkpoint when authorized.