docs(redesign): plan gated Phase 5 migrations
This commit is contained in:
@@ -37,6 +37,8 @@ AI should support this flow naturally and contextually. It must never invent fac
|
||||
|
||||
## Status
|
||||
|
||||
2026-09-13: [Phase 5 documentation-only plan](phase-5/README.md), based on `2a2f9e4`, reconciles P4-06's conditional planning verdict, all 57 contracts and 31 existing routes. P5-00 shell readiness is required before P5-01's first major visible redesign. Board query parity, native package preservation and CV revision/rendering have separate dependent gates. No Phase 5 implementation or B07; F04 remains open. Earlier entries below describe their historical checkpoints.
|
||||
|
||||
2026-09-11: [P4-01 semantic color/focus checkpoint](phase-4/p4-01/README.md), based on `f696f23`, implements the bounded shared MUI foundation and loaded-state regression fixtures. Final 916 backend / 333 frontend pass; browser 35 actual passes + the unchanged expected failure. [Preservation and visual evidence](phase-4/p4-01/TRACEABILITY.md) records both themes and intentional gaps. [Phase 4 checkpoints](phase-4/README.md) track the follow-up. P4-02, broader layout/route redesign and B07 remain unstarted; F04 remains open. Earlier status entries below are historical.
|
||||
|
||||
2026-09-10: [Phase 3 UX architecture checkpoint](phase-3/README.md), based on Phase 2 `d6d3dd9`, defines grouped navigation, all 31 route destinations, 57 PRES impacts, workflow/data boundaries and the bounded Phase 4 foundation plan. Documentation only; no visual implementation or B07. F04 remains open. [Phase 2](phase-2/README.md) retains the executed 916 backend / 313 frontend baseline and explicit browser/provider/production gaps. Earlier status entries below are historical.
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# Redesign traceability
|
||||
|
||||
Phase 5 planning: [57-contract change impact](../phase-5/PRESERVATION_IMPACT.md), [navigation migration](../phase-5/NAVIGATION_MIGRATION.md) and [visual evidence protocol](../phase-5/VISUAL_ACCEPTANCE.md). These specify future tests/changes, not implemented preservation. The P4-06 conditional gates remain explicit; no Phase 5 application changes have started.
|
||||
|
||||
Successor planning checkpoint: [Phase 3 impact matrix and architecture](../phase-3/PRESERVATION_IMPACT_MATRIX.md). It maps all 57 contracts to proposed destinations/validation, without changing their requirements or claiming implemented/visual parity. The subsequent [P4-01 trace sheet](../phase-4/p4-01/TRACEABILITY.md), [P4-02 named-control/modal record](../phase-4/p4-02/README.md), [P4-03 preview keyboard record](../phase-4/p4-03/README.md), [P4-04 Settings layout/typography record](../phase-4/p4-04/README.md) and [P4-05 table/list density record](../phase-4/p4-05/README.md) link shared foundation changes to regression and representative visual evidence. [P4-06 acceptance](../phase-4/p4-06/README.md) and its [57-row reconciliation](../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md) retain scoped evidence, incomplete checks and affected-migration gates; they do not claim exhaustive preservation or production readiness.
|
||||
|
||||
Phase 2 starts at `2d0f131`. The [preservation matrix](PRESERVATION_MATRIX.md) is the stable baseline: **PRES-E01…PRES-A03**, in the original ledger's groups (not one contiguous numeric range). Old references such as C07 remain valid aliases. Subdivide a later workflow with a suffix, for example `PRES-C07.override-reset`; do not reuse an ID or silently change its meaning.
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# Phase 4 checkpoints
|
||||
|
||||
Successor: [Phase 5 planning package](../phase-5/README.md) reconciles the conditional acceptance at `2a2f9e4`. Planning only; P5-00 prerequisites precede shell migration and no Phase 5 implementation is started by that package.
|
||||
|
||||
Phase 4 starts from `f696f23` on `codex/ui-redesign-phase4`. The 57 preservation contracts in [Phase 2](../phase-2/PRESERVATION_MATRIX.md) and the [Phase 3 impact matrix](../phase-3/PRESERVATION_IMPACT_MATRIX.md) remain authoritative.
|
||||
|
||||
- [P4-01 semantic colors, focus and loaded fixtures](p4-01/README.md)
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
# Navigation migration
|
||||
|
||||
Source: current [App](../../../job-tracker-ui/src/App.tsx), [AppShell](../../../job-tracker-ui/src/layout/AppShell.tsx), [Phase 3 route contract](../phase-3/ROUTE_PLAN.md). P5-01 changes navigation presentation; it does not replace the router, providers or page owners.
|
||||
|
||||
## P5-01 visible shell contract
|
||||
|
||||
Use the existing 254px expanded / 84px collapsed sidebar and <768px modal drawer as starting dimensions. Use MUI semantic navigation/surface/action/focus tokens and P4 typography/gutters. Existing provisional indigo, Archivo/system type, name and mark remain substitutable; no final branding decision. Calm neutral surfaces, restrained borders/depth, compact labelled groups and useful content width; no gradient/glass treatment, new card grid or giant heading.
|
||||
|
||||
Desktop: sidebar identity, Dashboard, Job search, Career, Account, authorized Admin; utility bar contains command trigger, bell and account access. Insights is inserted only when P5-07 supplies real content. One contextual title below utilities, no repeated page/job/CV header. Keep existing width opt-ins (Settings reading; other pages unchanged until migrated). No second theme/preferences store.
|
||||
|
||||
Expanded primary rows: icon + name + selected indicator; selected and keyboard focus remain distinct. Group labels are quiet but readable, not color-only. Child destinations use an indented, labelled secondary list under their owner. Retain reminder count. Collapsed rail keeps accessible names and readable tooltips; Jobs/Settings/Admin secondary destinations remain reachable via a keyboard-operable labelled menu, not hover-only. Selecting a child marks its parent current while identifying the actual child. Career Profile and CVs require explicit matching so `/career/builder/:id` never highlights Career Profile.
|
||||
|
||||
Mobile: full visible labels regardless of desktop collapse, one modal drawer with all groups/children in scrollable flow; no app-bar overlay on first focus, no nested traps. Global search/bell/account remain reachable; long version/name moves into the account disclosure when necessary, with the same authorized information. Closing returns focus; successful navigation focuses the destination heading; cancelled dirty navigation preserves draft/focus. Skip-to-main and navigation landmarks must be real. No bottom navigation added.
|
||||
|
||||
Keep existing children visible in shell secondary navigation until their workspace offers a proven replacement. A move is atomic: new reachable destination and tests land before removal of its old entry. P5-03 may introduce a Jobs secondary row, without duplicating those as new **primary** destinations. Narrow secondary rows use the existing labelled-selector pattern. Job detail gets Jobs/Back context, not two stacked navigation bars plus its tabs.
|
||||
|
||||
## Every current menu and utility entry
|
||||
|
||||
| Current entry | P5-01 home / initial behavior | Later disposition / condition | PRES |
|
||||
|---|---|---|---|
|
||||
| Dashboard | Ungrouped Home primary, `/dashboard` | Same route, P5-06 content | E07, S01, S02 |
|
||||
| Job applications | Job search → Jobs primary, `/jobs` | Tracked Table default; P5-03 | J03–J06 |
|
||||
| Discover jobs | Jobs secondary, `/discover` | Jobs secondary row; discovery owner unchanged | J01, J02 |
|
||||
| Reminders + count | Jobs secondary, label Follow-ups, `/reminders` | Retain count and all reasons, not just overdue rows | W11 |
|
||||
| Kanban board | Jobs secondary, `/kanban` | P5-04a same route; switch/alias only after P5-04b parity | J07 |
|
||||
| Companies | Jobs secondary, `/companies` | Preserve `?edit=id`, contacts/history | J08 |
|
||||
| Offer comparison | Jobs secondary, `/offers` | Retain recorded offer comparison, no new salary model | J09 |
|
||||
| Job email / Correspondence | Job search → Correspondence **primary**, `/correspondence` | Inbox, Drafts, Review remain independent; not hidden in Documents | M01–M06 |
|
||||
| Career workspace | Career → Career Profile, `/career` | Canonical facts; page remains Phase 7 | C01–C04 |
|
||||
| CV Builder | Career → CVs, `/career/builder` | Library retained, editor P5-09+ gated | C05–C12 |
|
||||
| Trash | Jobs secondary utility, `/trash` | Explicit reachable label; P5-03 table reuse; no permanent delete | J06 |
|
||||
| Audit log | Authorized Admin → Audit, `/admin/audit` | No empty `/admin` landing or aggregate user scraping | A02 |
|
||||
| Users | Authorized Admin → Users, `/admin/users` | Admin group trigger may open children, not an invented dashboard | A01 |
|
||||
| System | Authorized Admin → System, `/admin/system` | Retain operational tools, not personal analytics | A03 |
|
||||
| Profile | Settings secondary + account menu → Account & security, `/profile` | Remove duplicate primary only with both accessible links present; no form relocation | E04–E06 |
|
||||
| Settings | Account → Settings primary, `/settings` | Existing tabs and mobile selector retained | S03–S05, J10 |
|
||||
| Account-menu profile/settings/sign out | Account menu, same callbacks | Appearance/language shortcuts reuse current handlers; no new auth/session owner | E05–E09 |
|
||||
| Current language/theme controls | Remain reachable in shell/account area | Existing preferences; UI locale distinct from CV document locale | E08, S03 |
|
||||
| Quick search; six commands; job/company results | Same trigger + Ctrl/Cmd+K in P5-01 | P5-02 presentation/keyboard/error improvements; no missing future commands | E07, J03, J08 |
|
||||
| Bell / unread count | Same NotificationsPopover and store | P5-02 recent-list presentation, no new producer | S02, W11, W12 |
|
||||
| Operations from notifications/workflow | Utility in notification/account activity access, `/operations` | Keep progress/retry/cancel reachable; no admin conflation | W12 |
|
||||
| Connected accounts from Settings | Settings secondary/account connection link, `/settings/connected-accounts` | Mail/calendar grants remain distinct from sign-in linking | M06, E03 |
|
||||
| Add job on Jobs + command Add + capture links | Retain existing AddJobModal/open callbacks and query review | No automatic creation by route mounting or palette activation | J03, J04 |
|
||||
| Admin version/commit metadata | Admin-only account/header disclosure, responsive | Keep both values available; no public operational metadata expansion | A03, E07 |
|
||||
|
||||
Proposed but absent: **Documents** waits for bounded owner-scoped cross-job metadata reads and package proof (Phase 7/NEW-11); **Analytics** becomes meaningful in P5-07; expanded **Notifications** route is deferred; aggregate **Admin dashboard** needs NEW-08/OD-09. Do not show dead/disabled placeholders or claim a complete Documents index. Existing job Documents/CV links stay reachable. Contextual AI stays in its real domain; no global AI page/panel is added by this shell plan.
|
||||
|
||||
## All 31 current patterns retained
|
||||
|
||||
No compatibility removal date is approved. Each row retains refresh, direct entry, authorization and safe error behavior. Wildcard/fallback infrastructure and inner root redirect also remain but are not counted as pages. New `/analytics` would make **32** patterns in P5-07; `/kanban` remains counted even if later an alias.
|
||||
|
||||
| Current pattern | P5 destination / compatibility decision | Owner slice | PRES |
|
||||
|---|---|---|---|
|
||||
| `/` | Public landing / existing authenticated redirect unchanged | 01 regression only | E01 |
|
||||
| `/login` | Existing auth/challenge entry | 01 regression only | E02–E04 |
|
||||
| `/register` | Existing configured registration | 01 regression only | E02 |
|
||||
| `/forgot-password` | Existing reset request | 01 regression only | E02 |
|
||||
| `/reset-password` | Existing token query | 01 regression only | E02 |
|
||||
| `/verify-email` | Existing token query | 01 regression only | E02 |
|
||||
| `/confirm-email-change` | Existing pending identity confirmation | 01 regression only | E06 |
|
||||
| `/microsoft-legacy-relink` | Existing recovery/relink | 01 regression only | E03 |
|
||||
| `/cv/:slug` | Published-only public page/PDF, never numeric redirect | 09–14 regression | C05, C12 |
|
||||
| `/dashboard` | Home | 06, 07 | S01, S02 |
|
||||
| `/discover` | Jobs → Discover | 01, 03 link only | J01, J02 |
|
||||
| `/jobs` | Jobs → Tracked; Table default | 03, 04b | J03–J07 |
|
||||
| `/jobs/:id` | Dedicated job workspace | 08a, 08b | W01–W12, M01, M02 |
|
||||
| `/reminders` | Jobs → Follow-ups | 01 link only | W11 |
|
||||
| `/operations` | Notification/account activity utility | 01, 02 link only | W12 |
|
||||
| `/kanban` | Keep standalone until parity; then direct replace to `/jobs?view=board` | 04a, gated 04b | J07 |
|
||||
| `/companies` | Jobs → Companies, preserve `?edit=id` | 01, 02 link only | J08 |
|
||||
| `/offers` | Jobs → Offers | 01 link only | J09 |
|
||||
| `/correspondence` | Correspondence primary; inbox/drafts/review | 01 link only | M01–M06 |
|
||||
| `/correspondence/review` | Keep current alias to `/correspondence?view=review` | 01 regression only | M05 |
|
||||
| `/profile` | Settings → Account/security; same page | 01 link only | E04–E06 |
|
||||
| `/applications/:id` | Keep alias to `/jobs/:id` with search/state | 01, 08b | W01 |
|
||||
| `/career` | Career Profile, current section queries | 01 link only | C01–C04 |
|
||||
| `/career/builder` | CVs library unchanged | 01 link only | C05 |
|
||||
| `/career/builder/:id` | Identified CV editor, gated redesign | 09–14 | C06–C12 |
|
||||
| `/admin/audit` | Authorized Admin → Audit | 01 link only | A02 |
|
||||
| `/admin/users` | Authorized Admin → Users | 01 link only | A01 |
|
||||
| `/admin/system` | Authorized Admin → System | 01 link only | A03 |
|
||||
| `/trash` | Jobs utility; deleted-only restore/edit | 01, 03 | J06 |
|
||||
| `/settings` | Account → Settings; tabs unchanged | 01, 02 integration only | S03–S05, J10 |
|
||||
| `/settings/connected-accounts` | Settings → Connections | 01 link only | M06, E03 |
|
||||
|
||||
## Query and lifetime acceptance
|
||||
|
||||
Use the complete [Phase 3 query/section tables](../phase-3/ROUTE_PLAN.md#query-state-and-compatibility-contract), including `q`, `status`, `companyId`, `location`, `needsFollowUp`, `readiness`, `includeDeleted`, `sortBy`, `sortDir`, `page`, capture `add`/`addtext`, `from`/`focusJobId`, `section`, `followMode`, company edit and correspondence review. Preserve unrelated safe query metadata when a view/section changes; do not carry sensitive tokens into titles/history. Unknown keys select a safe view without writes. Keep current numeric tab adapters and aliases before adding new canonical sections in P5-08b.
|
||||
|
||||
Current React Routes mount page owners; do not assume the Jobs component stays mounted behind a job detail. URL restores filter/page context and return state restores row focus; local selection/density lifetime must be characterized in real App, separately from a mounted component fixture. New view switching must make clearing/retaining page-scoped selection explicit. Never silently persist private list/draft state to solve navigation.
|
||||
|
||||
Keep `App` session-invalidated unmount outside `Application`; Toast → Theme → I18n → Confirm → Prompt → ThemeControls → Router and private AccountPlan ownership unchanged. Keep the existing router authority and auth resolution, callback origin/state handling and safe denied admin API result. Theme change must not remount dirty forms. For each migrated route test direct URL, refresh, Back/Forward, legacy query, missing/foreign object, permissions, dirty Cancel/Discard and account switch before claiming parity.
|
||||
@@ -0,0 +1,45 @@
|
||||
# Phase 5 open blockers and deferred issues
|
||||
|
||||
Reconciled against [P4-06](../phase-4/p4-06/README.md#opendeferred-issue-reconciliation), [Phase 2 defects](../phase-2/BASELINE_DEFECTS.md), [Phase 3 decisions](../phase-3/OPEN_DECISIONS.md) and [current known issues](../../roadmap/known-issues.md). Planning closes no issue. “Non-blocking” refers to local Phase 5 work, never production readiness or acceptance of the defective surface.
|
||||
|
||||
| Issue | Status / exact limit | Classification / owner and deadline |
|
||||
|---|---|---|
|
||||
| P4-06-O01 collapse→mobile labels/focus occlusion | Open, manually reproduced and present before P4 | **Blocks P5-01**; P5-00 AppShell prerequisite |
|
||||
| P4-06-O02 long admin badge at 320px | Open synthetic long-metadata failure; actual short production badge overlap not proven | **Blocks P5-01**; P5-00 responsive admin-header prerequisite |
|
||||
| P4-02-D01 command invalid list children | Open loaded axe finding | **Blocks P5-01**; P5-00 semantic repair before utility migration |
|
||||
| P4-03-D01 light Redo Tooltip 3.89:1 | Open, narrow exception only | **Blocks P5-01** shared hovered/focused controls; P5-00 theme pair repair, retain other contrast checks |
|
||||
| P4-04-O01 toast covers bottom action | Open; waiting for normal dismissal was not repair | **Blocks P5-01** shell/feedback acceptance; P5-00 bounded placement, no notification platform |
|
||||
| P3-O02 command error→empty / late query results | Source-confirmed search catches; explicit failure/pending isolation needs owner tests | **Blocks later slice P5-02 acceptance**; retain existing simple commands in 01, no expanded command redesign in 00 |
|
||||
| P3-O02 workspace search replacement loses `followMode` | Source-confirmed `setParams({section})` | **Blocks later slice P5-08b** adapter migration until retained-query proof |
|
||||
| P4-02-D03 mobile progress scroll not focusable | Open loaded axe finding | **Blocks P5-08a affected Overview migration**, not shell; targeted G-WORKSPACE proof |
|
||||
| P4-02-D04 literal AI context `{name}` | Open both locales | **Blocks P5-08b affected application AI labels**; correct interpolation without changing context/API |
|
||||
| P4-02-D02 company-save error outside accessible modal | Open; draft retained, transient toast hidden by modal isolation | **Does not block Phase 5 shell/navigation**. Company form/Phase 7 owner; direct company-form restructuring requires durable in-modal error. P5-00 toast position does not close this |
|
||||
| P4-04-O02 concurrent SQLite notification save | Open, earlier 2/10 native attempts HTTP 500 / database locked | **Separate backend reliability**; no shell/visual blocker with unchanged calls, but any increased polling/write concurrency waits for proof. Sequential passing test does not close it |
|
||||
| P2-O01 isolated rules-save 500 | Historical unconfirmed, cause not established | **Separate reliability triage** if recurrent; keep successful native oracle, no generic retry mask |
|
||||
| P4-05-O01 English status actions/browser-locale dates | Open display debt; status values must stay stable | **Blocks P5-03 localized table acceptance**; display-only standard status/date formatting, preserve custom text/date meaning |
|
||||
| P2-D01 native SQLite tailoring/capture | Open expected browser failure; archived-binary assertions unreached | **Blocks P5-08b and package/tailoring relationship changes**, future Documents; separate provider-compatible repair plus native archive proof. Does not gate independent shell/board/dashboard |
|
||||
| F01 / audit D01 stale CV revision (related profile/job revisions distinct) | Open version increments without expected revision guard | **Blocks P5-09–14 broad CV**; separately authorized integrity work with cross-client proof. Profile/job persistence changes likewise gated, but their unchanged page links are safe. No automatic B07 |
|
||||
| Creation-intent idempotency | Open independent contract; not B02 identity or stale revision | **Separate backend/product work**; no Add/import/POST-on-mount expansion in Phase 5. Existing create review/no-write navigation must remain |
|
||||
| CV margins/templates/preview/pagination | Open, user concern reiterated during P4; current preview has extra pagination/cropping logic | **Blocks P5-09–14** via dedicated G-CV-RENDER corpus/repair checkpoint; keyboard passing does not prove geometry. No broad renderer replacement inside UI slice |
|
||||
| Table/Board filter/population mismatch | Existing distinct reads; not a new vulnerability | **Blocks P5-04b** alias/integration, not P5-04a visuals or other screens; separately define/prove owner-scoped bounded read parity |
|
||||
| P3-O01 analytics names/periods/populations | Open source-confirmed semantic limitations | **Blocks P5-06/07 accurate presentation acceptance**; labels/values tests within those slices, backend metrics/data repair separate |
|
||||
| F04/B06 production ingress | **Open**; repository/local checks are not deployed proof. Historical DNS/HTTPS observations do not prove actual peer/firewall boundary or current topology | **Production gate; does not block local P5 slices**. Operator evidence for actual Traefik peer, nginx trust, listeners/ports, direct/spoofed access, B04 client IP, firewall/NAT/IPv6, DNS/TLS/redirect and restart needed; no closure or credentials accessed here |
|
||||
| Protected-main CI/browser runner and deployment | Unresolved remote-runner evidence; local tests pass | **Separate release gate**; feature-branch docs/UI push is not production deployment approval |
|
||||
| F19 missing provider/config falls back to SQLite | Open source carryover | **Separate startup/deployment safety**, not a UI redesign dependency; no backend provider change here |
|
||||
| F20 enabled worker fault containment | Open, worker disabled by default; enabled loop lacks outer recovery | **Separate worker/operational gate** before enablement or new producers; P5 utilities preserve current operations only |
|
||||
| F21 calendar unspecified DateTime/DST | Open; existing date actions not certified correct across offsets | **Separate calendar/backend gate** before event/time semantics change; retain current deadline/follow-up links/ICS, no new interview scheduling |
|
||||
| Backup/restore/rollback and legacy schema cutover | Production restore/cutover evidence pending | **Separate release/schema gate**; no schema in P5. Required before any external prerequisite that actually needs one |
|
||||
| Stripe activation, paid deletion/retention/provider cleanup | Configuration/policy/provider proof pending; deletion remains gated | **Separate product/backend/release work**; no new billing/trial/delete UX claims or Settings migration |
|
||||
| Provider mail/AI/calendar/OAuth delivery | Partial local mocks/service tests, no universal live provider certification | **Does not block unchanged navigation/presentation**; actual send/reconnect/provider semantics changes wait for sandbox/operator proof. AI truthfulness is not guaranteed by a review dialog |
|
||||
| Full screen-reader/touch/zoom/forced-colors coverage | P4 manual browser checks partial; incomplete axe nodes remain | **Affected-slice accessibility acceptance gates** per visual protocol; unavailable evidence must stay open, not counted as success. Public certification remains blocked |
|
||||
| Historical post-axe NB glyph omissions / scrolled table screenshot edges | Capture limitations, not accepted typography/column alignment | **Evidence quality gate**: pre-axe captures, DOM/text verification, start-of-scroll and focused-scroll comparisons in P5. No product fix inferred without reproducing it |
|
||||
| Original P4 unnamed targeted controls / preview keyboard defect | Closed for P4-02/03 targets only | **Not a blocker**, retain tests; advanced untouched controls still need their own loaded-state proof |
|
||||
| Historical TS2571 | No longer present; standalone gate passed | **Not a blocker**, retain CI type gate; do not describe as current expected failure |
|
||||
|
||||
## Product/new-requirement boundaries
|
||||
|
||||
Final name/logo/primary color remain OD-01–03: use current provisional values, so no shell delay. Email provider (OD-05), external jobs/calendar integrations (OD-06), monetization (OD-07), favorite/priority (OD-08), aggregate admin/privacy definitions (OD-09), intake (OD-10) and weekly goals (OD-11) are separate decisions before their future features. Do not invent LinkedIn integration or scheduled interviews.
|
||||
|
||||
OD-04 dashboard cross-device persistence and NEW-01 ordering/resizing/reset remain **Phase 8**. P5 preserves all five existing owner-local visibility flags. NEW-02 expanded entities, NEW-07 general AI panel, NEW-08 admin metrics and NEW-11 cross-job documents require data/ownership contracts; P5-02 does not implement them. NEW-10 active preview is explicitly deferred, not silently represented as preserved production functionality. Full Career Profile, library, Documents, mail, Settings/Admin and Notifications page work remains Phase 7.
|
||||
|
||||
Before each implementation, check this register against its latest actual evidence. Close a row only with its reproduction/acceptance proof and linked change; keep original audit records intact. A failed prerequisite pauses only dependent scope. Planning success is not an implementation or production GO.
|
||||
@@ -0,0 +1,281 @@
|
||||
# Phase 5 implementation plan
|
||||
|
||||
**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.
|
||||
|
||||
## Order and conditional branches
|
||||
|
||||
| Order / ID | Name | Type / user impact | Dependency and checkpoint boundary |
|
||||
|---|---|---|---|
|
||||
| 1 — P5-00 | Shell readiness gates | Interaction/accessibility; small corrective change | G-SHELL; existing shell only, before P5-01 |
|
||||
| 2 — P5-01 | AppShell and grouped navigation | **First major visible UI redesign**, high impact on every authenticated visit | Accepted P5-00; same routes/providers |
|
||||
| 3 — P5-02 | Global shell utilities | Interaction and visible UI; medium | P5-01; existing command and notification capabilities |
|
||||
| 4 — P5-03 | Jobs Table and mobile cards | Major visible UI; high | P5-01/02, G-JOBS behavior fixtures; includes shared Trash consumer |
|
||||
| 5 — P5-04a | Board presentation | Major visible UI; high | P5-03; keep `/kanban` and existing population |
|
||||
| 6 — P5-04b | Table/Board workspace integration | Architecture/interaction; medium | **Blocked** on G-JOBS read/query parity and separately authorized contract work |
|
||||
| 7 — P5-06 | Dashboard presentation | Major visible UI; high | P5-01/02 and G-METRICS; need not wait for 04b |
|
||||
| 8 — P5-07 | Existing-report Analytics destination | Presentation/refactoring; high | P5-06; exact existing report inventory/definitions and preference proof |
|
||||
| 9 — P5-08a | Job header and Overview | Major visible UI; high | Jobs entry regression, G-WORKSPACE mobile proof; no package relocation |
|
||||
| 10 — P5-08b | Job section architecture and existing domain content | Architecture/visible UI; high | 08a + **G-PACKAGE**, section/query/dirty evidence |
|
||||
| 11 — P5-09 | CV editor frame and navigation | Major visible UI; high | **G-CV-REV + G-CV-RENDER**, relevant G-CV-BEHAVIOR |
|
||||
| 12 — P5-10 | CV section editing and source scope | Interaction/visible UI; high | 09 + item/source/reset/reorder proof |
|
||||
| 13 — P5-11 | Live preview presentation | Visible UI/interaction; high | 09/10 + accepted rendering evidence; no renderer replacement |
|
||||
| 14 — P5-12 | Template and document controls | Visible UI/progressive disclosure; high | 11 + supported-setting matrix |
|
||||
| 15 — P5-13 | CV AI review presentation | Interaction/visible UI; medium | 10/12 + explicit accept/reject/grounding guards |
|
||||
| 16 — P5-14 | Complete responsive CV journey | Interaction/accessibility acceptance; medium | 09–13; all earlier slices already require mobile parity |
|
||||
| 17 — P5-15 | Phase 5 acceptance checkpoint | Validation only; no intended UI change | All attempted slices reviewed; blocked/deferred work explicitly excluded from completion |
|
||||
|
||||
**P5-05 is deliberately reserved, not an executable ticket:** an active quick-preview drawer would be NEW-10, not a redesign of a mounted production feature. Current `ApplicationWorkspace` has reusable overlay props but only a full-page production caller. Keep direct title/open and Back/focus behavior in P5-03/04/08. Defer a new preview host until Phase 6 review establishes its value and its read-only/ownership/focus contract is separately approved. Do not add it merely to fill a numbering slot.
|
||||
|
||||
04a/04b are separated because the current board read cannot support table filter parity. 08a/08b are separated because a header/overview can improve without moving broken package operations. CV is late and conditional; absent revision/rendering evidence, defer 09–14 explicitly rather than call a partially migrated builder finished. P5-15 can assess completed independent slices with a **conditional/partial** verdict; full Phase 5 acceptance requires all retained representative scope, or Connor's explicit scope revision.
|
||||
|
||||
## Common contract for every implementation checkpoint
|
||||
|
||||
- Before editing, re-read its owners, affected PRES rows and the previous checkpoint; add missing high-risk behavioral assertions **before** changing the protected workflow. Component/service tests do not replace native ownership/package proof.
|
||||
- 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.
|
||||
- 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.
|
||||
|
||||
## P5-00 — Shell readiness gates
|
||||
|
||||
**Objective/scope:** close the five G-SHELL prerequisites against current UI: mobile collapse/occlusion, long admin badge reflow, command list semantics, shared Tooltip contrast and actionable-toast overlap. Retain existing modal mechanics. Add real-App drawer/account/command/private-state fixtures. Sub-diffs may be reviewed in that order; deliver one bounded readiness checkpoint.
|
||||
|
||||
**Owners/routes/PRES:** `layout/AppShell.tsx`, `components/QuickCommandDialog.tsx`, shared `theme.ts` Tooltip and `toast.tsx`, narrowly necessary labels/tests; shell on authenticated routes, representative `/settings`, `/jobs`, `/career/builder/:id`; PRES-E07/E08/E09, E05, S02/S03/S05, A03; indirect C06 and J05 for tooltip controls. [G-SHELL](READINESS_GATES.md#g-shell--p5-00-before-p5-01-starts) defines exact failure reproductions.
|
||||
|
||||
**Out of scope:** navigation regrouping, shell visual identity, expanded search entities/arrow navigation, modal company-save semantics, feature pages, provider/router changes, global overlay framework.
|
||||
|
||||
**Proof:** existing sidebar/command/dialog/theme/toast tests plus native collapse→reload→mobile, open-toast hit testing, long admin metadata, account switch with open utilities and dirty cancel. Visual sets VS-SHELL/UTILITY/SETTINGS, including 320px while toast is present. Remove only repaired known axe exceptions after evidence; do not touch P2-D01.
|
||||
|
||||
**Dependency/rollback:** no external infrastructure required. Revert each responsible component/style sub-diff if its contract fails; do not start P5-01 until all G-SHELL items accepted. Expected impact is corrective, not the major redesign.
|
||||
|
||||
## P5-01 — AppShell and grouped navigation
|
||||
|
||||
**Objective/scope:** implement the visible shell in [NAVIGATION_MIGRATION](NAVIGATION_MIGRATION.md): grouped primary/secondary navigation, readable sidebar/rail, selected/hover/focus states, mobile drawer, account area and restrained utility bar. Preserve title/breadcrumb and width owners; use existing PageHeader semantics without duplicating h1. Add skip link/route-heading focus where absent, tested through dirty cancellation. Existing utility content remains for P5-02.
|
||||
|
||||
**Owners/routes/PRES:** `App.tsx` navigation/title metadata, `layout/AppShell.tsx` and its existing `activeNavTo` helper, localized strings and tests. All 31 patterns regression; direct PRES-E07/E08, E05/E06/E09, S02/S03, A01–A03 navigation; all J/W/C/M groups retain entry points as listed in the impact matrix. No provider-order or router-creation refactor.
|
||||
|
||||
**Out of scope:** new Documents/Admin/Notifications routes, dashboard/table/editor forms, capture logic, new AI panel, new brand asset, page-size preference store. Do not introduce a routing framework to represent groups.
|
||||
|
||||
**Before:** accepted P5-00; logical parent tests for non-nested Jobs paths and `/career/builder/:id`; route/callback inventory, existing real B02/permission tests; dirty CV/letter → theme/language/command/drawer navigation, Cancel retains draft. Characterize current persisted collapse separately from non-persisted mobile open state.
|
||||
|
||||
**After:** every destination accessible expanded/collapsed/phone, current parent/child correct, Back/refresh/deep links and public token routes intact, admin hidden plus API denied, no stale account data. VS-SHELL four theme/locale pairs at desktop/phone plus long admin 320, 767/768 transition, settings and dirty editor as unchanged content controls. One main/h1; focus return and unobscured route heading. This is the **first substantial change visible when opening an authenticated page**.
|
||||
|
||||
**Rollback:** isolated shell/navigation presentation; keep all URLs and page owners, no persisted collapse-key rename. Revert metadata/component together; stop before P5-02.
|
||||
|
||||
## P5-02 — Global shell utilities
|
||||
|
||||
**Objective/scope:** refine existing QuickCommandDialog and NotificationsPopover presentation. Commands: grouped six existing static commands and job/company results, labelled search, Arrow/Enter/Home/End/Escape/IME behavior, explicit loading/no-match/error/Retry and stale-result cancellation using the existing API boundary. Bell: recent notifications, unread/read/dismiss/result/operation links with correct focus and no task completion side effect. Integrate utility triggers with shell headers without repeating page actions.
|
||||
|
||||
**Owners/routes/PRES:** App keyboard/utility callbacks only, `QuickCommandDialog`, `NotificationsPopover`, `notifications` client, existing localization. Entries target current Dashboard/Jobs/Companies/Reminders/Settings and `/operations`; PRES-E07/E08/E09, J03/J08, S02, W11/W12. P3-O02 search outage-as-empty is deliberately owned here.
|
||||
|
||||
**Out of scope:** CV/document search, notification producers, full `/notifications`, new command platform, global AI assistant, email scheduling/send, persisted query history. Navigation to already-existing pages may use the shell metadata, but no automatic mutation command or admin maintenance shortcut.
|
||||
|
||||
**Before:** `quick-command-preservation`, `notifications-popover`, `app-shell-notifications`, account isolation; add delayed A-result-after-close/B-login, two overlapping queries, dirty navigation cancel, genuine provider-independent error versus no matches and read/dismiss distinction.
|
||||
|
||||
**After:** VS-UTILITY full matrix, empty/query/error/selected/focus, notification load/error/unread/action states, phone keyboard-sized viewport; result count announcements not per-keystroke spam; ordinary Tab remains usable with one trap. Keep no-write Add behavior and current job/company targets. Manual screen-reader command and notification task, or explicitly block that accessibility acceptance pending operator proof.
|
||||
|
||||
**Dependency/rollback:** P5-01. Revert utility content/callback adjustments together; no new store/API. Search cancellation must not create a second unauthenticated client.
|
||||
|
||||
## P5-03 — Jobs Table and mobile cards
|
||||
|
||||
**Objective/scope:** visible Table toolbar/header/rows and existing phone cards, restrained status/action presentation, secondary Jobs navigation and P4-05 density. Preserve current data columns, page sizes, filters/search/saved views, sorting/selection/actions and Trash mode. Display standard statuses via existing localized semantics; preserve raw custom labels/values. Resolve P4-05-O01 at display boundaries only; dates use UI locale without changing date meaning/timezone storage.
|
||||
|
||||
**Owners/routes/PRES:** `JobTable`, `SavedViewsMenu`, existing `EditJobDialog` call sites, `pipeline` display helpers and Jobs shell header metadata. `/jobs`, `/trash`; links to `/jobs/:id`, capture Add, `/discover`, `/companies`, `/offers`, `/reminders`, `/settings`. PRES-J03–J06, J08–J10 entry only, W01/W02, E07–E09, S03.
|
||||
|
||||
**Out of scope:** new priority/favorite fields, configurable status definitions, Board data consolidation, new preview host, new columns needing N+1 fetches, persisted density, backend schema, Add/import redesign. Trash is the same renderer, not a second screen redesign.
|
||||
|
||||
**Before:** G-JOBS tests; native saved-view CRUD/owner, partial bulk failure retains failed items, row action versus navigation, real App Back/filter/page/focus, 15/20/25 preferences without data loss and unmounted versus mounted density lifetime. Preserve default column choices; Phase 3's suggested new defaults are proposals, not permission to hide current columns.
|
||||
|
||||
**After:** VS-JOBS includes both densities, all columns, custom/long labels, selection/sort, empty/filtered-empty/error/Retry, bulk confirm/partial failure, Trash restore; 1440/1024/768 plus 390/320 cards, all four theme/locale pairs. Header associations/sort state, 32px fine/44px phone targets, visible horizontal-scroll focus. Selection clearing on result changes is explicit and cannot act on unseen stale IDs. No new workflow writes from density/filter presentation.
|
||||
|
||||
**Dependency/rollback:** P5-01/02 + behavioral gate. Keep list query/persistence owner; revert presentation and localized display together. If the existing router preference dependency causes a reproduced state-loss blocker, stop and specify a separate minimal prerequisite rather than rewrite routing here.
|
||||
|
||||
## P5-04a — Board presentation
|
||||
|
||||
**Objective/scope:** apply the same Jobs hierarchy, surfaces, statuses and useful density to existing grouped Kanban columns/cards. Keep its full-board read and `/kanban` entry. Offer visible Table/Board navigation but explicitly keep separate view scope while parity is pending; do not imply filters transfer when they do not.
|
||||
|
||||
**Owners/routes/PRES:** `KanbanBoard`, existing pipeline/group helpers and Jobs secondary navigation. `/kanban` and `/jobs` links; PRES-J07, J05 navigation, W01/W02 status/open, E07–E09.
|
||||
|
||||
**Out of scope:** filtered board API, alias/route replacement, replacing three groups with ten columns, arbitrary drag library, custom status configuration, hiding Other or altering group-drop destinations.
|
||||
|
||||
**Before:** `kanban-grouped-board`, `kanban-theme` browser; add failed move retains correct card/status/focus, keyboard pickup/move/drop/cancel, exact status menu, unknown Other, >25 jobs and direct job open with return context.
|
||||
|
||||
**After:** VS-BOARD across themes/locales/phone/tablet/desktop. Saved/Applied/Rejected remain coarse group destinations; precise menu retains every supported status, Offer remains active, Other is not a drop target. Native drag and no-drag alternatives, move announcements, visible focus/scroll and long labels; empty/error/Retry. No forced dense table on phone.
|
||||
|
||||
**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)
|
||||
|
||||
**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.
|
||||
|
||||
**Owners/routes/PRES:** bounded Jobs workspace owner composed from `JobTable`/`KanbanBoard`, App route adapter, existing query helpers. `/jobs?view=…`, `/kanban`, job return state; PRES-J05/J06/J07, W01/W02, E07–E09, S03.
|
||||
|
||||
**Out of scope:** silently defining a new backend population, loading all pages in the browser, schema, generic query framework, changing SavedView schema, removing `/kanban` or current all-board capability. No per-account view persistence added.
|
||||
|
||||
**Before:** accepted read contract with identical filtered population, completeness and ordering rules; API tests on >25 rows/custom statuses/deleted/follow-up/readiness, native list/board membership and stale move/error behavior. Explicit URL wins; no view specified means Table. Filter changes/page transitions and Back/Forward cannot lose source query.
|
||||
|
||||
**After:** VS-JOBS/BOARD comparison with the **same** fixture/query, saved filters, selection cleared or retained according to documented page scope, mobile view switch. Legacy `/kanban` replace preserves safe query/hash/state without loops; all records remain reachable. Do not claim parity from first-page equality.
|
||||
|
||||
**Dependency/rollback:** may be deferred while 06/07 proceed. On rollback keep canonical new shared links functional (map `view=board` to retained board); do not revert to ignoring shared URLs. No redirect before proof.
|
||||
|
||||
## P5-06 — Personal Dashboard presentation
|
||||
|
||||
**Objective/scope:** redesign existing summary/attention, five visibility-controlled groups, activity/current pipeline/company/tag charts and existing detail panels. Put next actions and honest counts first; compact metric rows, informative charts and plain sections. Preserve onboarding, all five owner-local flags and existing 6/12/24 month control. No chart disappearance before its tested destination exists.
|
||||
|
||||
**Owners/routes/PRES:** `DashboardView`, existing `OnboardingChecklist`, small chart/metric presentation extractions only as consumed. `/dashboard`, source Jobs/Reminders/Career links; PRES-S01/S02, E07–E09, W11/W12 navigation, J05/J09 links.
|
||||
|
||||
**Out of scope:** order/resize/reset/layout persistence (Phase 8), new aggregate backend, weekly goals, upcoming interview appointments, unsupported match/CV performance/sector metrics, auto-AI, new admin analytics.
|
||||
|
||||
**Before:** G-METRICS. `daily-control-loop`, `workflow-trust-signals`, `StageAnalyticsTests`, `AnalyticsSalaryTests`; add native five toggles/reload/A→B isolation, partial summary versus trends failure, exact chart transformations and source query links. Keep the `dashboardPrefs:<owner>` key and meanings.
|
||||
|
||||
**After:** VS-DASHBOARD: populated, first-use, all-hidden, no-data-in-window, loading, independent error/Retry, all four locales/themes/widths; values tables/legends/period/sample and keyboard alternatives. Label non-deleted count “Tracked jobs”; interview-prep is preparation, not an appointment; current stage counts are not historical conversion. Unknown/unsupported is not fabricated zero. Existing salary currencies/periods remain separate.
|
||||
|
||||
**Dependency/rollback:** P5-01/02; may proceed without 04b/package/CV proof. Preserve current five visibility groups, no automatic reset/show-on migration. Revert view/extracted presentation together without clearing preferences.
|
||||
|
||||
## P5-07 — Existing-report Analytics destination
|
||||
|
||||
**Objective/scope:** expose a meaningful `/analytics` using the reports currently inside Dashboard: monthly applications/responses, current status pipeline, company/source reports, tags/trends, current-stage age and salary groups. Separate detailed reading from daily attention. Add Insights → Analytics only with this page. Reuse existing reads and chart presentation; no new metrics endpoint.
|
||||
|
||||
**Owners/routes/PRES:** chart/series helpers extracted from `DashboardView` as needed, new thin Analytics page, App route/title/nav and source-link helpers. New `/analytics`, existing `/dashboard` remains; PRES-S01/S02/E07/E08/E09, J05/J09 source links. G-METRICS mandatory.
|
||||
|
||||
**Out of scope:** full analytical product from Phase 7, new cohort conversions/history, global activity/task/CV queries, admin aggregation, user layout settings, silently moving all five preference-controlled groups off Dashboard.
|
||||
|
||||
**Before:** inventory each existing report/action/period and endpoint. Preserve Dashboard access and five flag semantics; initially detail page may reuse the same presentation component while Dashboard keeps its current groups. Avoid a second calculation implementation or parallel duplicate requests within one mounted route. Add direct-load/back/source-filter/denominator tests and current-versus-window labels.
|
||||
|
||||
**After:** VS-ANALYTICS loaded/empty/error/period changes, accessible exact values, no hover-only data, all mode/locale pairs/phone. Disclose truncated top lists, all-time tags versus window trends, response sample and stage occupancy. Don't obtain an unknown bucket by subtracting mismatched populations; display raw byStatus separately when canonical funnel omits custom values.
|
||||
|
||||
**Dependency/rollback:** P5-06. This is a bounded advancement of existing-report presentation from Phase 7, justified by already available data; full new Analytics features remain later. Once shared, `/analytics` must remain meaningful even on rollback (retained report view or direct compatibility entry to existing reports), not a 404. No document/admin route follows automatically.
|
||||
|
||||
## P5-08a — Job header and Overview
|
||||
|
||||
**Objective/scope:** bounded persistent role/company/status/location/deadline/actions header and clearer Overview hierarchy, reusing current job details/progress/next action/description. Fix the specifically assigned mobile progress-scroll semantics at that boundary before restyling it. Keep current five section keys and unchanged children.
|
||||
|
||||
**Owners/routes/PRES:** `ApplicationWorkspacePage` local WorkspaceHeader, Overview composition, `ApplicationProgress`/`JobDetailsSection` call sites; `/jobs/:id`, `/applications/:id` and existing sections. PRES-W01/W02/W03 entry/W11/W12 links, J05/J07 entry, E07–E09. Relevant F01 job write semantics remain unchanged.
|
||||
|
||||
**Out of scope:** package capture/tailoring/document relocation, changing save/status API, compulsory wizard, new favorite/match metrics, remounting section owners, changing mail send.
|
||||
|
||||
**Before:** G-WORKSPACE progress/focus fixture, real detail missing/foreign, status/next-step link, dirty Cancel/Discard and safe Back/focus tests. Layout opening must not trigger analysis/render/create/write.
|
||||
|
||||
**After:** VS-WORKSPACE Overview including long title, unknown data, error/Retry, status actions, mobile progress keyboard access, both themes/locales. No giant header, retained source/metadata via disclosure, no invented appointment/submission claims.
|
||||
|
||||
**Dependency/rollback:** Jobs entry tests pass, 04b not required. Existing tabs/package children stay untouched, so G-PACKAGE does not gate this header-only slice. Revert header/overview together, not API state.
|
||||
|
||||
## P5-08b — Job sections and preserved domain content
|
||||
|
||||
**Objective/scope:** after G-PACKAGE, introduce Overview, Match, Application, Documents, Timeline, Notes & tasks, Interview navigation using the Phase 3 adapter. Recompose existing children without rewriting their persistence. Application exposes CV/letter/answers/submission; Timeline retains correspondence. Correct `followMode`/safe query retention and literal AI context `{name}` at affected navigation/label boundaries.
|
||||
|
||||
**Owners/routes/PRES:** `ApplicationWorkspacePage`, `applicationWorkspace` section adapter, wrappers around `ApplicationAssets`, `Attachments`, `Correspondence`, `InterviewPrep`, `ApplicationChecklist`, `ApplicationTimeline`. `/jobs/:id`, `/applications/:id` and **every current section/numeric alias**; PRES-W01–W12, M01/M02, M04/M05 navigation, C01/C05–C12 relationships, E07–E09.
|
||||
|
||||
**Out of scope:** rewriting these domain components, mail draft/send/revision changes, generic task/event/document store, global Documents page, altering canonical/CV ownership, atomic send+status+freeze, new scheduling, provider integration.
|
||||
|
||||
**Before:** G-PACKAGE native archive proof; adapter tests for overview/analysis/match/cv/cover-letter/interview/documents/timeline/checklist/communication/job-details and numeric 0–9; `followMode`, Back/search/state retained. Native all-child entry, manual vs answer Notes, CV attach/detach, document AI-use consent, dirty letter navigation and AI accept/reject; mocked provider failures remain identified as such.
|
||||
|
||||
**After:** VS-WORKSPACE for every populated section, key empty/error/dirty/dialog states, draft versus frozen/current/public labels, keyboard and mobile selector; provider-unavailable/manual routes remain reachable. Explicit source/CV/job scope and partial operation failures. No double editor or auto-send on mount. Retain existing overlay props without adding a host.
|
||||
|
||||
**Dependency/rollback:** 08a + package and relevant integrity proof. One route-adapter/composition checkpoint; if state extraction or API changes become necessary, stop and split before implementation. Keep old aliases on rollback and restore exact child entry, never rewrite saved data.
|
||||
|
||||
## P5-09 — CV editor frame and navigation
|
||||
|
||||
**Objective/scope:** clean editor + live preview frame, compact name/scope/save/export header and five studio tabs with Content primary; retain current tab capabilities/history loading. Reuse the single current editor/settings/save owner. No new editor state architecture.
|
||||
|
||||
**Owners/routes/PRES:** `CvBuilderEditor` header/pane/tab composition, shared PageHeader layout only where appropriate. `/career/builder/:id`, library/public links; PRES-C05/C06/C10/C12, E07–E09, W05 entry. Current 900px edit/preview and 1024px grid behavior require explicit transition tests, not forced global breakpoint alignment.
|
||||
|
||||
**Out of scope:** section editor rewrite, template geometry, save/revision implementation, library redesign, share model changes, new zoom, global density applied to print.
|
||||
|
||||
**Before:** G-CV-REV/RENDER and behavioral save failure/retry/undo/redo/native history restore, duplicate/public lifecycle, selected source and pending save during tabs/theme/locale/resize/dirty navigation. No simultaneous integrity edits in this file.
|
||||
|
||||
**After:** VS-CV all five tabs reachable, one/multi-page preview stays keyboard accessible, correct save acknowledgement, edit/preview preserves focus/draft/scroll across 899/900/1024; EN/NB/dark/light. Clear “This CV only” and linked job without global-profile implication.
|
||||
|
||||
**Dependency/rollback:** blocked until gates; package also required if touching job-bound association. Revert frame/tab ordering, retain settings/source IDs and accepted revision protocol. Do not roll back security/integrity prerequisites.
|
||||
|
||||
## P5-10 — CV section editing and source scope
|
||||
|
||||
**Objective/scope:** improve existing ContentTab/SectionRow/EntryEditor hierarchy, scope indicators, expand/collapse and progressive editing. Retain custom/preset/free-text sections, per-item overrides, inclusion, ordering and drag plus keyboard alternatives. Reset-to-source is explicit and CV-only.
|
||||
|
||||
**Owners/routes/PRES:** these existing functions within `CvBuilderEditor`, `AiSectionAssistant` entry only, existing reorder/settings helpers; builder Content route/state, source `/career` link; PRES-C01/C02 relationship, C06/C07/C10/C11 entry, W05, E08/E09.
|
||||
|
||||
**Out of scope:** new canonical editor, fact inference, generic rich-text framework, source schema, inline AI auto-apply, invented content, removal of long-tail sections.
|
||||
|
||||
**Before:** accepted 09/gates; native item override/reset/inherit after source change and sibling/canonical readback; reorder/hide/custom/delete confirmation; mouse/keyboard equivalents and save error retains draft.
|
||||
|
||||
**After:** VS-CV Content long/empty/omitted/selected/edit/error/reorder states in full matrix. Omission uses existing labels/icons, never whole-container opacity that reduces editable contrast. All existing advanced actions reachable; no focusable decorative cards.
|
||||
|
||||
**Rollback:** Content presentation only; do not re-key saved sections/items or change override serialization. Preserve update callback and undo transaction semantics.
|
||||
|
||||
## P5-11 — Live preview presentation
|
||||
|
||||
**Objective/scope:** improve pane header/page indicator/fit and loading/error/overflow presentation around the accepted preview engine. Preserve labelled scroll region, automatic fit, page boundaries, hidden measuring iframe, current source freshness and late-result handling.
|
||||
|
||||
**Owners/routes/PRES:** preview helpers/pane in `CvBuilderEditor`; builder and public/private export regression; PRES-C06/C08/C09/C10/C12, E08/E09.
|
||||
|
||||
**Out of scope:** padding/pagination algorithm changes disguised as layout, renderer/Chromium stack replacement, new template/font system, manual zoom unless separately requested, save changes, new public exposure. Geometry corrections must already be accepted in G-CV-RENDER.
|
||||
|
||||
**Before:** 09/10 + same-source/settings preview/PDF corpus from rendering gate; native out-of-order/delayed/failed preview, PDF busy/timeout, account disposal and undo/reload. B03 shared admission stays enforced.
|
||||
|
||||
**After:** VS-CV preview on all viewport boundaries and real PDF page images/dimensions/text; light/dark application surrounds same intentional paper styling. No missing/duplicated text, extra blank pages or misleading Saved while preview stale. Preview keyboard region and iframe entry/exit remain visible under sticky UI.
|
||||
|
||||
**Rollback:** pane presentation only, maintain renderer evidence and revised backend contract. Any new geometry failure stops this slice rather than broadening it.
|
||||
|
||||
## P5-12 — Template and document controls
|
||||
|
||||
**Objective/scope:** reorganize existing `CvCustomizeTab` Template/Customize modes into sensible defaults and Advanced disclosure. Keep every supported template, typography, accent, photo/header/icons, skills/sidebar/column, A4/Letter, margins/spacing/document density/date/language/section presentation control.
|
||||
|
||||
**Owners/routes/PRES:** `components/cv/CvCustomizeTab`, existing registry/normalization call sites and builder tab composition; `/career/builder/:id`; PRES-C06/C07/C08/C09/C10/C12, E08/E09.
|
||||
|
||||
**Out of scope:** reducing capability set to brief examples, font/brand choice, arbitrary positioning/word processor, silently dropping unsupported saved values, application density as print density, API/schema.
|
||||
|
||||
**Before:** 11 + explicit setting→control→normalized value→render matrix. Pro/template locks, old saved settings, switch compatible/incompatible options and confirmation/reset behavior; all template default outputs and risk-based advanced combos.
|
||||
|
||||
**After:** VS-CV Customize/Template/Advanced full matrix; labels/errors/explanations, keyboard color/size choices, long NB control names, phone reachability and unchanged exported document from equal settings. No buried capability accessible only by pointer.
|
||||
|
||||
**Rollback:** control grouping only; retain serialized names/defaults and normalization. G-CV-RENDER repairs cannot be undone as part of UI rollback.
|
||||
|
||||
## P5-13 — CV AI review presentation
|
||||
|
||||
**Objective/scope:** align existing section assistant and whole-document current/proposed views, explicit source/target scope, edit/compare/accept/reject/regenerate/error/locked states. Share a small review layout only if both existing consumers justify it; domain validators remain local.
|
||||
|
||||
**Owners/routes/PRES:** `AiSectionAssistant`, `DocumentAiTab` inside builder, existing `aiWorkspace` callbacks; builder Content/AI Tools; PRES-C06/C07/C10/C11, S04, E08/E09. Other AI domains are regression dependencies, not migrated here.
|
||||
|
||||
**Out of scope:** global chat, new model/provider, automatic facts or profile writes, letter/interview AI redesign, replacing extraction/block validators, relaxing Free/Pro or privacy gates.
|
||||
|
||||
**Before:** 10/12 and AI tests: Reject/close/error no changes; edited acceptance only intended block; invalid/missing/duplicate IDs rejected; source changes while proposal open, late response/account switch discarded; malicious/unsupported claim fixture does not silently become accepted fact. Prompt constraints or UI review are not universal model factual proof.
|
||||
|
||||
**After:** VS-CV AI short/long diff, unavailable/Free-disabled/provider-error, keyboard compare/apply/reject, all themes/locales/mobile. Show known source material; unknown facts flagged for review, no implied validation of invented employment/skills. Retain explicit user authority over edits.
|
||||
|
||||
**Rollback:** review frame only; callbacks/validators/entitlements unchanged. Never rollback grounding/ownership guards for presentation convenience.
|
||||
|
||||
## P5-14 — Responsive CV workflow checkpoint
|
||||
|
||||
**Objective/scope:** verify and address only integration regressions introduced by 09–13 across complete edit→preview→AI review→undo/history→save→export workflow. Refine existing mobile pane/action placement if their combination fails; mobile support was required in every earlier slice, not deferred until here.
|
||||
|
||||
**Owners/routes/PRES:** existing builder composition and focused tests; identified/private/public routes; PRES-C05–C12, W05/W07 if job-bound fixture, E07–E09/S04. G-PACKAGE required for real submitted variant comparison.
|
||||
|
||||
**Out of scope:** new mobile editor, unrelated Career Profile/library or template repair, broad animations, new state/persistence abstractions.
|
||||
|
||||
**Before:** accepted 09–13 and all gates; real native source/sibling/history/package tests and output corpus. Keep preview/scroll and open review stable across 320/390/768/899/900/1024/1440 transitions.
|
||||
|
||||
**After:** VS-CV full journey, light/dark EN/NB, sticky controls versus keyboard, manual AT/zoom/touch evidence or explicit unaccepted gaps. Every long form/action remains reachable; no premature slot release/PDF parallelism change. Any unrelated baseline issue returns to its owner.
|
||||
|
||||
**Rollback:** only checkpoint integration corrections; no wholesale builder rollback that discards prerequisite integrity contracts.
|
||||
|
||||
## P5-15 — Representative-screen acceptance
|
||||
|
||||
**Objective/scope:** tests/docs review of all completed P5 slices against all 57 contracts and all retained routes. Reconcile shared shell/headers/density/theme/dialog interactions, actual data/read boundaries, visual differences and performance/request counts. No new screen architecture.
|
||||
|
||||
**Owners/routes/PRES:** scoped acceptance records, existing suites/fixtures; all 31 preserved patterns plus `/analytics` if implemented; every PRES group. Regenerate a complete acceptance matrix with direct/entry-only/unchanged touches and remaining provider/manual/production gaps.
|
||||
|
||||
**Out of scope:** implementing blocked CV/board work, fixing unrelated defects, removing aliases or expected failures without proof, Phase 6/7/8, B07, production deployment.
|
||||
|
||||
**Before/after evidence:** execute complete final baseline and all VS sets for actually migrated screens, compare against P4-06 and immediate predecessors, record visual reviewer observations and every incomplete axe/manual check. Full route/draft/identity/package/source tests as applicable; fresh exact test counts and inherited-vs-new-vs-expected-failure split. Check no unsupported dashboard metric or lost advanced action. Full acceptance cannot silently exclude a blocked planned representative screen.
|
||||
|
||||
**Verdict/rollback:** GO only for the reviewed migrated scope with required gates met; CONDITIONAL/PARTIAL if explicitly deferred board/CV/manual evidence remains, NO-GO for a preservation regression. F04 stays a separate production gate regardless of local verdict. Recommend Phase 6 review next only if supported; stop, do not implement it. Docs/test adjustments revert independently; functional regressions return to their originating slice.
|
||||
|
||||
## Ownership and scheduling
|
||||
|
||||
Default execution is serial checkpoint-by-checkpoint. Read-only fixture/spec work for future screens can occur independently. Separate backend package/revision/rendering work is possible only with explicit authorization and ownership; never co-edit `CvBuilderEditor` during integrity repairs. Serialize `App.tsx`, `AppShell`, theme/toast, list/board query ownership and Dashboard report extraction. Do not run several browser suites against the same disposable API port simultaneously.
|
||||
|
||||
Provider mail/calendar, Career Profile, CV library, Documents/global projections, Settings/Admin and full Notifications remain Phase 7. Dashboard customization remains Phase 8. New status configuration/favorite/weekly goals/aggregate admin metrics retain separate NEW/OD contracts. No prerequisite here starts the security queue automatically.
|
||||
@@ -0,0 +1,205 @@
|
||||
# Phase 5 preservation impact
|
||||
|
||||
All **57/57 original capability groups are mapped**, not exhaustively tested or approved for migration. IDs and complete original requirements come from [Phase 1](../audit/FUNCTIONALITY_INVENTORY.md). Full automated assertions/gaps remain in the [Phase 2 matrix](../phase-2/PRESERVATION_MATRIX.md); [P4-06 acceptance](../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md) adds the scoped foundation evidence and conditional gates. Selected existing test references below are anchors, not a coverage percentage or fresh execution claim.
|
||||
|
||||
Rows distinguish direct work, entry-only relocation and unchanged regression dependencies. Every authenticated page receives the new shell, but that does not authorize its form/workflow redesign. Slice numbers refer to [PHASE5_PLAN](PHASE5_PLAN.md); `00–14` means applicable implemented slices, not permission to execute blocked ones. P5-05 is not active. [Gate definitions](READINESS_GATES.md) and [VS evidence sets](VISUAL_ACCEPTANCE.md) apply cumulatively; missing evidence must be added before changing the affected behavior. P5-15 reconciles every row again.
|
||||
|
||||
Each implementation trace must use `PRES-ID[.subworkflow] → original requirement → change/commit → named test + actual outcome → VS artifact + human review`. No row below is implementation evidence. Retain all sub-capabilities even where the short proposed-change description highlights only one. New functions retain NEW IDs; defects retain their original IDs.
|
||||
|
||||
| PRES ID / original capability | Phase 5 touch / owner slice | Existing entry and component/service owners | Behavior retained → planned UX change | Selected existing automated evidence | Missing evidence / gate → future visual proof |
|
||||
|---|---|---|---|---|---|
|
||||
| **PRES-E01** — Public product/plans; honest unavailable billing | Unchanged / 01 route regression | `/`; LandingPage, planCatalog; AccountPlans | Keep public plans and honest unavailable billing; no marketing redesign. | [F:landing-page][F:landing-page.test.tsx]; [F:planCatalog][F:planCatalog.test.ts]; [B:AccountPlans][B:AccountPlansTests] | Public/checkout provider gaps remain; VS-SHELL public redirect smoke. |
|
||||
| **PRES-E02** — Local login/register/remember, challenge, reset and verification | Entry / 01 | `/login; /register; /forgot-password; /reset-password; /verify-email`; LoginPage, TurnstileWidget, VerifyEmailPage; AuthController | Keep auth/reset/verification/challenge callbacks and token URLs; no auth form changes. | [F:login-page][F:login-page.test.tsx]; [F:verify-email-page][F:verify-email-page.test.tsx]; [B:LocalAuthIdentity][B:LocalAuthIdentityTests]; [B:AuthAndSystemController][B:AuthAndSystemControllerTests] | G-SHELL provider lifetime; VS-SHELL login/private entry plus existing auth suite; actual mail/Turnstile remains separate. |
|
||||
| **PRES-E03** — Google/Microsoft login, link, legacy relink and popup results | Entry / 01 | `/login; /microsoft-legacy-relink; provider callbacks`; GoogleAuthCard, MicrosoftAuthCard, MicrosoftLegacyRelinkPage; token validators | Keep login/provider/relink and Settings Connections distinction; group links only. | [F:login-page][F:login-page.test.tsx]; [F:microsoft-legacy-relink-page][F:microsoft-legacy-relink-page.test.tsx]; [B:GoogleTokenValidator][B:GoogleTokenValidatorTests]; [B:MicrosoftTokenValidator][B:MicrosoftTokenValidatorTests] | G-SHELL origin/state and callback regressions; VS-SHELL links; real provider consent remains a gap. |
|
||||
| **PRES-E04** — 2FA challenge/recovery/setup/disable; trusted-device revocation | Entry / 01 | `/profile; /login`; TwoFactorSettingsCard, TwoFactorChallenge; TwoFactorController | Move Account/security entry under Settings/account menu; setup/recovery/trusted-device functions unchanged. | [F:two-factor-settings][F:two-factor-settings.test.tsx]; [F:login-page][F:login-page.test.tsx]; [B:TwoFactorController][B:TwoFactorControllerTests]; [B:SessionsController][B:SessionsControllerTests] | No security panel relocation; VS-SHELL account links; full device/AT journey remains separate. |
|
||||
| **PRES-E05** — Session list/current device, revoke one/others, logout | Direct shell / 00, 01, 02 | `/profile; shell user menu`; SessionsSettingsCard, AppShell, auth; SessionsController | Same logout and session invalidation; open utilities cannot retain private callbacks; session list stays on Profile. | [F:session-boundary][F:session-boundary.test.ts]; [F:account-scoped-state][F:account-scoped-state.test.tsx]; [B:SessionsController][B:SessionsControllerTests]; [B:AuthSessionRevocation][B:AuthSessionRevocationTests] | G-SHELL/B02 real A→B open drawer/command/bell; VS-SHELL/UTILITY. Session card full UI gap retained. |
|
||||
| **PRES-E06** — Avatar, account names/headline, email change and password | Entry / 01 | `/profile; /confirm-email-change`; ProfilePage; AuthController, AvatarStorage | Account identity/avatar stays distinct from Career Profile; preserve email confirmation route. | [F:profile-page][F:profile-page.test.tsx]; [F:verify-email-page][F:verify-email-page.test.tsx]; [B:AvatarStorage][B:AvatarStorageTests]; [B:LocalAuthIdentity][B:LocalAuthIdentityTests] | VS-SHELL account name/avatar/long labels; identity mutations not migrated. |
|
||||
| **PRES-E07** — Desktop collapse/mobile drawer, active nav and command search/actions | Direct / 00, 01, 02, 04b, 07, 08b | `Shell; Ctrl/Cmd+K`; AppShell, QuickCommandDialog; job/company search APIs | Grouped nav, utilities, staged aliases/new Analytics; all 31 routes retained before additions. | [F:sidebar-active-nav][F:sidebar-active-nav.test.ts]; [F:app-shell-notifications][F:app-shell-notifications.test.tsx]; [B:JobApplicationsAuthorization][B:JobApplicationsAuthorizationTests]; [B:CompanyRelationship][B:CompanyRelationshipTests] | G-SHELL, G-JOBS parity and G-WORKSPACE query gates; VS-SHELL/UTILITY/JOBS/BOARD/ANALYTICS/WORKSPACE. |
|
||||
| **PRES-E08** — Theme/system, EN/NB hydration, toast/confirm/prompt and errors | Direct shared / 00–14 | `Shell; preferences; fallback routes`; themePrefs, I18nProvider, confirm, prompt; auth preference | Keep semantic tokens, system/light/dark, EN/NB, modal/loaded state and scopes; no second styling/feedback system. | [F:theme-state][F:theme-state.test.tsx]; [F:i18n-provider][F:i18n-provider.test.tsx]; [B:LocalAuthIdentity][B:LocalAuthIdentityTests] | G-SHELL tooltip/toast; every VS set plus reduced motion/zoom/AT; incomplete axe nodes not passes. |
|
||||
| **PRES-E09** — Account-switch private-state disposal and stale request rejection | Regression boundary / 00–15 | `All private routes; tabs/BFCache/focus`; App, api, sessionBoundary; SessionContextMiddleware | Private tree unmount, trusted identity and abort/stale-write guard remain; no private storage introduced. | [F:session-boundary][F:session-boundary.test.ts]; [F:account-scoped-state][F:account-scoped-state.test.tsx]; [B:SessionContextMiddleware][B:SessionContextMiddlewareTests]; [B:CurrentUserIdLiveEvaluation][B:CurrentUserIdLiveEvaluationTests] | B02 real/API negative cases for each new utility/route; VS-SHELL/UTILITY cannot prove authorization by image. |
|
||||
| **PRES-J01** — NAV discovery/filter/sort/source/deadline/details | Entry / 01, 03 | `/discover`; JobDiscoveryPage; JobDiscoveryController | Discover becomes Jobs secondary; source search/capture page unchanged. | [F:job-discovery][F:job-discovery.test.tsx]; [B:JobDiscoveryController][B:JobDiscoveryControllerTests]; [B:JobOpportunitySync][B:JobOpportunitySyncTests] | VS-SHELL Jobs children; job-discovery browser retained, NAV live provider gap not closed. |
|
||||
| **PRES-J02** — Saved searches, run/delete/alerts, result changes/dismissal | Entry / 01, 03 | `/discover`; JobDiscoveryPage; saved-search/alert services | Saved NAV searches/alerts remain within Discover, no new notification producer. | [F:job-discovery][F:job-discovery.test.tsx]; [B:SavedJobSearchAlert][B:SavedJobSearchAlertTests]; [B:JobDiscoveryController][B:JobDiscoveryControllerTests] | VS-SHELL link; saved search/API evidence retained; no scheduled alert delivery claim. |
|
||||
| **PRES-J03** — Reviewed manual/URL/paste job create, company/tags/dates, duplicates | Entry/presentation / 01, 02, 03 | `Shell AddJobModal`; AddJobModal; JobImportService, JobApplicationsController | Add/import review stays existing modal/callback, no creation on route/view mount. | [F:quick-capture][F:quick-capture.test.tsx]; [B:JobImportService][B:JobImportServiceTests]; [B:JobImportHttpTransport][B:JobImportHttpTransportTests] | G-JOBS capture/modal no-POST tests; VS-UTILITY/JOBS reviewed manual/URL/paste flows; B01 remains. |
|
||||
| **PRES-J04** — Extension/bookmarklet/share capture; post-create attachment/CV | Entry / 01, 03 | `?add= / ?addtext=; QuickCaptureCard; browser-extension`; App, captureUrl, QuickCaptureCard; job/CV APIs | Keep add/addtext capture, consumed-once review and optional post-create CV attachment. | [F:captureUrl][F:captureUrl.test.ts]; [F:quick-capture][F:quick-capture.test.tsx]; [B:JobImportService][B:JobImportServiceTests]; [B:CvBuilder][B:CvBuilderTests] | G-JOBS deep-link and extension fixtures; VS-JOBS modal; installed extension/manual browser gap remains. |
|
||||
| **PRES-J05** — Job filters/sort/page/columns, saved views and row/mobile actions | Direct / 03, 04a entry, 04b | `/jobs`; JobTable, SavedViewsMenu; JobApplicationsController | Restyle table/cards/filters, same columns/sort/page/saved views; gated shared board query. | [F:application-workspace-overlay][F:application-workspace-overlay.test.tsx]; [F:account-scoped-state][F:account-scoped-state.test.tsx]; [B:JobApplicationsController][B:JobApplicationsControllerTests]; [B:JobApplicationsEndpointBehavior][B:JobApplicationsEndpointBehaviorTests] | G-JOBS native saved views/Back/error/selection/completeness; VS-JOBS/BOARD both densities and long NB data. |
|
||||
| **PRES-J06** — Bulk status/delete, soft delete/trash/restore and job edit | Direct / 03, 04b integration | `/jobs; /trash; EditJobDialog`; JobTable, EditJobDialog; job lifecycle/controller | Preserve bulk precise status/delete, deleted-only Trash/edit/restore and partial failures. | [F:application-workspace-overlay][F:application-workspace-overlay.test.tsx]; [F:confirm-flow][F:confirm-flow.test.tsx]; [B:JobApplicationsController][B:JobApplicationsControllerTests]; [B:JobApplicationsAuthorization][B:JobApplicationsAuthorizationTests] | G-JOBS partial failure/selection scope/restore; VS-JOBS confirm/Trash/density; no permanent deletion added. |
|
||||
| **PRES-J07** — Kanban grouped statuses, pointer/keyboard move and precise menu | Direct / 04a, 04b | `/kanban`; KanbanBoard, pipeline; status endpoint | Same three groups/Other, pointer/keyboard/precise status semantics; alias only after parity. | [F:kanban-grouped-board][F:kanban-grouped-board.test.tsx]; [F:pipeline][F:pipeline.test.ts]; [B:JobPipeline][B:JobPipelineTests] | G-JOBS full-board population; VS-BOARD every move/cancel/error and source query; no first-page-only proof. |
|
||||
| **PRES-J08** — Company/contact edits, pipeline dates and linked-job history | Entry / 01, 02, 03 | `/companies; ?edit=id`; CompaniesTable; company relationship APIs | Companies under Jobs; command ?edit=id and contacts/history unchanged. | [F:companies-relationship][F:companies-relationship.test.tsx]; [F:quick-command-preservation][F:quick-command-preservation.test.tsx]; [B:CompanyRelationship][B:CompanyRelationshipTests] | VS-SHELL/UTILITY company links; P4-02-D02 modal feedback stays Phase 7 gate, not closed by toast placement. |
|
||||
| **PRES-J09** — Recorded offers/compensation/deadlines/notes and source links | Entry / 01, 03, 06, 07 | `/offers`; OfferComparisonPage; job API | Offers under Jobs; existing comparison/source/report links and currencies retained. | [F:offer-comparison][F:offer-comparison.test.tsx]; [B:AnalyticsSalary][B:AnalyticsSalaryTests]; [B:JobApplicationsEndpointBehavior][B:JobApplicationsEndpointBehaviorTests] | VS-SHELL/DASHBOARD/ANALYTICS links; offer page redesign and full comparison UI proof later. |
|
||||
| **PRES-J10** — CSV/JSON export, JSON import and CSV-to-JSON conversion | Entry / 01, 03 | `/settings; ImportExportJobs`; ImportExportJobs; CSV/job controller | JSON/CSV import/export stays Settings Data; contextual link without serializer changes. | [F:csv-export][F:csv-export.test.tsx]; [B:CsvExport][B:CsvExportTests]; [B:JobApplicationsController][B:JobApplicationsControllerTests] | VS-JOBS/SETTINGS link; B05 real CSV/formula/Unicode browser and backend tests retained. |
|
||||
| **PRES-W01** — Full workspace, sections, legacy links and optional reusable overlay | Direct / 03, 04a/b entry, 08a, 08b | `/jobs/:id; /applications/:id; section/followMode`; ApplicationWorkspacePage, jobWorkspaceRoute; workspace API | Dedicated page, aliases/return context and optional overlay props preserved; no new preview host. | [F:application-workspace-overlay][F:application-workspace-overlay.test.tsx]; [F:applicationWorkspace][F:applicationWorkspace.test.ts]; [B:ApplicationWorkspace][B:ApplicationWorkspaceTests] | G-WORKSPACE + package for 08b; VS-WORKSPACE full alias/dirty/missing/foreign/Back; NEW-10 deferred. |
|
||||
| **PRES-W02** — Detail/status/progression, recruiter/dates/description/timeline | Direct / 03, 04a/b, 08a, 08b | `/jobs/:id overview`; WorkspaceHeader, JobDetailsSection, ApplicationProgress/Timeline; workflow APIs | Status/next-step/timeline use same handlers; header/sections clearer, no progression engine. | [F:application-intelligence][F:application-intelligence.test.tsx]; [F:workflow-trust-signals][F:workflow-trust-signals.test.tsx]; [B:JobApplicationsWorkflowSignals][B:JobApplicationsWorkflowSignalsTests]; [B:JobApplicationsAppliedDateHistory][B:JobApplicationsAppliedDateHistoryTests] | VS-JOBS/BOARD/WORKSPACE; G-WORKSPACE and native package before affected composition; job revision behavior not redesigned. |
|
||||
| **PRES-W03** — Analysis, match/gaps, strategy and reviewed status/workflow suggestions | Entry then composition / 08a, 08b | `/jobs/:id?section=analysis`; ApplicationAnalysis/Match/StrategySnapshot/StatusSuggestion; intelligence/AI services | Match/analysis/strategy and review suggestions remain contextual; no implicit AI on open. | [F:application-intelligence][F:application-intelligence.test.tsx]; [F:application-workflow-assist][F:application-workflow-assist.test.tsx]; [B:ApplicationIntelligence][B:ApplicationIntelligenceTests]; [B:StrategySnapshotOperation][B:StrategySnapshotOperationTests] | VS-WORKSPACE source/unknown/locked/accept/reject; G-PACKAGE if tailored composition; real factual quality remains separate. |
|
||||
| **PRES-W04** — Checklist create/edit/complete/delete/order and next action | Composition / 08b | `Job overview/checklist entry`; ApplicationChecklist; checklist service/controller | Existing manual/system/dismissed checklist, order/progress retained under Notes & tasks. | [F:application-checklist][F:application-checklist.test.tsx]; [B:ApplicationChecklist][B:ApplicationChecklistTests] | G-WORKSPACE native reorder/dismiss/restore; VS-WORKSPACE keyboard controls; no due-date schema. |
|
||||
| **PRES-W05** — Attach/select/create/tailor CV and source context | Composition / 08b; CV 09–14 relationship regression | `Job CV section; builder deep link`; ApplicationCvSection/TailoringSection; ApplicationAssetsService | Preserve choose/create/attach/tailor/detach and single-job association; source/CV/job scopes explicit. | [F:application-assets][F:application-assets.test.tsx]; [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:ApplicationAssets][B:ApplicationAssetsTests]; [B:CvBuilder][B:CvBuilderTests] | G-PACKAGE + relevant G-CV gates; native attach/foreign-denied/detach-keeps-CV; VS-WORKSPACE/CV. |
|
||||
| **PRES-W06** — Cover-letter manual/AI review, versions/restore and dirty protection | Composition / 08b | `Job cover-letter section`; ApplicationCoverLetterSection, CoverLetterAiAssistant; assets/history | Same letter manual/AI review/history/dirty owner; explicit Current/proposed, no sender rewrite. | [F:application-assets][F:application-assets.test.tsx]; [F:application-workspace-overlay][F:application-workspace-overlay.test.tsx]; [B:ApplicationAssets][B:ApplicationAssetsTests] | G-WORKSPACE literal context/query repair plus G-PACKAGE; VS-WORKSPACE Reject/no-write, edited acceptance, versions and Cancel. |
|
||||
| **PRES-W07** — Application drafts and immutable submitted package/archived binaries | Composition / 08b; 14 relationship regression | `Job cover-letter drafts; CV section package history`; ApplicationPackageDraftsSection, SubmittedPackagesSection; package service/storage | Draft answers/current artifacts remain distinct from immutable frozen submission and external send. | [F:application-assets][F:application-assets.test.tsx]; [F:application-drafts][F:application-drafts.test.ts]; [B:SubmittedApplicationPackage][B:SubmittedApplicationPackageTests]; [B:JobApplicationsApplicationPackage][B:JobApplicationsApplicationPackageTests] | G-PACKAGE mandatory; VS-WORKSPACE/CV with native capture/archived bytes after source mutation, not mocked success. |
|
||||
| **PRES-W08** — Attachments upload/category/name/AI consent/preview/download/delete | Composition / 08b | `Job overview Documents accordion; package archive`; Attachments; AttachmentsController, AttachmentStorage | Attachments retain purpose, explicit AI-use consent, CRUD and protected downloads; no storage move. | [F:attachments][F:attachments.test.tsx]; [B:AttachmentsController][B:AttachmentsControllerTests]; [B:AttachmentConsistency][B:AttachmentConsistencyTests] | G-PACKAGE native archive/reference/foreign tests; VS-WORKSPACE upload/rename/consent/delete/available error. |
|
||||
| **PRES-W09** — Interview questions/answers/ready/manual removal/AI review | Composition / 08b | `Job interview section`; InterviewPrep; interview persistence/AI endpoints | Prep/questions/manual answers/AI review/readiness remain available, not inferred appointment data. | [F:interview-prep][F:interview-prep.test.tsx]; [B:InterviewPrepPersistence][B:InterviewPrepPersistenceTests]; [B:InterviewAiContext][B:InterviewAiContextTests] | VS-WORKSPACE review/locked/empty/long answer; G-WORKSPACE, no live model/scheduled interview claim. |
|
||||
| **PRES-W10** — Debrief/follow-up draft/date/readiness | Composition / 08b | `Job interview section; follow-up entry`; InterviewPrep; follow-up draft services | Debrief/outcome and follow-up drafts/date controls retained; no automatic send. | [F:interview-prep][F:interview-prep.test.tsx]; [B:JobApplicationsFollowUpDraft][B:JobApplicationsFollowUpDraftTests]; [B:InterviewPrep][B:InterviewPrepTests] | VS-WORKSPACE draft/error/return; timezone/provider gates if semantics change, otherwise retained evidence. |
|
||||
| **PRES-W11** — Reminder rules/actions/notifications, ICS and Google/Outlook events | Entry / 01, 02, 06; composition / 08a/b | `/reminders; job calendar actions; /settings`; RemindersView, RulesSettingsCard, ApplicationCalendarActions; calendar/rules APIs | Keep reminders/rules/bell and Google/Outlook follow-up/deadline/ICS distinctions. | [F:daily-control-loop][F:daily-control-loop.test.tsx]; [F:application-calendar][F:application-calendar.test.tsx]; [B:ApplicationCalendarController][B:ApplicationCalendarControllerTests]; [B:RulesEngineProspect][B:RulesEngineProspectTests] | VS-SHELL/UTILITY/DASHBOARD/WORKSPACE; F21/provider gaps remain, no new task/interview notification producer. |
|
||||
| **PRES-W12** — Async progress/failure/retry/cancel/notifications | Entry / 01, 02, 06, 08a/b | `/operations; profile processing`; OperationsPage, CareerProfilePage; operation store/worker | Operations utility, result links, progress/retry/cancel preserved; no new queue/worker behavior. | [F:operations-page][F:operations-page.test.tsx]; [F:profile-page][F:profile-page.test.tsx]; [B:OperationsController][B:OperationsControllerTests]; [B:UserOperationStore][B:UserOperationStoreTests] | VS-UTILITY/WORKSPACE delay/failure/cancel links; F20 runtime containment remains separate. |
|
||||
| **PRES-C01** — Canonical structured career data and long-tail/custom sections | Entry / 01; relationships / 08b, 10 | `/career?section=profile`; CareerProfilePage, career views; CareerProfileService/controller | Career Profile canonical owner unchanged, CV-specific edits/reset never mutate source implicitly. | [F:profile-page][F:profile-page.test.tsx]; [B:CareerProfileController][B:CareerProfileControllerTests]; [B:CareerProfileService][B:CareerProfileServiceTests] | G-CV-BEHAVIOR canonical/sibling readback; VS-CV scope labels; full Career page remains Phase 7. |
|
||||
| **PRES-C02** — Profile overview/completeness/import guidance/raw copy/history/restore | Entry / 01; source regression / 10 | `/career`; CareerWorkspacePage, CareerProfilePage; version service | Existing overview/import/raw/history/restore/completeness retained, not rebuilt as new features. | [F:career-workspace-page][F:career-workspace-page.test.tsx]; [F:profile-page][F:profile-page.test.tsx]; [B:CareerProfileService][B:CareerProfileServiceTests] | VS-SHELL source links, VS-CV source relation; native profile restore/full AT gaps retained. |
|
||||
| **PRES-C03** — Upload/extract/rebuild/reprocess/diff/select/accept/discard/retry/cancel | Entry / 01; regression only otherwise | `Career import/review`; CareerProfilePage; profile-CV/processing/diff services | Import/extraction/diff/accept/discard/reprocess remains on Career, no extraction UI migration. | [F:profile-page][F:profile-page.test.tsx]; [B:ProfileCvController][B:ProfileCvControllerTests]; [B:CvProfileDiffService][B:CvProfileDiffServiceTests] | VS-SHELL import entry; existing AI no-write tests; real unusual documents/low-confidence full browser gap remains. |
|
||||
| **PRES-C04** — Evidence bank source/category/tags/add/list/delete | Entry / 01; relationship regression / 08b | `Career overview/evidence`; CareerEvidenceBank; CareerEvidenceController | Evidence bank stays canonical; job tailoring references existing evidence only. | [F:career-evidence][F:career-evidence.test.tsx]; [B:CareerEvidenceController][B:CareerEvidenceControllerTests] | G-PACKAGE for evidence-backed tailoring; VS-WORKSPACE source context; full Evidence page later. |
|
||||
| **PRES-C05** — CV library create/copy/delete/templates/share/publication/PDF | Entry / 01; editor actions / 09, 14 | `/career/builder`; CvBuilderPage, thumbnails; CvVariantService/PublicCvController | Library/templates/CRUD untouched; editor duplicate/share/export and public slug ownership retained. | [F:cv-builder-page][F:cv-builder-page.test.tsx]; [F:cv-template-thumbnail][F:cv-template-thumbnail.test.tsx]; [B:CvBuilder][B:CvBuilderTests]; [B:PublicCvController][B:PublicCvControllerTests] | G-CV gates; native publish/unpublish/old-link revocation, library-to-editor control; VS-CV, library redesign Phase 7. |
|
||||
| **PRES-C06** — Studio tabs, preview debounce/pages/fit/save state/mobile panes | Direct / 09–14; tooltip/control / 00 | `/career/builder/:id`; CvBuilderEditor inline previewDocumentHtml/panes; preview API | Preserve five tabs/live preview/fit/save/mobile panes; editor composition and navigation improve. | [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:CvBuilder][B:CvBuilderTests] | G-CV-REV/RENDER/BEHAVIOR; VS-CV all tabs, saved/failed/resize/keyboard, retain P4 preview proof. |
|
||||
| **PRES-C07** — Visibility/order/custom sections and item/document overrides | Direct / 10, 12, 13; 09/11/14 regression | `Builder Content`; CvBuilderEditor, CV controls/useDragReorder; resolver/settings | All section/item/custom/inclusion/override settings retained, scoped edit/reset/review. | [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [F:cvBuilder][F:cvBuilder.test.ts]; [B:CvBuilder][B:CvBuilderTests] | G-CV gates plus item/source reset/ordering/hidden persistence proof; VS-CV, omitted state via labels not whole opacity. |
|
||||
| **PRES-C08** — Capability-aware templates/typography/color/header/skills/sidebar/photo | Direct / 11, 12; 09/14 regression | `Builder Template/Customize`; CvCustomizeTab, registry; ThemedCvRenderer | Every supported template/typography/color/photo/header/sidebar capability preserved under Advanced. | [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [F:cvBuilder][F:cvBuilder.test.ts]; [B:CvBuilder][B:CvBuilderTests] | G-CV-RENDER supported-control matrix; VS-CV Template/Customize + real output corpus, no template removal. |
|
||||
| **PRES-C09** — A4/Letter/density/margins/dates/document locale/section presentation | Direct / 11, 12; 09/14 regression | `Builder Customize/Content`; cvBuilder, CvCustomizeTab; settings normalization/render model | Keep A4/Letter/document density/margins/dates/language/columns, distinct from app density. | [F:cvBuilder][F:cvBuilder.test.ts]; [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:CvBuilder][B:CvBuilderTests] | G-CV-RENDER geometry measurements/full template defaults/risk-based combos; VS-CV PDF and UI, no all-combinations claim. |
|
||||
| **PRES-C10** — Undo/redo, save queue, dirty guard, history restore/preview lifecycle | Regression boundary / 09–14 | `Builder editor/history`; CvBuilderEditor; CvVariantService version history | Same single save owner, undo/redo/dirty/history restore-as-new-version; preserve separately accepted revision protocol. | [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:CvBuilder][B:CvBuilderTests] | G-CV-REV native two-client conflict and history/failed save tests; VS-CV history/undo/resize; never conflate B02. |
|
||||
| **PRES-C11** — Section and whole-document AI improve/translate/instruction/grammar review | Direct / 13; entry/composition / 10 | `Builder AI Tools/content assistant`; AiSectionAssistant, DocumentAiTab; CV AI assist | Retain section/whole AI validators/review/edit/accept/reject and source/target language. | [F:ai-section-assistant][F:ai-section-assistant.test.tsx]; [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:AiWorkspace][B:AiWorkspaceTests]; [B:AiPrivacyPolicy][B:AiPrivacyPolicyTests] | G-CV-BEHAVIOR reject/malformed-ID/late/source-changed cases; VS-CV AI; factual/provider truth remains qualified. |
|
||||
| **PRES-C12** — Private PDF and published anonymous CV/PDF, long searchable pages | Presentation / 11; 09–14 regression | `Builder export; /cv/:slug`; PublicCvPage, cvBuilder; HtmlPdfGenerator/shared admission | Same protected/private vs published PDF; preview/print relationship and B03 admission unchanged. | [F:public-cv-page][F:public-cv-page.test.tsx]; [B:PublicCvController][B:PublicCvControllerTests]; [B:PdfRenderAdmission][B:PdfRenderAdmissionTests] | G-CV-RENDER + native public/private/long searchable PDF/busy tests; VS-CV page evidence; deployed fonts unverified. |
|
||||
| **PRES-M01** — Job-scoped manual correspondence/search/delete/paste import | Entry / 01; composition / 08b | `Workspace communication accordion`; Correspondence; CorrespondenceController | Correspondence remains primary and job-contextual manual records/search/import/delete distinct from send. | [F:end-to-end-trust-loop][F:end-to-end-trust-loop.test.tsx]; [F:correspondence-search-context][F:correspondence-search-context.test.ts]; [B:CorrespondenceController][B:CorrespondenceControllerTests] | G-WORKSPACE; VS-WORKSPACE notes/mail distinctions; global inbox page not redesigned. |
|
||||
| **PRES-M02** — Gmail candidate/thread import/refresh/sync/unlink/relink/move | Entry / 01; composition / 08b | `Job communication Gmail tools`; Correspondence; GmailController/provider | Gmail job thread import/sync/link/unlink/move stays in existing owner. | [F:correspondence-gmail-import][F:correspondence-gmail-import.test.tsx]; [B:GmailController][B:GmailControllerTests]; [B:EmailOwnershipIntegration][B:EmailOwnershipIntegrationTests] | G-PACKAGE only for changed package relationships; VS-WORKSPACE provider-unavailable/links; actual provider sandbox gap retained. |
|
||||
| **PRES-M03** — Global inbox filters/page/provider/link/direction/detail/source links | Entry / 01 | `/correspondence`; CorrespondenceInboxPage; EmailController | Global inbox remains independently reachable with filters/page/provider/detail, not a Document file list. | [F:correspondence-inbox-page][F:correspondence-inbox-page.test.tsx]; [B:EmailController][B:EmailControllerTests]; [B:EmailOwnershipIntegration][B:EmailOwnershipIntegrationTests] | VS-SHELL primary entry; real large mailbox/attachment binary and inbox redesign remain Phase 7. |
|
||||
| **PRES-M04** — Compose/reply/provider/recipient/job; draft conflicts; confirm send/uncertainty | Entry / 01; 08b navigation regression | `/correspondence drafts/compose`; CorrespondenceInboxPage; EmailDrafts/Send/attempt store | Preserve draft revision/send confirm/uncertain attempt; no reparenting or generic form conversion. | [F:correspondence-inbox-page][F:correspondence-inbox-page.test.tsx]; [B:EmailDraftsController][B:EmailDraftsControllerTests]; [B:EmailDraftPersistence][B:EmailDraftPersistenceTests] | Existing draft/send service tests + native dirty navigation; VS-SHELL/WORKSPACE context; actual provider delivery remains separate. |
|
||||
| **PRES-M05** — Review proposed jobs/link/reject/keep/notes/sync/create | Entry / 01; 08b links | `/correspondence?view=review; /correspondence/review`; GmailReviewPage, CorrespondenceInboxPage; Gmail review | Review alias/decisions/create proposal retained; no auto-create from navigation. | [F:gmail-review-page][F:gmail-review-page.test.tsx]; [F:correspondence-inbox-page][F:correspondence-inbox-page.test.tsx]; [B:GmailController][B:GmailControllerTests] | VS-SHELL alias and VS-WORKSPACE links; existing review tests, real provider review gap unchanged. |
|
||||
| **PRES-M06** — Gmail/Graph/IMAP connect/status/disconnect separate from sign-in | Entry / 01, 02 links | `/settings/connected-accounts`; EmailProviderConnections; Google/Graph/IMAP controllers | Connections accessible from Settings/account; sign-in and mail/calendar authorization stay separate. | [F:email-provider-connections][F:email-provider-connections.test.tsx]; [B:MicrosoftGraphController][B:MicrosoftGraphControllerTests]; [B:ImapController][B:ImapControllerTests] | VS-SHELL/UTILITY connection links; API ownership/provider tests; real reconnect/expired tokens unverified. |
|
||||
| **PRES-S01** — Personal metrics/activity/funnel/company/skills/stage/salary/next actions | Direct / 06, 07 | `/dashboard`; DashboardView; analytics/controllers | Existing reports/next actions redesigned with accurate labels and detailed Analytics destination. | [F:daily-control-loop][F:daily-control-loop.test.tsx]; [F:workflow-trust-signals][F:workflow-trust-signals.test.tsx]; [B:StageAnalytics][B:StageAnalyticsTests]; [B:AnalyticsSalary][B:AnalyticsSalaryTests] | G-METRICS exact populations/periods/chart transforms; VS-DASHBOARD/ANALYTICS; unsupported NEW metrics deferred. |
|
||||
| **PRES-S02** — Owner-local five visibility preferences/onboarding dismiss/notifications | Direct / 01, 02, 06, 07 | `/dashboard; notification bell`; DashboardView, OnboardingChecklist, NotificationsPopover; notification APIs | Same notification store/onboarding and five owner-local visibility flags; no layout persistence rewrite. | [F:onboarding-checklist][F:onboarding-checklist.test.tsx]; [F:notifications-popover][F:notifications-popover.test.tsx]; [B:JobLifecycleEvent][B:JobLifecycleEventTests] | G-SHELL/G-METRICS real A/B toggles/reload/read/dismiss proof; VS-UTILITY/DASHBOARD; Phase 8 order/resize/reset deferred. |
|
||||
| **PRES-S03** — Rules/reminder/table/theme/language preferences and account links | Entry/control / 00, 01, 02; table prefs / 03, 04b | `/settings tabs/mobile selector`; SettingsView, RulesSettingsCard, theme/i18n; rules/notification/auth | Settings P4 primitives and independent saves retained; UI density local; table prefs/current theme handlers same. | [F:settings-view][F:settings-view.test.tsx]; [F:theme-state][F:theme-state.test.tsx]; [B:NotificationSettingsController][B:NotificationSettingsControllerTests]; [B:RulesEngineProspect][B:RulesEngineProspectTests] | VS-SETTINGS/JOBS; native saves/error, router preference lifetime tests; SQLite concurrent write issue remains separate. |
|
||||
| **PRES-S04** — AI privacy/usage/limits/Free-Pro/server entitlement/conditional billing | Entry / 01; AI locks / 08b, 13, 14 | `/settings; locked AI controls; plans`; AiPrivacySettingsCard, AiUsageCard, AccountPlanProvider; billing/entitlement | Privacy/usage/entitlements/current billing availability retained; no invented prices/trials. | [F:settings-view][F:settings-view.test.tsx]; [F:ai-usage-card][F:ai-usage-card.test.tsx]; [B:AiPrivacyPolicy][B:AiPrivacyPolicyTests]; [B:AiUsageMeter][B:AiUsageMeterTests] | Existing server Free/Pro/AI policy tests, VS-CV/WORKSPACE locked/unavailable; live billing/provider gaps retained. |
|
||||
| **PRES-S05** — Account ZIP/encrypted backup/lifecycle/deletion confirmations | Entry/control / 00, 01 | `Settings Backup tab`; BackupCard; export/backup/deletion services | Settings ZIP/backup/deletion guards unchanged; export toast safely coexists with page actions. | [F:account-data-export][F:account-data-export.test.tsx]; [B:AccountDataExport][B:AccountDataExportTests]; [B:BackupController][B:BackupControllerTests] | VS-SETTINGS open toast/download; restore/paid-deletion/provider cleanup still separate release prerequisites. |
|
||||
| **PRES-A01** — Admin user/create/roles/reset/delete/last-admin/self guards | Entry / 01 | `/admin/users`; AdminUsersPage; UsersController | Authorized Admin Users remains; hidden menu never substitutes for server role/last-admin guards. | [F:admin-users-page][F:admin-users-page.test.tsx]; [B:UsersController][B:UsersControllerTests]; [B:ApiAuthorizationPosture][B:ApiAuthorizationPostureTests] | VS-SHELL admin/non-admin/denied deep link; role revocation/full admin mutations remain separate. |
|
||||
| **PRES-A02** — Audit list/detail/supported undo/job restore | Entry / 01 | `/admin/audit`; AdminAuditPage; AdminAuditController | Authorized Admin Audit/list/undo/restore retained; no analytics substitute. | [F:admin-audit-page][F:admin-audit-page.test.tsx]; [B:AuthAndSystemController][B:AuthAndSystemControllerTests]; [B:ApiAuthorizationPosture][B:ApiAuthorizationPostureTests] | VS-SHELL audit entry; existing backend/frontend evidence; native undo UI gap remains Phase 7. |
|
||||
| **PRES-A03** — System/build/DB/AI/mail/SMTP/test/probe/benchmark/maintenance | Entry/metadata / 00, 01 | `/admin/system`; AdminSystemPage; AdminSystemController/maintenance/benchmark | Authorized Admin System and version metadata retained; no invented aggregate dashboard. | [F:admin-system-page][F:admin-system-page.test.tsx]; [B:AuthAndSystemController][B:AuthAndSystemControllerTests]; [B:MaintenanceJobDispatcher][B:MaintenanceJobDispatcherTests] | G-SHELL long metadata at 320; VS-SHELL admin/non-admin; runtime probes/delivery/maintenance not executed. |
|
||||
|
||||
## Inherited gaps and test additions required
|
||||
|
||||
Additional current foundation anchors: [semantic loaded/focus](../../../job-tracker-ui/e2e/semantic-foundations.spec.ts), [named controls/dialogs](../../../job-tracker-ui/e2e/named-controls-modal-state.spec.ts), [preview keyboard](../../../job-tracker-ui/e2e/builder-preview-keyboard.spec.ts), [Settings layout](../../../job-tracker-ui/e2e/settings-page-layout.spec.ts), [Jobs/Trash density](../../../job-tracker-ui/e2e/table-density.spec.ts), [density behavior](../../../job-tracker-ui/src/job-table-density.test.tsx), [native preservation/package expected failure](../../../job-tracker-ui/e2e/redesign-preservation.spec.ts), [account isolation](../../../job-tracker-ui/e2e/account-isolation.spec.ts) and [command preservation](../../../job-tracker-ui/src/quick-command-preservation.test.tsx). These supplement each applicable row; they are not new tests in this checkpoint.
|
||||
|
||||
The selected references do not replace the full original gap column. Provider-dependent auth/mail/calendar/AI/Stripe, restored production backup and rollback, real touch/AT/zoom, full advanced rendering combinations and F04 remain qualified in [OPEN_BLOCKERS](OPEN_BLOCKERS.md). P4-06's target naming/preview fixes are retained; its incomplete axe checks are not passes. No new tests are written in this planning checkpoint.
|
||||
|
||||
Before each slice, copy its exact sub-workflows and existing test names into the implementation trace, add missing native/negative/dirty/error fixtures from the plan, then modify the owner. Shared shell changes must run real account-switch/permission regressions; service mocks cannot prove browser state disposal. Board population parity needs >25 native records. Packages need successful capture and post-mutation archived bytes. CV needs source/sibling/item/reset/history/two-client and real PDF evidence. Analytics needs actual value/period transformations and owner preference readback, not assertions that cards render.
|
||||
|
||||
Route completeness is separately checked in [NAVIGATION_MIGRATION](NAVIGATION_MIGRATION.md): 31 original patterns including both aliases; new Analytics only when meaningful. Retained entry-only surfaces stay available without UI migration. This is preservation planning, not a statement that all 57 groups are ready for full redesign.
|
||||
|
||||
[F:landing-page.test.tsx]: ../../../job-tracker-ui/src/landing-page.test.tsx
|
||||
[F:planCatalog.test.ts]: ../../../job-tracker-ui/src/planCatalog.test.ts
|
||||
[B:AccountPlansTests]: ../../../JobTrackerApi.Tests/AccountPlansTests.cs
|
||||
[F:login-page.test.tsx]: ../../../job-tracker-ui/src/login-page.test.tsx
|
||||
[F:verify-email-page.test.tsx]: ../../../job-tracker-ui/src/verify-email-page.test.tsx
|
||||
[B:LocalAuthIdentityTests]: ../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs
|
||||
[B:AuthAndSystemControllerTests]: ../../../JobTrackerApi.Tests/AuthAndSystemControllerTests.cs
|
||||
[F:microsoft-legacy-relink-page.test.tsx]: ../../../job-tracker-ui/src/microsoft-legacy-relink-page.test.tsx
|
||||
[B:GoogleTokenValidatorTests]: ../../../JobTrackerApi.Tests/GoogleTokenValidatorTests.cs
|
||||
[B:MicrosoftTokenValidatorTests]: ../../../JobTrackerApi.Tests/MicrosoftTokenValidatorTests.cs
|
||||
[F:two-factor-settings.test.tsx]: ../../../job-tracker-ui/src/two-factor-settings.test.tsx
|
||||
[B:TwoFactorControllerTests]: ../../../JobTrackerApi.Tests/TwoFactorControllerTests.cs
|
||||
[B:SessionsControllerTests]: ../../../JobTrackerApi.Tests/SessionsControllerTests.cs
|
||||
[F:session-boundary.test.ts]: ../../../job-tracker-ui/src/session-boundary.test.ts
|
||||
[F:account-scoped-state.test.tsx]: ../../../job-tracker-ui/src/account-scoped-state.test.tsx
|
||||
[B:AuthSessionRevocationTests]: ../../../JobTrackerApi.Tests/AuthSessionRevocationTests.cs
|
||||
[F:profile-page.test.tsx]: ../../../job-tracker-ui/src/profile-page.test.tsx
|
||||
[B:AvatarStorageTests]: ../../../JobTrackerApi.Tests/AvatarStorageTests.cs
|
||||
[F:sidebar-active-nav.test.ts]: ../../../job-tracker-ui/src/sidebar-active-nav.test.ts
|
||||
[F:app-shell-notifications.test.tsx]: ../../../job-tracker-ui/src/app-shell-notifications.test.tsx
|
||||
[F:quick-command-preservation.test.tsx]: ../../../job-tracker-ui/src/quick-command-preservation.test.tsx
|
||||
[B:JobApplicationsAuthorizationTests]: ../../../JobTrackerApi.Tests/JobApplicationsAuthorizationTests.cs
|
||||
[B:CompanyRelationshipTests]: ../../../JobTrackerApi.Tests/CompanyRelationshipTests.cs
|
||||
[F:theme-state.test.tsx]: ../../../job-tracker-ui/src/theme-state.test.tsx
|
||||
[F:i18n-provider.test.tsx]: ../../../job-tracker-ui/src/i18n-provider.test.tsx
|
||||
[B:SessionContextMiddlewareTests]: ../../../JobTrackerApi.Tests/SessionContextMiddlewareTests.cs
|
||||
[B:CurrentUserIdLiveEvaluationTests]: ../../../JobTrackerApi.Tests/CurrentUserIdLiveEvaluationTests.cs
|
||||
[F:job-discovery.test.tsx]: ../../../job-tracker-ui/src/job-discovery.test.tsx
|
||||
[B:JobDiscoveryControllerTests]: ../../../JobTrackerApi.Tests/JobDiscoveryControllerTests.cs
|
||||
[B:JobOpportunitySyncTests]: ../../../JobTrackerApi.Tests/JobOpportunitySyncTests.cs
|
||||
[B:SavedJobSearchAlertTests]: ../../../JobTrackerApi.Tests/SavedJobSearchAlertTests.cs
|
||||
[F:quick-capture.test.tsx]: ../../../job-tracker-ui/src/quick-capture.test.tsx
|
||||
[B:JobImportServiceTests]: ../../../JobTrackerApi.Tests/JobImportServiceTests.cs
|
||||
[B:JobImportHttpTransportTests]: ../../../JobTrackerApi.Tests/JobImportHttpTransportTests.cs
|
||||
[B:JobApplicationsControllerTests]: ../../../JobTrackerApi.Tests/JobApplicationsControllerTests.cs
|
||||
[F:captureUrl.test.ts]: ../../../job-tracker-ui/src/captureUrl.test.ts
|
||||
[B:CvBuilderTests]: ../../../JobTrackerApi.Tests/CvBuilderTests.cs
|
||||
[F:application-workspace-overlay.test.tsx]: ../../../job-tracker-ui/src/application-workspace-overlay.test.tsx
|
||||
[F:daily-control-loop.test.tsx]: ../../../job-tracker-ui/src/daily-control-loop.test.tsx
|
||||
[B:JobApplicationsEndpointBehaviorTests]: ../../../JobTrackerApi.Tests/JobApplicationsEndpointBehaviorTests.cs
|
||||
[F:confirm-flow.test.tsx]: ../../../job-tracker-ui/src/confirm-flow.test.tsx
|
||||
[B:JobLifecycleEventTests]: ../../../JobTrackerApi.Tests/JobLifecycleEventTests.cs
|
||||
[F:kanban-grouped-board.test.tsx]: ../../../job-tracker-ui/src/kanban-grouped-board.test.tsx
|
||||
[F:pipeline.test.ts]: ../../../job-tracker-ui/src/pipeline.test.ts
|
||||
[B:JobPipelineTests]: ../../../JobTrackerApi.Tests/JobPipelineTests.cs
|
||||
[F:companies-relationship.test.tsx]: ../../../job-tracker-ui/src/companies-relationship.test.tsx
|
||||
[F:offer-comparison.test.tsx]: ../../../job-tracker-ui/src/offer-comparison.test.tsx
|
||||
[B:AnalyticsSalaryTests]: ../../../JobTrackerApi.Tests/AnalyticsSalaryTests.cs
|
||||
[F:csv-export.test.tsx]: ../../../job-tracker-ui/src/csv-export.test.tsx
|
||||
[B:CsvExportTests]: ../../../JobTrackerApi.Tests/CsvExportTests.cs
|
||||
[F:applicationWorkspace.test.ts]: ../../../job-tracker-ui/src/applicationWorkspace.test.ts
|
||||
[B:ApplicationWorkspaceTests]: ../../../JobTrackerApi.Tests/ApplicationWorkspaceTests.cs
|
||||
[F:application-intelligence.test.tsx]: ../../../job-tracker-ui/src/application-intelligence.test.tsx
|
||||
[F:workflow-trust-signals.test.tsx]: ../../../job-tracker-ui/src/workflow-trust-signals.test.tsx
|
||||
[B:JobApplicationsWorkflowSignalsTests]: ../../../JobTrackerApi.Tests/JobApplicationsWorkflowSignalsTests.cs
|
||||
[B:JobApplicationsAppliedDateHistoryTests]: ../../../JobTrackerApi.Tests/JobApplicationsAppliedDateHistoryTests.cs
|
||||
[F:application-workflow-assist.test.tsx]: ../../../job-tracker-ui/src/application-workflow-assist.test.tsx
|
||||
[B:ApplicationIntelligenceTests]: ../../../JobTrackerApi.Tests/ApplicationIntelligenceTests.cs
|
||||
[B:StrategySnapshotOperationTests]: ../../../JobTrackerApi.Tests/StrategySnapshotOperationTests.cs
|
||||
[F:application-checklist.test.tsx]: ../../../job-tracker-ui/src/application-checklist.test.tsx
|
||||
[B:ApplicationChecklistTests]: ../../../JobTrackerApi.Tests/ApplicationChecklistTests.cs
|
||||
[F:application-assets.test.tsx]: ../../../job-tracker-ui/src/application-assets.test.tsx
|
||||
[F:cv-builder-deep-link.test.tsx]: ../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx
|
||||
[B:ApplicationAssetsTests]: ../../../JobTrackerApi.Tests/ApplicationAssetsTests.cs
|
||||
[F:application-drafts.test.ts]: ../../../job-tracker-ui/src/application-drafts.test.ts
|
||||
[B:SubmittedApplicationPackageTests]: ../../../JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs
|
||||
[B:JobApplicationsApplicationPackageTests]: ../../../JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs
|
||||
[F:attachments.test.tsx]: ../../../job-tracker-ui/src/attachments.test.tsx
|
||||
[B:AttachmentsControllerTests]: ../../../JobTrackerApi.Tests/AttachmentsControllerTests.cs
|
||||
[B:AttachmentConsistencyTests]: ../../../JobTrackerApi.Tests/AttachmentConsistencyTests.cs
|
||||
[F:interview-prep.test.tsx]: ../../../job-tracker-ui/src/interview-prep.test.tsx
|
||||
[B:InterviewPrepPersistenceTests]: ../../../JobTrackerApi.Tests/InterviewPrepPersistenceTests.cs
|
||||
[B:InterviewAiContextTests]: ../../../JobTrackerApi.Tests/InterviewAiContextTests.cs
|
||||
[B:InterviewPrepTests]: ../../../JobTrackerApi.Tests/InterviewPrepTests.cs
|
||||
[B:JobApplicationsFollowUpDraftTests]: ../../../JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs
|
||||
[F:application-calendar.test.tsx]: ../../../job-tracker-ui/src/application-calendar.test.tsx
|
||||
[F:settings-view.test.tsx]: ../../../job-tracker-ui/src/settings-view.test.tsx
|
||||
[B:ApplicationCalendarControllerTests]: ../../../JobTrackerApi.Tests/ApplicationCalendarControllerTests.cs
|
||||
[B:RulesEngineProspectTests]: ../../../JobTrackerApi.Tests/RulesEngineProspectTests.cs
|
||||
[B:NotificationSettingsControllerTests]: ../../../JobTrackerApi.Tests/NotificationSettingsControllerTests.cs
|
||||
[F:operations-page.test.tsx]: ../../../job-tracker-ui/src/operations-page.test.tsx
|
||||
[B:OperationsControllerTests]: ../../../JobTrackerApi.Tests/OperationsControllerTests.cs
|
||||
[B:UserOperationStoreTests]: ../../../JobTrackerApi.Tests/UserOperationStoreTests.cs
|
||||
[B:CareerProfileControllerTests]: ../../../JobTrackerApi.Tests/CareerProfileControllerTests.cs
|
||||
[B:CareerProfileServiceTests]: ../../../JobTrackerApi.Tests/CareerProfileServiceTests.cs
|
||||
[F:career-workspace-page.test.tsx]: ../../../job-tracker-ui/src/career-workspace-page.test.tsx
|
||||
[B:ProfileCvControllerTests]: ../../../JobTrackerApi.Tests/ProfileCvControllerTests.cs
|
||||
[B:CvProfileDiffServiceTests]: ../../../JobTrackerApi.Tests/CvProfileDiffServiceTests.cs
|
||||
[F:career-evidence.test.tsx]: ../../../job-tracker-ui/src/career-evidence.test.tsx
|
||||
[B:CareerEvidenceControllerTests]: ../../../JobTrackerApi.Tests/CareerEvidenceControllerTests.cs
|
||||
[F:cv-builder-page.test.tsx]: ../../../job-tracker-ui/src/cv-builder-page.test.tsx
|
||||
[F:cv-template-thumbnail.test.tsx]: ../../../job-tracker-ui/src/cv-template-thumbnail.test.tsx
|
||||
[B:PublicCvControllerTests]: ../../../JobTrackerApi.Tests/PublicCvControllerTests.cs
|
||||
[F:cvBuilder.test.ts]: ../../../job-tracker-ui/src/cvBuilder.test.ts
|
||||
[F:ai-section-assistant.test.tsx]: ../../../job-tracker-ui/src/ai-section-assistant.test.tsx
|
||||
[B:AiWorkspaceTests]: ../../../JobTrackerApi.Tests/AiWorkspaceTests.cs
|
||||
[B:AiPrivacyPolicyTests]: ../../../JobTrackerApi.Tests/AiPrivacyPolicyTests.cs
|
||||
[F:public-cv-page.test.tsx]: ../../../job-tracker-ui/src/public-cv-page.test.tsx
|
||||
[B:PdfRenderAdmissionTests]: ../../../JobTrackerApi.Tests/PdfRenderAdmissionTests.cs
|
||||
[F:end-to-end-trust-loop.test.tsx]: ../../../job-tracker-ui/src/end-to-end-trust-loop.test.tsx
|
||||
[F:correspondence-search-context.test.ts]: ../../../job-tracker-ui/src/correspondence-search-context.test.ts
|
||||
[B:CorrespondenceControllerTests]: ../../../JobTrackerApi.Tests/CorrespondenceControllerTests.cs
|
||||
[F:correspondence-gmail-import.test.tsx]: ../../../job-tracker-ui/src/correspondence-gmail-import.test.tsx
|
||||
[B:GmailControllerTests]: ../../../JobTrackerApi.Tests/GmailControllerTests.cs
|
||||
[B:EmailOwnershipIntegrationTests]: ../../../JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs
|
||||
[F:correspondence-inbox-page.test.tsx]: ../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx
|
||||
[B:EmailControllerTests]: ../../../JobTrackerApi.Tests/EmailControllerTests.cs
|
||||
[B:EmailDraftsControllerTests]: ../../../JobTrackerApi.Tests/EmailDraftsControllerTests.cs
|
||||
[B:EmailDraftPersistenceTests]: ../../../JobTrackerApi.Tests/EmailDraftPersistenceTests.cs
|
||||
[F:gmail-review-page.test.tsx]: ../../../job-tracker-ui/src/gmail-review-page.test.tsx
|
||||
[F:email-provider-connections.test.tsx]: ../../../job-tracker-ui/src/email-provider-connections.test.tsx
|
||||
[B:MicrosoftGraphControllerTests]: ../../../JobTrackerApi.Tests/MicrosoftGraphControllerTests.cs
|
||||
[B:ImapControllerTests]: ../../../JobTrackerApi.Tests/ImapControllerTests.cs
|
||||
[B:StageAnalyticsTests]: ../../../JobTrackerApi.Tests/StageAnalyticsTests.cs
|
||||
[F:onboarding-checklist.test.tsx]: ../../../job-tracker-ui/src/onboarding-checklist.test.tsx
|
||||
[F:notifications-popover.test.tsx]: ../../../job-tracker-ui/src/notifications-popover.test.tsx
|
||||
[F:ai-usage-card.test.tsx]: ../../../job-tracker-ui/src/ai-usage-card.test.tsx
|
||||
[B:AiUsageMeterTests]: ../../../JobTrackerApi.Tests/AiUsageMeterTests.cs
|
||||
[F:account-data-export.test.tsx]: ../../../job-tracker-ui/src/account-data-export.test.tsx
|
||||
[B:AccountDataExportTests]: ../../../JobTrackerApi.Tests/AccountDataExportTests.cs
|
||||
[B:BackupControllerTests]: ../../../JobTrackerApi.Tests/BackupControllerTests.cs
|
||||
[F:admin-users-page.test.tsx]: ../../../job-tracker-ui/src/admin-users-page.test.tsx
|
||||
[B:UsersControllerTests]: ../../../JobTrackerApi.Tests/UsersControllerTests.cs
|
||||
[B:ApiAuthorizationPostureTests]: ../../../JobTrackerApi.Tests/ApiAuthorizationPostureTests.cs
|
||||
[F:admin-audit-page.test.tsx]: ../../../job-tracker-ui/src/admin-audit-page.test.tsx
|
||||
[F:admin-system-page.test.tsx]: ../../../job-tracker-ui/src/admin-system-page.test.tsx
|
||||
[B:MaintenanceJobDispatcherTests]: ../../../JobTrackerApi.Tests/MaintenanceJobDispatcherTests.cs
|
||||
@@ -0,0 +1,75 @@
|
||||
# Phase 5 readiness gates
|
||||
|
||||
Planning at `2a2f9e48052c562ef599825458d0d3a6f9f9fc61`. **None of these gates is closed by writing this document.** [P4-06](../phase-4/p4-06/README.md) permits planning, not unqualified implementation. Gate IDs below are planning references, not replacements for defect/PRES IDs.
|
||||
|
||||
## G-SHELL — P5-00, before P5-01 starts
|
||||
|
||||
P5-00 is required. Resolve these narrowly against the **existing** shell first, with regression evidence before regrouping or restyling it. This separates baseline remediation from redesign regressions.
|
||||
|
||||
| Existing condition | Bounded prerequisite / responsible owner | Required exit evidence |
|
||||
|---|---|---|
|
||||
| P4-06-O01: persisted desktop collapse hides mobile labels and puts first focus under the app bar | `AppShell`: separate the mobile presentation decision from the saved desktop preference; correct drawer/header focus occlusion using existing MUI mechanics | Collapse → reload → 320/390px → open drawer: all labels visible, first and last links reachable and hit-testable, focus not obscured; Escape returns to trigger; return to desktop retains collapse. Expanded control and 767/768 boundary also pass |
|
||||
| P4-06-O02: long synthetic admin version badge overlaps narrow header | Same owner: bounded metadata reflow/disclosure; retain admin-only version and commit access | Admin/non-admin, long name/version, EN/NB, both themes at 320px. No logo/control overlap; no loss of metadata or accidental public exposure. Do not claim actual production badge overlap was proven |
|
||||
| P4-02-D01: command results render non-list children under a list | `QuickCommandDialog`: correct list/result and empty-state semantics using native/MUI elements, retain existing callbacks | Loaded, empty and keyboard result activation; axe `list` finding absent; Add still opens review without POST, company opens `?edit=id`, job opens its exact ID; focus return works. Arrow-key command expansion belongs to P5-02 |
|
||||
| P4-03-D01: light Redo Tooltip contrast 3.89:1 | Shared `theme.ts` Tooltip foreground/background pair only | Actual loaded Redo plus shell/table tooltip in both themes, hover and focus: ordinary text ≥4.5:1; remove only the repaired narrow expected contrast exception after proof. Preserve tooltip naming/focus and other semantic pairs |
|
||||
| P4-04-O01: fixed toast overlaps bottom actions | `toast.tsx`/its existing Snackbar placement boundary: smallest placement/reserved-space treatment needed for actionable feedback and underlying actions to remain reachable | Trigger export toast while Connections is visible at 320/390px and desktop; inspect while toast is **open**, keyboard/hit-test both actions, dismiss/action callback and return. Waiting 3.5 seconds is not repair. Keep message lifetime/provider/auth ownership; no notification framework |
|
||||
|
||||
These five conditions share shell exposure, not one architectural root cause. Implement/review them as small sub-diffs in one readiness checkpoint; do not create a general overlay manager. If toast placement requires broad page architecture, pause that item and report the concrete blocker rather than hiding it in P5-01.
|
||||
|
||||
Also extend the existing real-App fixture for collapse, drawer close versus route selection, command/account/notification disposal on account switch, dirty-navigation Cancel/Discard and theme/language changes while editing. Preserve providers and router lifetime. Current router memoization still depends on table page-size/column preferences; do not change those owners in P5-00/01. Characterize their behavior for P5-03 separately.
|
||||
|
||||
Exit: focused reproduction now passes, no general axe exclusions, final complete baseline passes with count deltas explained, EN/NB × light/dark shell evidence reviewed, issue statuses updated individually. P2-D01 remains the separately identified expected failure. **P5-01 is not cleared at this planning checkpoint.** A successful, separately authorized P5-00 checkpoint is its entry gate.
|
||||
|
||||
## G-JOBS — before table/board consolidation
|
||||
|
||||
Before P5-03, extend PRES-J05/J06 behavioral coverage for saved-view create/select/delete, filtered selection, partial bulk failures, column/page preferences, custom-status URLs, Back/refresh, capture review without writes and 320px actions. Preserve current local Comfortable default; density is neither server-persisted nor a CV setting.
|
||||
|
||||
Before P5-04b, prove the actual data contract. `JobTable` calls paginated `/jobapplications` with search/company/status/location/readiness/follow-up/sort/deletion filters. `KanbanBoard` calls `/jobapplications/board` without those parameters; that API accepts only `includeDeleted`, returns all matching non-deleted records by default and has its own ordering. **Parity does not exist today.**
|
||||
|
||||
P5-04a can restyle the board at `/kanban` using its existing data. P5-04b is blocked on a separately reviewed, owner-scoped read contract supporting the same filter population without silently changing the all-record board into one table page. Define completeness, stable ordering, bounded loading/pagination, page-size interpretation and mutation refresh; test more than 25 jobs, unknown statuses, filtered-out moves and partial failures. No browser crawl across every table page, client-only approximation of readiness, or redirect with silently dropped filters. If backend work is required, authorize it separately; no schema or generic query framework is implied. Keep `/kanban` live until this proof exists. This gate does not delay Dashboard.
|
||||
|
||||
## G-PACKAGE — native preservation before package/tailoring restructuring
|
||||
|
||||
P2-D01 is reproduced SQLite `DateTimeOffset` ordering failure in `ApplicationAssetsService.GetTailoringPlanAsync` and `SubmittedApplicationPackageService.CaptureAsync`. Existing service tests do not prove native success. The browser expected-failure branch is entered only for the observed capture 500; its historical archive checks have not run successfully.
|
||||
|
||||
Required separately authorized repair/proof:
|
||||
|
||||
1. Real disposable API: account, canonical profile, two variants, job, cover letter, answer draft and attachment; tailoring GET and native capture succeed.
|
||||
2. Record package identity/source versions; mutate live CV/profile/letter and delete live attachment. Frozen HTML/letter/answers and exact archived binary stay unchanged and downloadable.
|
||||
3. Cross-owner read/reference/download denied; detach preserves variant; current single-job CV association is not converted into many-to-many. Source-copy failure and retry are explicit, not a successful incomplete package.
|
||||
4. Native restore/readback and backend/provider compatibility tests pass. Remove P2-D01 annotation only after the original failure and post-capture assertions pass; record the intentional browser count transition.
|
||||
|
||||
Blocks P5-08b section/application/document restructuring, related CV tailoring changes, and any future global document index. Does **not** block P5-00–03, P5-04a, existing-data P5-06/07 or P5-08a's bounded header/overview work. No package changes in the shell or dashboard.
|
||||
|
||||
## G-CV-REV — server revision safety before broad CV migration
|
||||
|
||||
F01/audit D01 remains open. Current `CvVariantService.SaveAsync(owner,id,name,settings,source,ct)` owner-loads and increments `Version`; it has no expected-revision parameter/comparison. Restore calls Save. The browser queue serializes one mounted editor only. B02 account identity, stale-record conflicts and creation idempotency are three separate contracts.
|
||||
|
||||
Missing proof: two independent same-account clients load vN; A saves vN+1; B's stale save/restore cannot overwrite A; deterministic conflict/reload/review handling preserves B's unsaved work; canonical-source edits and variant resets have explicit version semantics; legitimate retry/reload/history/undo succeed. Owner isolation must continue to hold. Relevant job/profile lost-update semantics must be resolved before **changing their persistence**, not silently rebuilt by a UI slice.
|
||||
|
||||
This is separate integrity work, not authorization to start B07 or implement a concurrency framework. Any schema requirement invokes existing restore/rollback readiness first. Serialize all edits to `CvBuilderEditor` with that work. Blocks P5-09–14. Shell-only route entry and the existing isolated preview keyboard protection can remain in use meanwhile.
|
||||
|
||||
## G-CV-RENDER — geometry, templates and real output
|
||||
|
||||
The renderer is shared, but preview is not a byte-for-byte PDF rendering: `CvBuilderEditor.previewDocumentHtml` injects page padding, a pagination script and per-page transforms into server HTML. `CvCustomizeTab`, normalized settings and `ThemedCvRenderer` also influence layout. P4-03 proved keyboard access, not margin accuracy or document-theme fidelity.
|
||||
|
||||
Before P5-09–14, obtain a dedicated rendering checkpoint, with corrections separately authorized if needed:
|
||||
|
||||
- Inventory actual saved template IDs/capabilities and supported control combinations. Retain every current template, including Code, plus unsupported-setting normalization and old saved settings.
|
||||
- Agree expected A4/Letter page geometry, supported margin extremes, header/sidebar/column behavior, section gaps and overflow indications. Compare the same persisted settings/source revision in live preview and actual downloaded PDF, not just page count.
|
||||
- Render one/long multi-page EN and NB CVs with long headings, section/item hiding, grid/bubbles, columns, photo, dates, page density and template typography. Cover every template at defaults and a risk-based supported-settings matrix; state exclusions explicitly rather than promise every Cartesian combination.
|
||||
- Record measured margins/page dimensions, text extraction/searchability and images of every compared page; review page breaks, clipping, missing/duplicated text and blank-page/whitespace anomalies. Validate local fonts/Chromium and separately identify deployed renderer differences.
|
||||
- Exercise preview delay/out-of-order failure/Retry, undo/reload, public versus private PDF and B03 busy/cancel/recovery. Opening tabs or previews must not bypass shared PDF admission.
|
||||
|
||||
This is where the reported incorrect margins/templates must be understood and corrected; **P5-11's UI migration is not a substitute for that repair**. Scope expected output before changing geometry. A major rendering replacement is not implicitly authorized.
|
||||
|
||||
## Other scoped gates and safe progress
|
||||
|
||||
| Gate | Entry condition / scope | Does not block |
|
||||
|---|---|---|
|
||||
| G-METRICS | Before P5-06/07: exact source/population/period/sample labels from Phase 3; browser tests for transformations, all five owner visibility flags and error vs zero | Shell, Jobs |
|
||||
| G-WORKSPACE | Before P5-08a: reproduce/protect mobile progress-scroll accessibility. Before 08b: section/query/`followMode` retention, draft/AI review guards and all legacy mappings; G-PACKAGE also required | Table, independent charts |
|
||||
| G-CV-BEHAVIOR | Before each CV slice: source/reset/item override, browser history restore, reorder alternatives, save failure and AI accept/reject regression required by its PRES rows, in addition to G-CV-REV/RENDER | Non-editor pages; planning/fixture specification may proceed |
|
||||
| G-RELEASE | F04 deployed peer/listeners/ports/firewall/NAT/IPv6/DNS/TLS/restarts; production CI/browser runner, providers, backup/restore/rollback and relevant billing/configuration evidence | Local feature-branch UI planning/testing; never grants production approval |
|
||||
|
||||
Career Profile, CV library, full Documents/Notifications, mail, Settings and Admin page migrations remain Phase 7. New dashboard layout customization remains Phase 8. No global document/AI/admin/notification producer is invented to complete navigation. If CV gates remain open, finish independent representative slices and report partial/conditional Phase 5 acceptance with CV explicitly deferred; do not claim the full representative set was implemented.
|
||||
@@ -0,0 +1,69 @@
|
||||
# Phase 5 — Representative screens / major UI redesign plan
|
||||
|
||||
**Planning complete; implementation not started.** Source checkpoint `2a2f9e48052c562ef599825458d0d3a6f9f9fc61`, inspected on 2026-09-13 on `codex/ui-redesign-phase4`. This is a documentation-only checkpoint. No application, backend, test, CI, dependency, schema or infrastructure changes; no P5-00/P5-01 implementation, B07 or production work.
|
||||
|
||||
P4-06 gave a **CONDITIONAL GO for planning**. This package preserves that distinction: **P5-00 is required and P5-01 is not yet cleared for implementation**. Accepted readiness evidence must precede the first major visible redesign, P5-01 AppShell/grouped navigation.
|
||||
|
||||
## Package
|
||||
|
||||
- [Implementation plan](PHASE5_PLAN.md): 17 bounded checkpoints, dependencies, rollback and stop rules; P5-05 preview deliberately reserved/deferred.
|
||||
- [Readiness gates](READINESS_GATES.md): exact shell, package, revision, rendering, query and release prerequisites.
|
||||
- [Navigation migration](NAVIGATION_MIGRATION.md): every current menu/utility, all 31 existing patterns, staged future destinations and precise shell direction.
|
||||
- [Preservation impact](PRESERVATION_IMPACT.md): all 57 original contracts, current evidence, planned changes/gaps and visual trace IDs.
|
||||
- [Visual acceptance](VISUAL_ACCEPTANCE.md): stable states/viewports/data and manual/automated evidence requirements.
|
||||
- [Open blockers](OPEN_BLOCKERS.md): inherited defects, slice deadlines, separate backend/product/production gates.
|
||||
|
||||
## Source reconciliation and findings
|
||||
|
||||
Read alongside the [original redesign sequence](../IMPLEMENTATION_PLAN.md), [Phase 1 complete inventory](../audit/FUNCTIONALITY_INVENTORY.md), [Phase 2 matrix](../phase-2/PRESERVATION_MATRIX.md) and [trace format](../phase-2/TRACEABILITY.md), [Phase 3 architecture/impact](../phase-3/PRESERVATION_IMPACT_MATRIX.md), [P4-01](../phase-4/p4-01/README.md), [P4-02](../phase-4/p4-02/README.md), [P4-03](../phase-4/p4-03/README.md), [P4-04](../phase-4/p4-04/README.md), [P4-05](../phase-4/p4-05/README.md) and especially [P4-06 acceptance](../phase-4/p4-06/README.md) / [57-row reconciliation](../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md). Historical future-tense status in older packages is not current implementation state.
|
||||
|
||||
Current source inspection confirms:
|
||||
|
||||
- App has 31 page/alias patterns, a session-invalidated provider-tree unmount, existing shell groups/collapse and distinct account/Career Profile routes. Preserve React Router and providers; table preferences still participate in router memoization, so characterize rather than assume state lifetime.
|
||||
- Current `JobTable` and `KanbanBoard` do **not** share filter/read scope. Board API accepts deletion inclusion only and returns the full matching board; a page-sized replacement or early alias would lose behavior. Split board presentation from gated integration.
|
||||
- QuickCommandDialog has six commands plus job/company results, not global CV/document search. Notifications already have their own store/actions. Reuse these and repair explicit error/keyboard states, without new producers.
|
||||
- Analytics reports exist inside Dashboard with two load groups and five owner-local visibility flags. `/analytics` is a new **destination** for existing data, not permission to invent metrics. Documents/global aggregate Admin data are not ready; do not add empty navigation targets.
|
||||
- The CV editor already has Template/Content/Customize/AI/History, live preview, overrides, undo/history, mobile panes and extensive controls. Keep them. Server revision enforcement remains absent on Save, and preview injects pagination/cropping into rendered HTML. Those facts justify independent integrity/rendering gates before broad CV changes.
|
||||
- A production quick-preview host is absent. The optional overlay props/test are not proof of an existing launched feature. NEW-10 stays outside the default implementation queue.
|
||||
|
||||
No contradiction requires a new component library or platform. P4 shared MUI semantics, focus, PageHeader/PageSection and opt-in density remain the foundation. Career Profile/library/complete Documents, Settings/Admin/mail and full Notifications remain Phase 7; advanced dashboard layout remains Phase 8. The current user request/Phase 3 sequencing advances only the bounded existing-report Analytics presentation into Phase 5.
|
||||
|
||||
## Validation baseline
|
||||
|
||||
The following is **inherited executed evidence from P4-06 at the source checkpoint**, not newly executed application tests during this documentation-only task:
|
||||
|
||||
| Gate | Unchanged baseline |
|
||||
|---|---|
|
||||
| Backend Release tests | 916 passed |
|
||||
| Frontend Jest | 354 passed, 75 suites |
|
||||
| Chromium browser | 51 actual passes + unchanged P2-D01 expected failure (reporter 52 includes the expected failure) |
|
||||
| Rate-limit / ingress / PDF admission | 9 / 6 / 1 passed |
|
||||
| Configuration/Compose | 3 passed |
|
||||
| TypeScript / lint / frontend production build / API Release build | Passing; API zero warnings/errors; P4-06 also checked edited e2e TypeScript |
|
||||
| Secret/whitespace/docs checks | Passing at baseline; fresh documentation checks below |
|
||||
|
||||
Application/test/CI counts change by **zero** here. No test or CI configuration is edited. Future implementation checkpoints run the exact complete commands recorded in [P4-06 final validation](../phase-4/p4-06/README.md#final-validation), plus new scoped tests and relevant e2e TypeScript. Specialized browser suites own the same disposable API port and run sequentially. Preserve B01–B06 checks; no production evidence follows from them. After a separately accepted P2-D01 repair, report the transition from expected failure to actual successful native archive proof explicitly, without renaming or masking it.
|
||||
|
||||
P4-06's 118 retained axe scans include eight known rule occurrences and many incomplete checks. Mapping 57 contracts is **not** exhaustive behavior, visual, provider or accessibility coverage. This plan neither changes those results nor treats the incomplete nodes as passes.
|
||||
|
||||
## Planning checkpoint verification
|
||||
|
||||
Fresh local planning checks (2026-09-13):
|
||||
|
||||
| Executed command / review | Result |
|
||||
|---|---|
|
||||
| `python .artifacts/p5-check-plan.py` | Seven required documents; 57 unique PRES IDs exactly match Phase 2/P4-06; 31 unique current routes exactly match App; 17 planned implementation checkpoints; 184 local link/anchor checks and 127 reference-style test-file targets resolve; table columns/fences pass |
|
||||
| `python .artifacts/p4-04-check-doc-links.py` | 131 current/root Markdown documents, zero missing local targets; historical archive excluded |
|
||||
| Source review of App/AppShell, command/notification/table/board/dashboard/workspace/CV owners and service reads | Reconciled actual route/provider lifetime, absent preview host, distinct board population, existing analytics and CV revision/preview boundaries; no runtime/provider result inferred from source |
|
||||
| `git diff --exit-code 2a2f9e48052c562ef599825458d0d3a6f9f9fc61 -- job-tracker-ui JobTrackerApi JobTrackerApi.Tests scripts .gitea browser-extension` | No application/backend/tests/build/CI/infrastructure changes |
|
||||
| `git diff --cached --name-only` / `git diff --cached --stat` | Eleven Markdown files only: seven package files, three index/trace links and TODO |
|
||||
| `python scripts/supply-chain.py scan-secrets` | Staged documentation secret check passed |
|
||||
| `git diff --check` / `git diff --cached --check` | Passed; ordinary repository LF/CRLF conversion notices are not whitespace failures |
|
||||
|
||||
The two `.artifacts` validators are ignored local review tools, not new CI/application files. They validate documentation structure/targets, not future implementation behavior. Full application suites were not rerun for prose; their last actual evidence is the unchanged baseline above. Git push is limited to the requested feature branch; remote SHA and clean-tree status are verified and reported with the final commit. No production deployment or external provider check is claimed.
|
||||
|
||||
## Recommended next instruction
|
||||
|
||||
“Implement **P5-00 — Shell readiness gates only** from the documentation checkpoint, following `READINESS_GATES.md` and `PHASE5_PLAN.md`. Reproduce/protect each prerequisite against the current UI, preserve application behavior, run the full baseline, record real visual/accessibility evidence, commit/push the bounded readiness checkpoint, and stop before P5-01.”
|
||||
|
||||
P5-01 begins the first major visible redesign only after P5-00 acceptance. Native package proof blocks dependent section/relationship migration; revision/rendering proof blocks broad CV; query parity blocks Board unification. Independent screens need not wait for those gates. **F04 remains open** for production verification and does not block local UI planning. A feature-branch commit/push is not permission to deploy.
|
||||
@@ -0,0 +1,65 @@
|
||||
# Phase 5 visual and workflow acceptance
|
||||
|
||||
This is a **future evidence protocol**, not rendered design approval. P4-06's [33 screenshots and manual review](../phase-4/p4-06/VISUAL_REVIEW.md) are the starting reference. New captures must use actual running UI and synthetic data; no new screenshot or accessibility pass is claimed by this plan.
|
||||
|
||||
## Stable capture dimensions
|
||||
|
||||
Use the same seeded records, owner roles, column preferences, fixed reference time/timezone and browser build within before/after comparisons. Fix time only in fixtures, never product behavior. Record actual values in the evidence manifest. Capture a baseline before each slice and an after image after its final code change.
|
||||
|
||||
| Viewport ID | CSS viewport | Required use |
|
||||
|---|---|---|
|
||||
| D | 1440×900 | All migrated screens, all four theme/locale combinations |
|
||||
| P | 390×844 | Same four combinations, real mobile interaction pattern |
|
||||
| N | 320×740 | Minimum reflow, long NB data; each theme and long admin metadata; EN control |
|
||||
| T | 768×1024 | Table/card and shell boundary, board, dialogs and charts |
|
||||
| L | 1024×768 | Narrow desktop, editor split, horizontally scrollable data |
|
||||
| W | 1920×1080 | Page width/line length, Settings control and Dashboard/Jobs/editor |
|
||||
| B | 767/768 and CV 899/900/1024 widths | Same open draft/focused pane during resize; interaction recording rather than screenshot-only proof |
|
||||
|
||||
Theme/locale IDs: `light-en`, `light-nb`, `dark-en`, `dark-nb`. Comfortable default; Jobs/Trash use **both** Comfortable and Compact at D/P, with all-column/selected cases at T/N too. App density must not alter CV document density. Capture long real-looking Norwegian strings with æ/ø/å, raw custom statuses and unknown/null data. No fabricated analytical or employment facts.
|
||||
|
||||
Full matrix means the named representative populated screen at D and P in all four combinations, not every application route × every state. Add the state-specific coverage below; record exactly which combinations ran. If a state is not applicable (e.g. density on CV, hover on touch), mark N/A with reason instead of counting it as a pass. Expanded/rail/drawer and selected/focus are separate states. Include 430px/1280px and physical device tests when text/action boundaries justify them.
|
||||
|
||||
## Stable evidence sets
|
||||
|
||||
| Set / slices | Representative content and required states | Behavioral/manual acceptance |
|
||||
|---|---|---|
|
||||
| VS-SHELL — 00/01 | Existing loaded Settings as content control; Dashboard and dirty job/CV for route transitions. Expanded/rail/mobile, standard user/admin, long name/version, active child routes, hover/focus/account menu, auth resolution/error | All destinations reachable, one current child/parent, collapse reload vs mobile labels, open/close/navigate/Cancel focus, no header occlusion, skip/main/heading. Same content/draft survives theme/locale/resize; A data gone on B login |
|
||||
| VS-UTILITY — 00/02 | Command blank, populated jobs/companies, selected, loading, no-match, failure/Retry; notification unread/empty/loading/error/dismiss; toast open over low page action | Actual command keyboard traversal/IME, focus return/route heading, action vs navigation; no POST from Add until review; late results discarded; read/dismiss is not task completion; toast doesn't obscure interactive content |
|
||||
| VS-SETTINGS — 00/01/15 control | Retained P4 reading width/long heading/section/actions; open rule draft, notification failure/Retry, open export toast | One h1/section hierarchy, retained independent saves, long heading wrap, connected-account link while toast open. Do not “fix” concurrent SQLite with fixture retries |
|
||||
| VS-JOBS — 03/04b | 35+ jobs spanning statuses, null applied date, long company/title, saved filters, all columns, row selection/bulk confirm/partial failure, sort/page, both densities; first-use/filtered-empty/loading/error/Retry; Trash restore | Table headers/sort announcement, named checkboxes/actions, selection doesn't open job, job Back restores query/page/focus; title/source/menu actions independent. Phone cards preserve data/actions. No false parity based on only the first 15/25 rows |
|
||||
| VS-BOARD — 04a/04b | NotApplied/Active/Closed and custom Other, long card; empty/loading/error, drag target, selected exact status menu, failed move, keyboard focus | Keyboard pickup/drop/cancel plus no-drag menu, correct group destination/precise status, Offer remains active, Other non-droppable. Internal scroll reachable, no global clipping; compare identical filtered records only after 04b gate |
|
||||
| VS-DASHBOARD — 06 | Existing next actions/counts/onboarding, five flags, current pipeline/activity/company/tags; populated/new-user/all-hidden/window-empty, independent summary/trends errors/loading; period/menu/focus | Every old group still reachable/visibility preserved per owner. Values/period/population correct, no scheduled-interview inference, no invented zeros. Chart keyboard values table, useful density, mobile hierarchy |
|
||||
| VS-ANALYTICS — 07 | Existing report families, 6/12/24 selection, raw/custom statuses, top lists, separate salary currency/period, missing dates; populated/empty/error/loading/focus | Source-filter links correct; all-time/current/window scopes explicit, truncated-list labels and sample denominators; exact values without pointer; no hidden report or extra global-data crawl |
|
||||
| VS-WORKSPACE — 08a/08b | Long title/status/description, next action; each existing/new section entry, Notes vs answers, saved/dirty AI review, CV attach/detach, upload consent, package draft/frozen/archive, correspondence/interview/checklist. Populated/empty/error/locked/dialog/focus | Seven sections only after package gate, all old aliases, `followMode`, Cancel/Discard, foreign/missing safe, native archive unchanged, explicit send/manual record distinction. Phone progress/sections keyboard accessible; no implicit AI or save on open |
|
||||
| VS-CV — 09–14 | All five tabs, inherited/custom/omitted content, long sections/items, supported template controls/Advanced, one/multi-page A4/Letter, source/sibling/history, save failure, AI review/locked/error, print/preview and mobile panes | Retain canonical/override scope, undo/history/dirty outcomes, deliberate AI accept/reject, no omitted opacity regression, preview keyboard/fit/scroll/retry, same data after resize. Gate corpus measures preview/PDF dimensions and text, not screenshot aesthetics alone |
|
||||
|
||||
CV preview/template concerns remain an explicit rendering gate, not an accepted visual exception. At least defaults for every template plus documented risk-based advanced combinations are required; do not claim exhaustive combinatorial coverage. Native archive screenshots are captured only after actual capture succeeds; P2-D01 failure cannot be replaced with mocked “Submitted” content.
|
||||
|
||||
## Cross-screen design acceptance
|
||||
|
||||
- **Shell and hierarchy:** primary and secondary navigation are visibly distinct, no missing low-frequency destinations, useful page area remains. Provisional brand can be swapped without rewriting navigation. No new decorative gradient/glass or oversized nested cards.
|
||||
- **Page header/content:** existing P4 PageHeader/PageSection and reading/data/editor width aliases; one h1, meaningful h2/h3, title 24/30 phone or 28/34 desktop, actions wrap or deliberately disclose. No giant marketing heading or duplicated global/detail title. Settings remains the control for rhythm/width.
|
||||
- **Surfaces and typography:** semantic canvas/paper/elevated/border/text roles, legible secondary copy, consistent section rhythm and restrained elevation. Use existing Archivo/system stack; no final font/brand choice. User-facing labels localized, dates scoped explicitly. CV paper/template colors are document output, not application light-theme leakage.
|
||||
- **Lists/tables/status:** same density controls/default, aligned headers/cells/actions, meaningful row hover/selection/focus distinctions. No hidden columns in Compact. Status text/icon plus color, canonical labels translated and custom text preserved. Essential information not hover-only.
|
||||
- **Forms/tabs/dialogs:** existing named MUI controls/field errors, one modal trap, visible Save/Cancel/error at narrow height, route/draft owner unchanged. Consistent primary/secondary/destructive hierarchy, not a primary-colored button on every card. Tab arrows/selectors preserve active state through resize.
|
||||
- **Spacing/reflow:** tokens rather than one-off spacing systems. No clipped ordinary actions/labels or body sideways scroll at 320px. Deliberate tables/boards/preview scroll are named, keyboard usable and visually obvious. Focus remains visible after scrolling; don't conceal overflow to pass a body-width check.
|
||||
- **Charts:** readable explanation, exact values and source/period/sample, legend not color-only. No accessibility dependence on SVG hover. Unknown/no data differs from failure and zero.
|
||||
|
||||
## Accessibility evidence, without overclaiming
|
||||
|
||||
Use [Phase 3 accessibility targets](../phase-3/ACCESSIBILITY_PLAN.md). Check ordinary text ≥4.5:1, large text/essential boundaries/focus ≥3:1, P4 focus treatment, fine/phone target sizing and non-color status meaning. Scan **loaded, expanded** relevant content with named readiness. Record violations and incomplete rules separately with affected nodes; inspect incomplete contrast/hidden focus/table cases manually. No blanket rule disable or exception for the new design.
|
||||
|
||||
Retain P4-06 finite-animation readiness for settled loaded scans; record state, do not disable all animation to obtain screenshots. Inspect at least one normal transition for obscured controls plus reduced-motion behavior. Use fresh pre-axe captures as well as post-scan evidence: historical post-axe NB glyph omissions must not be mistaken for accepted typography. Check screenshot text presence against the DOM; recapture and label unexplained rendering artifacts.
|
||||
|
||||
Manually inspect actual rendered pages (not just axe output) and traverse keyboard focus/order/return, semantic landmarks/headings, long forms, chart alternatives and announcements. Record NVDA/Narrator/browser/version and exact primary tasks when available. Test 200%/400% browser zoom, forced colors and increased text spacing, not just small viewport emulation. Physical touch/software keyboard and mobile screen reader remain operator evidence if unavailable. An unavailable check stays a gap; it cannot be declared passed. Shared regressions block propagation to the next screen. A public accessibility claim requires its separate complete manual evidence.
|
||||
|
||||
## Artifact and trace protocol
|
||||
|
||||
Store each implementation's record under `docs/redesign/phase-5/p5-<id>/` with `README.md`, scoped trace/evidence manifest and `visual/` images as justified. Suggested stable filename:
|
||||
|
||||
`VS-JOBS__populated-selected__D__dark-nb__compact.png`
|
||||
|
||||
Manifest per image/result: evidence ID, PRES sub-workflow, baseline/implementation SHA, route/query **without tokens/private bodies**, synthetic fixture ID/version, role, viewport, theme/locale/density, state/scroll/focus, browser/OS/timezone, command/test result, actual visual reviewer observation and unresolved limitation. Reference corresponding source screenshot, not an arbitrary mockup. Redact credentials even for synthetic users; don't commit authentication storage or traces containing tokens.
|
||||
|
||||
Trace chain: `PRES → original requirement → P5 slice/change commit → behavioral test + result → VS evidence + review`. CSS snapshots/pixel diffs may flag changes, but expected visible redesign requires human before/after judgment. Do not approve screenshots merely because updated snapshots match. Performance/request counts should catch duplicate loads or automatic AI/PDF work after migration; no separate benchmarking platform required.
|
||||
@@ -4,6 +4,7 @@ Status reconciled: 2026-09-13.
|
||||
|
||||
## Current repository work
|
||||
|
||||
- **Phase 5 planning checkpoint — complete, implementation unstarted:** [bounded plan](../redesign/phase-5/README.md) at source `2a2f9e4` maps all 57 contracts/31 routes. Recommended next instruction is **P5-00 shell readiness only**; P5-01 is not cleared until its independent focus/semantics/tooltip/feedback evidence passes. Board integration, native package and CV revision/rendering gates apply only to dependent slices. No P5-00/P5-01 implementation or B07 was begun; F04 remains open.
|
||||
- **P2-D01 — open:** repair the SQLite `DateTimeOffset` ordering baseline before package/tailoring restructuring; retain the expected-failure browser oracle until native capture and historical-binary preservation are proven. P2-O01's initial rules-500 behavior also remains unconfirmed.
|
||||
- **P3-O01/P3-O02 — open:** address analytics population/period labels and navigation/query/error retention when those surfaces are next changed. Evidence is in the current [redesign decision records](../redesign/phase-3/OPEN_DECISIONS.md).
|
||||
- **P4-02-D01–D04 — existing accessibility/content debt:** command-list semantic children, company save-error feedback outside the modal's accessible subtree, the mobile application-progress scroll region, and the literal AI context `{name}` placeholder. Evidence and owning future slices are in the [P4-02 record](../redesign/phase-4/p4-02/README.md). Do not disable modal background isolation or hide findings.
|
||||
|
||||
Reference in New Issue
Block a user