diff --git a/docs/redesign/phase-9/README.md b/docs/redesign/phase-9/README.md new file mode 100644 index 0000000..8c5e119 --- /dev/null +++ b/docs/redesign/phase-9/README.md @@ -0,0 +1,28 @@ +# Phase 9 — Comprehensive QA and regression qualification + +Entry: `1c24e406f194f0f42277d837b3008a7a28dca26a`, clean working tree and direct Phase 8 remote equality verified 22 October 2026. Work branch: `feature/phase9-full-qa`. Main remains `5f835e54a9b74e6b71418422e28431b2af06453f`; it is not the redesign base. + +## Execution plan + +Goal: assess the existing application, repair reproduced in-scope defects, and make independent Phase 9, Phase 10 and production decisions. Reuse the .NET, Jest, Playwright, offline Python and native PDF fixtures. No redesign, new integrations, dependencies, model activation or production operations. Execute inline and autonomously, as requested. + +Specification: [owner brief](REQUEST.md). Authoritative entry records: [Phase 8 acceptance](../phase-8/p8-05/FINAL_ACCEPTANCE.md), [preservation](../phase-8/PRESERVATION.md), [original preservation contracts](../phase-2/PRESERVATION_MATRIX.md), [original implementation plan](../IMPLEMENTATION_PLAN.md), [Phase 7 acceptance](../phase-7/p7-12/FINAL_ACCEPTANCE.md) and [release withholding](../phase-7/p7-12/RELEASE_STATUS.md). Historic evidence remains unchanged. + +| Checkpoint | Files / responsibility | Required verification | +|---|---|---| +| P9-00 | `p9-00/INVENTORY.md`, `p9-00/inventory.json`, QA matrix, baseline evidence | Extract actual 33 route patterns, 57 preservation groups, roles, API owners, UI components, test files; fresh backend/frontend baseline, types/lint/build; source identities. | +| P9-01 | `p9-01/README.md` | Execute complete connected browser journeys with isolated synthetic data; distinguish native HTTP from intercepted fixtures. | +| P9-02 | `p9-02/README.md`, screenshots | Route/theme/locale/viewport coverage; actual visual inspection recorded separately from DOM assertions. | +| P9-03 | `p9-03/README.md`, axe triage, human checklist | Account for all 64 inherited incomplete nodes; deduplicate causes, preserve manual obligations; EN/NB evidence. | +| P9-04 | `p9-04/README.md` | Provider/migration/concurrency/security tests; inspect local database runtime availability without touching live services. | +| P9-05 | `p9-05/README.md`, document/performance evidence | Native PDF pagination and visual checks, failure/large-data fixtures, bounded sustained local observations. | +| P9-06 | `p9-06/README.md`, defect register | Reproduce any defect before minimal shared-owner repair; red/green focused proof, all affected callers and full regression. | +| P9-07 | `p9-07/FINAL_ACCEPTANCE.md`, preservation, risk and handoff records | Reconcile every requested deliverable, exact results and limitations; independent decisions. | + +Each validated checkpoint is committed and normally pushed, then direct remote equality is checked. No force push or main merge. A blocked runtime or human check remains NOT TESTED/PARTIAL and carries an owner, closure evidence and release impact. + +## Review focus + +Account switching and foreign IDs must not expose/write another owner's resources. Stale preference/CV/document saves must retain recoverable drafts and reject silent overwrites. Submitted binaries must remain frozen when canonical Career Profile data changes. Empty/dense/long translated UI must remain operable across widths. Provider, assistive technology and native output claims require their actual environments. + +Use [TODO.md](TODO.md) for live checkpoint status. Raw transient artifacts live in `.artifacts/phase9/`; compact portable evidence belongs beside the checkpoint. An automated pass never substitutes for physical-device, human linguistic, screen-reader or production acceptance. diff --git a/docs/redesign/phase-9/REQUEST.md b/docs/redesign/phase-9/REQUEST.md new file mode 100644 index 0000000..fe41989 --- /dev/null +++ b/docs/redesign/phase-9/REQUEST.md @@ -0,0 +1,651 @@ +# Jobjakt — Phase 9: Comprehensive Application QA and Regression Qualification + +## Mission + +Complete Phase 9 of the Jobjakt redesign. + +Perform a comprehensive, evidence-based quality-assurance assessment of the entire application following Phases 1–8. + +Identify and resolve confirmed in-scope regressions, validate existing functionality, test user journeys, assess accessibility and responsiveness, and produce a defensible acceptance decision. + +This phase is not a new redesign. + +The priorities are: + +1. Functional correctness and data integrity. +2. Ease of use and workflow consistency. +3. Accessibility and responsive behaviour. +4. Security and user/tenant isolation. +5. CV/document/PDF reliability. +6. English and Norwegian Bokmål quality. +7. Performance and stability. +8. Release readiness and transparent risk reporting. + +Work autonomously through bounded checkpoints, testing, documentation, commits and remote pushes. + +Do not begin Phase 10 or new integration features. + +Do not deploy production. + +## 1. Confirmed Phase 8 baseline + +Phase 8 has completed its implemented scope. + +- Final branch: `feature/phase8-dashboard-customisation` +- Final commit: `1c24e406f194f0f42277d837b3008a7a28dca26a` +- Phase 8: CONDITIONAL GO. +- Phase 9 readiness: CONDITIONAL GO. +- Production: NO-GO. +- Development remote matched HEAD. +- Working tree was clean. + +Reported passing checks: + +- Backend: 1,084. +- Frontend: 917. +- Complete browser suite: 360. +- Separate browser contracts: 23. +- AI sidecar: 56. +- Sizing/performance diagnostics: 3. + +Accepted runs had zero failures or skips. + +All 33 routes remain present. + +All 57 functionality-preservation groups were reconciled, but their statuses were 56 PARTIAL and C11 DEFERRED. + +Existing risk items include: + +- 64 incomplete axe accessibility findings requiring triage/manual assessment. +- Outstanding real-device and manual accessibility checks. +- Database-provider runtime verification, particularly MariaDB. +- Unprofiled sustained performance. +- Pre-existing duplicate reminder read. +- Outstanding live advisories. +- Previously deferred P5-13 AI qualification. +- Existing production release blockers. + +Read: + +`docs/redesign/phase-8/p8-05/FINAL_ACCEPTANCE.md` + +Read the Phase 9 handoff and the preceding redesign's authoritative preservation and acceptance records. + +Do not treat unresolved requirements as passed. + +## 2. Git and execution boundaries + +Verify the latest accepted Phase 8 commit and remote state. + +Create: + +`feature/phase9-full-qa` + +Base this branch on the accepted Phase 8 development HEAD. + +Do not branch from the older production main if main does not contain the redesign. + +Preserve existing working-tree changes and branch history. + +Commit and push validated checkpoints to the Phase 9 feature branch. + +Verify every remote push. + +Do not force-push. + +Do not merge to main. + +Do not deploy production. + +## 3. Establish the QA inventory + +Before testing, construct a complete inventory from the actual application. + +Include: + +- All 33 routes. +- All 57 functionality-preservation groups. +- Existing user roles. +- All major APIs. +- Backend/database workflows. +- Frontend page components. +- Shared design-system components. +- AI sidecar contracts. +- CV/document rendering. +- Dashboard preferences. +- Authentication and authorisation. +- Admin-only functionality. + +Identify the existing automated coverage associated with each major workflow. + +Create a QA matrix connecting: + +Route → Workflow → Feature → Test evidence → Known risks → Acceptance status. + +Do not invent coverage where no tests exist. + +## 4. End-to-end user journey testing + +Test the application as a real job seeker would use it. + +Cover: + +### Authentication and account management +Registration, verification, login, logout, password recovery, session management, account security and error handling. + +### Onboarding +New-user flows, incomplete onboarding, resuming onboarding, localisation and navigation. + +### Dashboard +Statistics, widget visibility, ordering, sizing, persistence, conflicts, reset and responsive layouts. + +### Jobs +Job creation, editing, statuses, table, Kanban, searching, filtering, sorting, timelines, reminders and deletion where applicable. + +### Job Detail +Navigation, associated documents, history, actions and data preservation. + +### Career Profile +Canonical data editing, profile sections, validation, saving, recovery and relationships to CVs. + +### CV Builder +Templates, editing, section ordering, content overrides, revisions, preview, exports and document fidelity. + +### Cover letters and documents +Creation, editing, version handling, association with applications and safe persistence. + +### Analytics +Data correctness, calculations, filters, empty states and dashboard relationships. + +### Notifications +Read/unread state, duplicate handling, reminders, failure recovery and preferences. + +### Settings +Profile, account, security, localisation, themes, preferences and other supported sections. + +### Admin +Permissions, statistics, workflows, isolation and user management. + +Test complete connected workflows, not just individual pages. + +Preserve submitted/frozen document state and canonical Career Profile boundaries. + +## 5. Visual and responsive QA + +Inspect every significant route and user workflow across: + +- Desktop. +- Tablet. +- Mobile. +- English. +- Norwegian Bokmål. +- Light theme. +- Dark theme. + +Check: + +- Consistent design system. +- Responsive layout. +- Sidebar and navigation. +- Dialogs and drawers. +- Tables and cards. +- Forms and validation. +- Chart readability. +- Touch interactions. +- Typography and spacing. +- Overflow and clipping. +- Loading states. +- Empty states. +- Error states. +- Long text and translations. +- Realistic dense datasets. + +Use reproducible browser screenshots and DOM/accessibility evidence where useful. + +Compare against established redesign decisions. + +Fix confirmed in-scope regressions without introducing another full redesign. + +Do not mark a route visually tested unless it was actually inspected. + +## 6. Accessibility qualification + +Investigate Phase 8's 64 incomplete axe findings. + +These are not necessarily violations. + +Deduplicate findings by underlying cause and affected component. + +Classify them into: + +- Confirmed accessibility defect. +- Requires manual inspection. +- Tool limitation. +- Not applicable, with evidence. +- Resolved. + +Test: + +- Keyboard-only navigation. +- Logical focus order. +- Visible focus. +- Dialog focus handling. +- Accessible names. +- Semantic structure. +- Screen-reader announcements. +- Dynamic status changes. +- Reordering controls. +- Drag-and-drop alternatives. +- Reduced motion. +- Zoom and text resizing. +- Colour contrast. +- Mobile touch targets. + +Run automated checks across representative routes. + +Perform genuine manual checks when the available testing environment supports them. + +Do not claim NVDA, VoiceOver, physical-device or human accessibility testing passed unless those checks actually occurred. + +Create a precise manual testing checklist for any checks requiring the product owner or another human tester. + +Carry uncompleted checks into the release gates. + +## 7. English and Norwegian Bokmål + +Review every significant workflow. + +Look for: + +- Missing translation keys. +- English strings appearing in Norwegian mode. +- Inconsistent terminology. +- Literal or unnatural translations. +- Incorrect date/number formatting. +- Layout problems caused by longer text. +- Inconsistent validation messages. +- Missing accessibility labels. + +Prefer natural professional Bokmål. + +Preserve localisation architecture. + +Do not silently replace established terminology without a clear reason. + +## 8. Database and persistence qualification + +Investigate supported database providers and configurations. + +Include: + +- EF Core migrations. +- SQLite development behaviour. +- MariaDB deployment compatibility. +- Database schema expectations. +- Relationships and constraints. +- Concurrent updates. +- Stale writes. +- Transaction handling. +- Preference persistence. +- Career Profile consistency. +- CV revision safety. + +Use isolated test databases and synthetic data. + +Where possible, run actual MariaDB integration testing in an approved non-production environment. + +Do not claim MariaDB runtime acceptance from SQLite-only tests. + +Do not modify the live production database. + +Document any limitations where the provider cannot be tested safely. + +## 9. Security and privacy + +Verify: + +- User and tenant isolation. +- API authorisation. +- Admin permissions. +- Session handling. +- Upload validation. +- Document ownership. +- Sensitive-data exposure. +- Error message leakage. +- AI endpoint access controls. +- URL import protections. +- Relevant rate limits. +- Data retention and deletion behaviour. +- Safe handling of untrusted documents and external content. + +Run applicable existing security tests and static checks. + +Do not expand into an uncontrolled security rewrite. + +Record discovered high-risk issues and address those within the authorised QA scope. + +Do not hide security failures or weaken assertions. + +## 10. CV and PDF qualification + +Test real output fidelity using synthetic CV data. + +Cover: + +- One-page CVs. +- Multi-page CVs. +- Long employment histories. +- Long bullet lists. +- Missing optional sections. +- Different templates. +- English and Norwegian. +- Long words and wrapping. +- Special characters. +- Page breaks. +- Header/footer behaviour. +- Margins. +- Fonts. +- Preview/export agreement. +- Version preservation. + +Verify document pagination visually and programmatically where appropriate. + +Do not infer PDF fidelity from frontend component tests alone. + +Record renderer and environment differences. + +## 11. Large-data and edge-case testing + +Create realistic synthetic scenarios involving: + +- No applications. +- Large numbers of applications. +- Long application timelines. +- Many CV revisions. +- Complex Career Profile histories. +- Missing or partial fields. +- Long job descriptions. +- Large filtering and sorting datasets. +- Many notifications. +- Slow APIs. +- Network interruption. +- Failed saves. +- Expired sessions. +- Concurrent edits. +- Missing or stale external references. + +Verify that workflows remain usable and that data is not lost. + +Do not load destructive or excessive test data into production. + +## 12. Performance and stability + +Go beyond small sizing diagnostics. + +Assess representative workloads for: + +- Page loading. +- Dashboard rendering. +- Job Table/Kanban performance. +- Filtering and search. +- Large Career Profiles. +- CV editing and preview. +- PDF generation. +- Preference saving. +- Backend database requests. +- AI sidecar interactions. + +Investigate sustained performance under controlled, bounded load. + +Measure actual resource usage and latency where possible. + +Use isolated or approved test environments. + +Do not benchmark destructively against live services. + +Clearly distinguish measured performance from estimates. + +Document resource constraints and untested production-scale behaviour. + +## 13. Known issues and deferred requirements + +Investigate the duplicate reminder read and other pre-existing advisories. + +Revisit: + +- Phase 7 conditional acceptance. +- Phase 8 conditional acceptance. +- 56 PARTIAL preservation statuses. +- C11 DEFERRED. +- Accessibility incompletes. +- Database-provider coverage gaps. +- Sustained performance qualification. +- P5-13 withholding. +- Existing production blockers. + +For every item, determine: + +- Current status. +- Reproducibility. +- User impact. +- Severity. +- Owner/next action. +- Whether it blocks Phase 9 acceptance. +- Whether it blocks production. +- Required evidence for closure. + +Do not automatically reinterpret PARTIAL as PASS or DEFERRED as completed. + +Record why each item is legitimately accepted, deferred or still blocked. + +Do not change historic acceptance evidence retroactively. + +## 14. Remediation policy + +Phase 9 may fix confirmed regressions and defects discovered during QA. + +Keep fixes: + +- Bounded. +- Tested. +- Relevant to Phase 9. +- Compatible with existing architecture. +- Documented. +- Independently reviewable. + +For major architectural changes or new product features, create a separate issue and explain the dependency. + +Do not begin Phase 10 legacy cleanup. + +Do not introduce LinkedIn, FINN, NAV or new AI model features. + +Do not activate P5-13. + +## 15. Suggested checkpoints + +Use existing authoritative Phase 9 checkpoint definitions where available; otherwise: + +### P9-00 — QA baseline and coverage matrix + +Establish the current test baseline, route/feature coverage, risks and acceptance criteria. + +### P9-01 — End-to-end functional QA + +Test full user journeys, account ownership, persistence and application workflows. + +### P9-02 — Responsive and visual QA + +Inspect routes, themes, languages, mobile/tablet layouts and complex states. + +### P9-03 — Accessibility and localisation + +Triage incomplete findings, resolve confirmed issues and prepare human testing evidence. + +### P9-04 — Data integrity, database and security + +Validate providers, concurrency, user isolation, uploads, document ownership and security contracts. + +### P9-05 — CV/PDF, edge cases and performance + +Verify document fidelity, large datasets, failure recovery and bounded performance. + +### P9-06 — Defect remediation and full regression + +Resolve approved in-scope defects and run the complete relevant suites. + +### P9-07 — Final acceptance and Phase 10 handoff + +Consolidate evidence, remaining blockers, updated preservation statuses and recommended cleanup scope. + +At each validated checkpoint: + +1. Implement necessary QA tests and in-scope fixes. +2. Execute verification. +3. Record exact results. +4. Commit the checkpoint. +5. Push to the Phase 9 branch. +6. Verify remote synchronisation. +7. Continue autonomously. + +If an unsafe or unapproved issue blocks a checkpoint, document it and continue independent safe work where possible. + +## 16. Production restrictions + +The current production environment remains NO-GO. + +Previously reported blockers include: + +- EXT4 filesystem errors on Docker storage. +- Missing independently verified off-disk backup at the last assessment. +- Restore and rollback qualification. +- Production ingress security. +- Database-provider/runtime validation. +- Manual accessibility requirements. +- Outstanding release advisories. +- AI model integrity and qualification. + +Do not assume these issues have been resolved. + +Do not: + +- Merge into main. +- Deploy Jobjakt. +- Restart live Docker services. +- Modify production secrets. +- Run production migrations. +- Repair the production filesystem. +- Perform live data deletion. +- Activate Qwen3.5 or replace Qwen2.5. +- Change production AI inference configuration. + +Safe local QA and isolated integration testing may continue. + +Production-readiness investigation can be documented but does not authorise production remediation. + +## 17. Documentation and evidence + +Use established repository conventions. + +Suggested location: + +`docs/redesign/phase-9/` + +Deliver: + +- QA coverage matrix. +- Route and workflow verification. +- Visual/responsive evidence. +- Accessibility findings and manual checklist. +- Localisation results. +- Database/provider validation. +- Security findings. +- CV/PDF fidelity evidence. +- Performance results. +- Defect register. +- Updated preservation matrix. +- Full regression results. +- Release risk register. +- Phase 10 cleanup eligibility list. +- Final acceptance report. + +Suggested final report: + +`docs/redesign/phase-9/p9-07/FINAL_ACCEPTANCE.md` + +Maintain original evidence and stable issue IDs. + +Separate PASS, FAIL, PARTIAL, DEFERRED and NOT TESTED. + +## 18. Final acceptance + +Provide independent decisions: + +**Phase 9 QA:** +GO / CONDITIONAL GO / NO-GO. + +**Phase 10 readiness:** +GO / CONDITIONAL GO / NO-GO. + +**Production release:** +GO / NO-GO. + +Do not claim production readiness solely because QA tests pass. + +Do not claim a manual check passed without actual human/manual evidence. + +Do not claim a database provider passed if it was not exercised. + +Clearly distinguish development acceptance from production release approval. + +## 19. Required final response + +Report: + +1. Completed QA checkpoints. +2. Routes and workflows tested. +3. Actual backend/frontend/browser/contract/sidecar results. +4. New regression tests. +5. Confirmed defects found and resolved. +6. Remaining defects and severity. +7. Accessibility outcomes and outstanding human checks. +8. Localisation findings. +9. Database-provider verification. +10. Security and tenant-isolation outcomes. +11. CV/PDF rendering results. +12. Performance results. +13. Preservation-group status changes. +14. C11 deferred status. +15. Phase 10 cleanup eligibility. +16. Final branch and commit. +17. Remote push verification. +18. Phase 9 decision. +19. Phase 10 readiness decision. +20. Production decision. + +## 20. Final execution instruction + +Begin Phase 9 from the accepted Phase 8 development baseline: + +`1c24e406f194f0f42277d837b3008a7a28dca26a` + +Create: + +`feature/phase9-full-qa` + +Complete comprehensive application QA autonomously through bounded checkpoints. + +Fix confirmed, authorised in-scope regressions. + +Preserve all existing features and data contracts. + +Maintain transparent unresolved-risk tracking. + +Commit and push each validated checkpoint. + +Prepare a complete Phase 10 handoff. + +**Do not merge into main.** + +**Do not deploy production.** + +**Do not begin Phase 10 automatically.** \ No newline at end of file diff --git a/docs/redesign/phase-9/p9-00/BASELINE.md b/docs/redesign/phase-9/p9-00/BASELINE.md new file mode 100644 index 0000000..b3a91a8 --- /dev/null +++ b/docs/redesign/phase-9/p9-00/BASELINE.md @@ -0,0 +1,22 @@ +# P9-00 — Entry baseline and coverage inventory + +Development baseline and direct remote: `1c24e406f194f0f42277d837b3008a7a28dca26a` on `feature/phase8-dashboard-customisation`, clean before work. New branch is `feature/phase9-full-qa`. Main remains the older release branch and is not the redesign base. Feature pushes are authorised; `.gitea/workflows/ci-deploy.yml` restricts deployment to a main push. + +The reproducible [source inventory](INVENTORY.md) and [full JSON](inventory.json) enumerate **33 concrete routes**, **57 preservation groups**, actual page/shared component owners, **43 API controller/partial owners**, migration/data owners, the Admin/Premium entitlement roles and existing test files: backend 117, frontend 104, ordinary browser 58, sidecar 2. These are file counts and associations, not exhaustive behavioral coverage. Public/anonymous, roleless authenticated and administrator actors remain distinct; arbitrary stored roles are not inferred to confer grants. + +The exact group-level entry disposition is **56 PARTIAL / PRES-C11 DEFERRED**. Original contract/test/gap columns are retained in JSON and link back to the authoritative matrix. The current Documents route and context-preserving correspondence alias supersede older route descriptions; historic records are not edited. + +## Fresh entry observations + +| Lane | Actual entry evidence | Qualification | +|---|---|---| +| Backend | 1,084 passed; 0 failed/skipped, Release, pinned SDK 9.0.317 | `.artifacts/phase9/backend/phase9.trx`; SQLite/test-host evidence, not MariaDB runtime. | +| Frontend assertions | Report records 917 passed /104 suites, 0 failed/pending | Original wrapper was interrupted; its report is retained as `frontend-entry-reported.json`. A clean completed successor process is required for final acceptance. | +| Types / lint / build | PASS; static frontend export uses `http://localhost:5302/api` | Rebuilt again after the bounded locale repair; no deployment. | +| Sidecar | Initial 55 pass /1 fail; full corrected fixture successor 56/56 | Entry failure and red/green proof retained; see P9-T01. No model loading/inference acceptance. | +| Ordinary browser | Interrupted after 36 completed cases | Not a complete accepted run. Full uninterrupted successor required. | +| Provider availability | Docker Linux engine pipe missing; no `mariadbd`/`mysqld` runtime found | MariaDB runtime NOT TESTED. Do not substitute generated SQL or SQLite results. | + +Commands are the existing pinned `.dotnet/dotnet.exe test ... --configuration Release --no-restore`, Jest `--runInBand --json`, `npm run typecheck`, `npm run lint`, `npm run build`, offline pytest with `SKIP_MODEL_LOAD=1`, and native Playwright with static/prebuilt export, isolated synthetic data root, `--retries=0`. Raw logs and result files remain under `.artifacts/phase9/`. The final portable [validation record](../validation.json) supersedes provisional run counts without erasing failed attempts. + +Inventory assertions require exact 33/57 membership and one deferred group. Product verification and final acceptance are separate checkpoints; P9-00 does not clear inherited manual/provider/output/release gates. diff --git a/docs/redesign/phase-9/p9-00/INVENTORY.md b/docs/redesign/phase-9/p9-00/INVENTORY.md new file mode 100644 index 0000000..e239be7 --- /dev/null +++ b/docs/redesign/phase-9/p9-00/INVENTORY.md @@ -0,0 +1,117 @@ +# P9-00 source inventory + +Generated by `inventory.py`; associations below are existing candidate coverage, not executed Phase 9 passes. + +## Route → workflow → feature → test evidence → risk → acceptance + +| Route | Actual element owners | Preservation contracts / existing test evidence | Known risk | Phase 9 | +|---|---|---|---|---| +| `/` | `Navigate`, `LandingPage` | PRES-E01, PRES-J04; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/dashboard` | `DashboardView` | PRES-S01, PRES-S02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/analytics` | `AnalyticsPage` | Shared shell / nearest parent contracts; direct route evidence required; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/discover` | `JobDiscoveryPage` | PRES-J01, PRES-J02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/jobs` | `JobTable` | PRES-J05, PRES-J06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/jobs/:id` | `ApplicationWorkspacePage` | PRES-W01, PRES-W02, PRES-W03; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/reminders` | `RemindersView` | PRES-W11; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/operations` | `OperationsPage` | PRES-W12; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/kanban` | `LegacyBoardRedirect` | PRES-J07; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/companies` | `CompaniesTable` | PRES-J08; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/offers` | `OfferComparisonPage` | PRES-J09; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/correspondence` | `CorrespondenceInboxPage` | PRES-M03, PRES-M04, PRES-M05; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/correspondence/review` | `LegacyCorrespondenceReviewRedirect` | PRES-M05; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/profile` | `ProfilePage` | PRES-E04, PRES-E05, PRES-E06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/applications/:id` | `LegacyApplicationRedirect` | PRES-W01; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/career` | `CareerWorkspacePage` | PRES-C01, PRES-C02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/career/builder` | `CvBuilderPage` | PRES-C05; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/career/builder/:id` | `CvBuilderEditor` | PRES-C06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/documents` | `DocumentsPage` | Shared shell / nearest parent contracts; direct route evidence required; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/admin/audit` | `AdminAuditPage` | PRES-A02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/admin/users` | `AdminUsersPage` | PRES-A01; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/admin/system` | `AdminSystemPage` | PRES-A03; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/trash` | `JobTable` | PRES-J06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/settings` | `SettingsView` | PRES-J10, PRES-W11, PRES-S03, PRES-S04; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/settings/connected-accounts` | `ConnectedAccountsPage` | PRES-M06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/login` | `LoginPage` | PRES-E02, PRES-E03, PRES-E04; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/register` | `LoginPage` | PRES-E02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/forgot-password` | `ForgotPasswordPage` | PRES-E02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/reset-password` | `ResetPasswordPage` | PRES-E02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/verify-email` | `VerifyEmailPage` | PRES-E02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/confirm-email-change` | `VerifyEmailPage` | PRES-E06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/microsoft-legacy-relink` | `MicrosoftLegacyRelinkPage` | PRES-E03; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | +| `/cv/:slug` | `PublicCvPage` | PRES-C12; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED | + +## Complete preservation ledger + +Exact source/owner/test/gap columns for every group are retained in [inventory.json](inventory.json). The original matrix is authoritative for sub-capabilities. + +| ID | Capability | Entry status | Phase 9 | +|---|---|---|---| +| PRES-E01 | **PRES-E01** — Public product/plans; honest unavailable billing | PARTIAL | NOT TESTED | +| PRES-E02 | **PRES-E02** — Local login/register/remember, challenge, reset and verification | PARTIAL | NOT TESTED | +| PRES-E03 | **PRES-E03** — Google/Microsoft login, link, legacy relink and popup results | PARTIAL | NOT TESTED | +| PRES-E04 | **PRES-E04** — 2FA challenge/recovery/setup/disable; trusted-device revocation | PARTIAL | NOT TESTED | +| PRES-E05 | **PRES-E05** — Session list/current device, revoke one/others, logout | PARTIAL | NOT TESTED | +| PRES-E06 | **PRES-E06** — Avatar, account names/headline, email change and password | PARTIAL | NOT TESTED | +| PRES-E07 | **PRES-E07** — Desktop collapse/mobile drawer, active nav and command search/actions | PARTIAL | NOT TESTED | +| PRES-E08 | **PRES-E08** — Theme/system, EN/NB hydration, toast/confirm/prompt and errors | PARTIAL | NOT TESTED | +| PRES-E09 | **PRES-E09** — Account-switch private-state disposal and stale request rejection | PARTIAL | NOT TESTED | +| PRES-J01 | **PRES-J01** — NAV discovery/filter/sort/source/deadline/details | PARTIAL | NOT TESTED | +| PRES-J02 | **PRES-J02** — Saved searches, run/delete/alerts, result changes/dismissal | PARTIAL | NOT TESTED | +| PRES-J03 | **PRES-J03** — Reviewed manual/URL/paste job create, company/tags/dates, duplicates | PARTIAL | NOT TESTED | +| PRES-J04 | **PRES-J04** — Extension/bookmarklet/share capture; post-create attachment/CV | PARTIAL | NOT TESTED | +| PRES-J05 | **PRES-J05** — Job filters/sort/page/columns, saved views and row/mobile actions | PARTIAL | NOT TESTED | +| PRES-J06 | **PRES-J06** — Bulk status/delete, soft delete/trash/restore and job edit | PARTIAL | NOT TESTED | +| PRES-J07 | **PRES-J07** — Kanban grouped statuses, pointer/keyboard move and precise menu | PARTIAL | NOT TESTED | +| PRES-J08 | **PRES-J08** — Company/contact edits, pipeline dates and linked-job history | PARTIAL | NOT TESTED | +| PRES-J09 | **PRES-J09** — Recorded offers/compensation/deadlines/notes and source links | PARTIAL | NOT TESTED | +| PRES-J10 | **PRES-J10** — CSV/JSON export, JSON import and CSV-to-JSON conversion | PARTIAL | NOT TESTED | +| PRES-W01 | **PRES-W01** — Full workspace, sections, legacy links and optional reusable overlay | PARTIAL | NOT TESTED | +| PRES-W02 | **PRES-W02** — Detail/status/progression, recruiter/dates/description/timeline | PARTIAL | NOT TESTED | +| PRES-W03 | **PRES-W03** — Analysis, match/gaps, strategy and reviewed status/workflow suggestions | PARTIAL | NOT TESTED | +| PRES-W04 | **PRES-W04** — Checklist create/edit/complete/delete/order and next action | PARTIAL | NOT TESTED | +| PRES-W05 | **PRES-W05** — Attach/select/create/tailor CV and source context | PARTIAL | NOT TESTED | +| PRES-W06 | **PRES-W06** — Cover-letter manual/AI review, versions/restore and dirty protection | PARTIAL | NOT TESTED | +| PRES-W07 | **PRES-W07** — Application drafts and immutable submitted package/archived binaries | PARTIAL | NOT TESTED | +| PRES-W08 | **PRES-W08** — Attachments upload/category/name/AI consent/preview/download/delete | PARTIAL | NOT TESTED | +| PRES-W09 | **PRES-W09** — Interview questions/answers/ready/manual removal/AI review | PARTIAL | NOT TESTED | +| PRES-W10 | **PRES-W10** — Debrief/follow-up draft/date/readiness | PARTIAL | NOT TESTED | +| PRES-W11 | **PRES-W11** — Reminder rules/actions/notifications, ICS and Google/Outlook events | PARTIAL | NOT TESTED | +| PRES-W12 | **PRES-W12** — Async progress/failure/retry/cancel/notifications | PARTIAL | NOT TESTED | +| PRES-C01 | **PRES-C01** — Canonical structured career data and long-tail/custom sections | PARTIAL | NOT TESTED | +| PRES-C02 | **PRES-C02** — Profile overview/completeness/import guidance/raw copy/history/restore | PARTIAL | NOT TESTED | +| PRES-C03 | **PRES-C03** — Upload/extract/rebuild/reprocess/diff/select/accept/discard/retry/cancel | PARTIAL | NOT TESTED | +| PRES-C04 | **PRES-C04** — Evidence bank source/category/tags/add/list/delete | PARTIAL | NOT TESTED | +| PRES-C05 | **PRES-C05** — CV library create/copy/delete/templates/share/publication/PDF | PARTIAL | NOT TESTED | +| PRES-C06 | **PRES-C06** — Studio tabs, preview debounce/pages/fit/save state/mobile panes | PARTIAL | NOT TESTED | +| PRES-C07 | **PRES-C07** — Visibility/order/custom sections and item/document overrides | PARTIAL | NOT TESTED | +| PRES-C08 | **PRES-C08** — Capability-aware templates/typography/color/header/skills/sidebar/photo | PARTIAL | NOT TESTED | +| PRES-C09 | **PRES-C09** — A4/Letter/density/margins/dates/document locale/section presentation | PARTIAL | NOT TESTED | +| PRES-C10 | **PRES-C10** — Undo/redo, save queue, dirty guard, history restore/preview lifecycle | PARTIAL | NOT TESTED | +| PRES-C11 | **PRES-C11** — Section and whole-document AI improve/translate/instruction/grammar review | DEFERRED | NOT TESTED | +| PRES-C12 | **PRES-C12** — Private PDF and published anonymous CV/PDF, long searchable pages | PARTIAL | NOT TESTED | +| PRES-M01 | **PRES-M01** — Job-scoped manual correspondence/search/delete/paste import | PARTIAL | NOT TESTED | +| PRES-M02 | **PRES-M02** — Gmail candidate/thread import/refresh/sync/unlink/relink/move | PARTIAL | NOT TESTED | +| PRES-M03 | **PRES-M03** — Global inbox filters/page/provider/link/direction/detail/source links | PARTIAL | NOT TESTED | +| PRES-M04 | **PRES-M04** — Compose/reply/provider/recipient/job; draft conflicts; confirm send/uncertainty | PARTIAL | NOT TESTED | +| PRES-M05 | **PRES-M05** — Review proposed jobs/link/reject/keep/notes/sync/create | PARTIAL | NOT TESTED | +| PRES-M06 | **PRES-M06** — Gmail/Graph/IMAP connect/status/disconnect separate from sign-in | PARTIAL | NOT TESTED | +| PRES-S01 | **PRES-S01** — Personal metrics/activity/funnel/company/skills/stage/salary/next actions | PARTIAL | NOT TESTED | +| PRES-S02 | **PRES-S02** — Owner-local five visibility preferences/onboarding dismiss/notifications | PARTIAL | NOT TESTED | +| PRES-S03 | **PRES-S03** — Rules/reminder/table/theme/language preferences and account links | PARTIAL | NOT TESTED | +| PRES-S04 | **PRES-S04** — AI privacy/usage/limits/Free-Pro/server entitlement/conditional billing | PARTIAL | NOT TESTED | +| PRES-S05 | **PRES-S05** — Account ZIP/encrypted backup/lifecycle/deletion confirmations | PARTIAL | NOT TESTED | +| PRES-A01 | **PRES-A01** — Admin user/create/roles/reset/delete/last-admin/self guards | PARTIAL | NOT TESTED | +| PRES-A02 | **PRES-A02** — Audit list/detail/supported undo/job restore | PARTIAL | NOT TESTED | +| PRES-A03 | **PRES-A03** — System/build/DB/AI/mail/SMTP/test/probe/benchmark/maintenance | PARTIAL | NOT TESTED | + +## API and implementation census + +43 controller/partial owners; 254 HTTP method attributes. Full base/suffix/authorization attributes are in JSON; this is source inventory, not runtime endpoint acceptance. + +Existing test files: backend 117, frontend 104, browser 58, sidecar 2. File presence does not establish coverage of every branch. + +Actors: anonymous/public, authenticated ordinary account, administrator, and plan entitlement variants. Actual role literals and authorization attributes are recorded in JSON. Test auth handlers, real local cookies and external identity providers require separate qualification. + +Database workflows: canonical Career Profile and evidence/import, CV variants/revisions/overrides, frozen application packages, job lifecycle/soft delete, correspondence/draft versions, account preferences/session revocation, administrative restore. Migration and data-owner file lists are in JSON. + +Shared UI: complete page/component lists in JSON; preserve current MUI/theme/i18n/router/confirm/prompt/resource owners. AI sidecar contracts are offline only unless actual model inference is explicitly exercised; P5-13 remains withheld. diff --git a/docs/redesign/phase-9/p9-00/inventory.json b/docs/redesign/phase-9/p9-00/inventory.json new file mode 100644 index 0000000..11d0330 --- /dev/null +++ b/docs/redesign/phase-9/p9-00/inventory.json @@ -0,0 +1,2688 @@ +{ + "baseline": "1c24e406f194f0f42277d837b3008a7a28dca26a", + "routes": { + "/": [ + "Navigate", + "LandingPage" + ], + "/dashboard": [ + "DashboardView" + ], + "/analytics": [ + "AnalyticsPage" + ], + "/discover": [ + "JobDiscoveryPage" + ], + "/jobs": [ + "JobTable" + ], + "/jobs/:id": [ + "ApplicationWorkspacePage" + ], + "/reminders": [ + "RemindersView" + ], + "/operations": [ + "OperationsPage" + ], + "/kanban": [ + "LegacyBoardRedirect" + ], + "/companies": [ + "CompaniesTable" + ], + "/offers": [ + "OfferComparisonPage" + ], + "/correspondence": [ + "CorrespondenceInboxPage" + ], + "/correspondence/review": [ + "LegacyCorrespondenceReviewRedirect" + ], + "/profile": [ + "ProfilePage" + ], + "/applications/:id": [ + "LegacyApplicationRedirect" + ], + "/career": [ + "CareerWorkspacePage" + ], + "/career/builder": [ + "CvBuilderPage" + ], + "/career/builder/:id": [ + "CvBuilderEditor" + ], + "/documents": [ + "DocumentsPage" + ], + "/admin/audit": [ + "AdminAuditPage" + ], + "/admin/users": [ + "AdminUsersPage" + ], + "/admin/system": [ + "AdminSystemPage" + ], + "/trash": [ + "JobTable" + ], + "/settings": [ + "SettingsView" + ], + "/settings/connected-accounts": [ + "ConnectedAccountsPage" + ], + "/login": [ + "LoginPage" + ], + "/register": [ + "LoginPage" + ], + "/forgot-password": [ + "ForgotPasswordPage" + ], + "/reset-password": [ + "ResetPasswordPage" + ], + "/verify-email": [ + "VerifyEmailPage" + ], + "/confirm-email-change": [ + "VerifyEmailPage" + ], + "/microsoft-legacy-relink": [ + "MicrosoftLegacyRelinkPage" + ], + "/cv/:slug": [ + "PublicCvPage" + ] + }, + "preservation": [ + { + "id": "PRES-E01", + "capability": "**PRES-E01** — Public product/plans; honest unavailable billing", + "entry": "`/`", + "owners": "LandingPage, planCatalog; AccountPlans", + "existingEvidence": "[F:landing-page][F:landing-page.test.tsx], [F:planCatalog][F:planCatalog.test.ts], [F:LandingPage.authRedirect][F:LandingPage.authRedirect.test.tsx]; [B:AccountPlans][B:AccountPlansTests]. Free/Pro copy, unavailable checkout and authenticated redirect", + "historicGap": "Actual checkout/provider availability; public mobile/keyboard review", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-E02", + "capability": "**PRES-E02** — Local login/register/remember, challenge, reset and verification", + "entry": "`/login; /register; /forgot-password; /reset-password; /verify-email`", + "owners": "LoginPage, TurnstileWidget, VerifyEmailPage; AuthController", + "existingEvidence": "[F:login-page][F:login-page.test.tsx], [F:verify-email-page][F:verify-email-page.test.tsx], [F:turnstile-widget][F:turnstile-widget.test.tsx]; [B:LocalAuthIdentity][B:LocalAuthIdentityTests], [B:AuthAndSystemController][B:AuthAndSystemControllerTests]. Configuration gates, two-factor branch, safe redirect, verification outcomes; smoke login", + "historicGap": "Real reset-email delivery, Turnstile widget/browser configuration, complete reset submit journey", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-E03", + "capability": "**PRES-E03** — Google/Microsoft login, link, legacy relink and popup results", + "entry": "`/login; /microsoft-legacy-relink; provider callbacks`", + "owners": "GoogleAuthCard, MicrosoftAuthCard, MicrosoftLegacyRelinkPage; token validators", + "existingEvidence": "[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], [B:LocalAuthIdentity][B:LocalAuthIdentityTests]. Provider failure/relink presentation and token validation", + "historicGap": "Real consent/popups, revoked grants, provider sandbox; callbacks must retain origin/state", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-E04", + "capability": "**PRES-E04** — 2FA challenge/recovery/setup/disable; trusted-device revocation", + "entry": "`/profile; /login`", + "owners": "TwoFactorSettingsCard, TwoFactorChallenge; TwoFactorController", + "existingEvidence": "[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]. Setup/recovery presentation, disable failure/retry; server trusted-device/session checks", + "historicGap": "Real mobile authenticator/recovery and trusted-device UI traversal", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-E05", + "capability": "**PRES-E05** — Session list/current device, revoke one/others, logout", + "entry": "`/profile; shell user menu`", + "owners": "SessionsSettingsCard, AppShell, auth; SessionsController", + "existingEvidence": "[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]. Own active sessions only, revoke ownership and next-request invalidation; B02 browser logout", + "historicGap": "Session-list card UI selection/refresh after remote revoke", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-E06", + "capability": "**PRES-E06** — Avatar, account names/headline, email change and password", + "entry": "`/profile; /confirm-email-change`", + "owners": "ProfilePage; AuthController, AvatarStorage", + "existingEvidence": "[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]. Email change password/confirmation contract; safe avatar storage and identity endpoints", + "historicGap": "Avatar upload/remove and password-change browser journeys", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-E07", + "capability": "**PRES-E07** — Desktop collapse/mobile drawer, active nav and command search/actions", + "entry": "`Shell; Ctrl/Cmd+K`", + "owners": "AppShell, QuickCommandDialog; job/company search APIs", + "existingEvidence": "[F:sidebar-active-nav][F:sidebar-active-nav.test.ts], [F:app-shell-notifications][F:app-shell-notifications.test.tsx], [F:quick-command-preservation][F:quick-command-preservation.test.tsx]; [B:JobApplicationsAuthorization][B:JobApplicationsAuthorizationTests], [B:CompanyRelationship][B:CompanyRelationshipTests]. Active matching and notification entry; NEW job/company destinations, reviewed add and search reset; NEW browser keyboard navigation", + "historicGap": "Drawer focus return and collapse persistence in EN/NB; all command destinations before shell migration", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-E08", + "capability": "**PRES-E08** — Theme/system, EN/NB hydration, toast/confirm/prompt and errors", + "entry": "`Shell; preferences; fallback routes`", + "owners": "themePrefs, I18nProvider, confirm, prompt; auth preference", + "existingEvidence": "[F:theme-state][F:theme-state.test.tsx], [F:i18n-provider][F:i18n-provider.test.tsx], [F:confirm][F:confirm.test.tsx], [F:prompt][F:prompt.test.tsx], [F:dialog-flow][F:dialog-flow.test.tsx]; [B:LocalAuthIdentity][B:LocalAuthIdentityTests]. Hydrated theme/language, confirmation/cancellation and dialog behavior", + "historicGap": "Not-found/error-boundary retry route; full locale/theme/state cross-product and OS theme changes", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-E09", + "capability": "**PRES-E09** — Account-switch private-state disposal and stale request rejection", + "entry": "`All private routes; tabs/BFCache/focus`", + "owners": "App, api, sessionBoundary; SessionContextMiddleware", + "existingEvidence": "[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], [B:OwnershipGuard][B:OwnershipGuardTests]. B02 stale mutation/read abort, account-scoped state; four real-API/two-tab account-isolation browser cases", + "historicGap": "Real BFCache variations and long offline retry; preserve server precondition even with old bundles", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J01", + "capability": "**PRES-J01** — NAV discovery/filter/sort/source/deadline/details", + "entry": "`/discover`", + "owners": "JobDiscoveryPage; JobDiscoveryController", + "existingEvidence": "[F:job-discovery][F:job-discovery.test.tsx]; [B:JobDiscoveryController][B:JobDiscoveryControllerTests], [B:JobOpportunitySync][B:JobOpportunitySyncTests]. Search/sort/source details, empty versus failure/retry; responsive discovery browser", + "historicGap": "Live NAV freshness/API availability; long result keyboard traversal", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J02", + "capability": "**PRES-J02** — Saved searches, run/delete/alerts, result changes/dismissal", + "entry": "`/discover`", + "owners": "JobDiscoveryPage; saved-search/alert services", + "existingEvidence": "[F:job-discovery][F:job-discovery.test.tsx]; [B:SavedJobSearchAlert][B:SavedJobSearchAlertTests], [B:JobDiscoveryController][B:JobDiscoveryControllerTests]. Saved search run, pause and dismiss controls; owner-scoped alert results", + "historicGap": "Scheduler-to-notification browser journey, delete confirmation on mobile", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J03", + "capability": "**PRES-J03** — Reviewed manual/URL/paste job create, company/tags/dates, duplicates", + "entry": "`Shell AddJobModal`", + "owners": "AddJobModal; JobImportService, JobApplicationsController", + "existingEvidence": "[F:quick-capture][F:quick-capture.test.tsx]; [B:JobImportService][B:JobImportServiceTests], [B:JobImportHttpTransport][B:JobImportHttpTransportTests], [B:JobApplicationsController][B:JobApplicationsControllerTests]. Preview before write, URL prefills, manual browser create; B01 real connection boundary", + "historicGap": "Duplicate warning and company/date edge UI; creation-intent idempotency remains separate unresolved contract", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J04", + "capability": "**PRES-J04** — Extension/bookmarklet/share capture; post-create attachment/CV", + "entry": "`?add= / ?addtext=; QuickCaptureCard; browser-extension`", + "owners": "App, captureUrl, QuickCaptureCard; job/CV APIs", + "existingEvidence": "[F:captureUrl][F:captureUrl.test.ts], [F:quick-capture][F:quick-capture.test.tsx], [F:quick-command-preservation][F:quick-command-preservation.test.tsx]; [B:JobImportService][B:JobImportServiceTests], [B:CvBuilder][B:CvBuilderTests]. Capture URL encoding/review/no auto-create, post-create CV; extension node tests; NEW keyboard add opens review only", + "historicGap": "Installed extension permissions/browser-share flow and optional attachment failure recovery", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J05", + "capability": "**PRES-J05** — Job filters/sort/page/columns, saved views and row/mobile actions", + "entry": "`/jobs`", + "owners": "JobTable, SavedViewsMenu; JobApplicationsController", + "existingEvidence": "[F:application-workspace-overlay][F:application-workspace-overlay.test.tsx], [F:account-scoped-state][F:account-scoped-state.test.tsx], [F:daily-control-loop][F:daily-control-loop.test.tsx]; [B:JobApplicationsController][B:JobApplicationsControllerTests], [B:JobApplicationsEndpointBehavior][B:JobApplicationsEndpointBehaviorTests]. URL hydration, selection does not open row, list return/focus; browser dirty/full workspace", + "historicGap": "Saved-view CRUD browser journey, page-size changes with dirty nested state", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J06", + "capability": "**PRES-J06** — Bulk status/delete, soft delete/trash/restore and job edit", + "entry": "`/jobs; /trash; EditJobDialog`", + "owners": "JobTable, EditJobDialog; job lifecycle/controller", + "existingEvidence": "[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], [B:JobLifecycleEvent][B:JobLifecycleEventTests]. Selection and destructive confirmation primitive; server CRUD/ownership/lifecycle behavior", + "historicGap": "Bulk partial failure and trash→restore UI journey; shared confirm tests alone do not prove bulk flow", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J07", + "capability": "**PRES-J07** — Kanban grouped statuses, pointer/keyboard move and precise menu", + "entry": "`/kanban`", + "owners": "KanbanBoard, pipeline; status endpoint", + "existingEvidence": "[F:kanban-grouped-board][F:kanban-grouped-board.test.tsx], [F:pipeline][F:pipeline.test.ts]; [B:JobPipeline][B:JobPipelineTests]. Keyboard pickup/drop, failed move keeps card, custom group and precise stages; dark browser test", + "historicGap": "Touch drag, keyboard cancel/focus after responsive view switching", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J08", + "capability": "**PRES-J08** — Company/contact edits, pipeline dates and linked-job history", + "entry": "`/companies; ?edit=id`", + "owners": "CompaniesTable; company relationship APIs", + "existingEvidence": "[F:companies-relationship][F:companies-relationship.test.tsx], [F:quick-command-preservation][F:quick-command-preservation.test.tsx]; [B:CompanyRelationship][B:CompanyRelationshipTests]. Job history/context and NEW command company destination", + "historicGap": "All contact/date edits persisted through browser; source URL safety", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J09", + "capability": "**PRES-J09** — Recorded offers/compensation/deadlines/notes and source links", + "entry": "`/offers`", + "owners": "OfferComparisonPage; job API", + "existingEvidence": "[F:offer-comparison][F:offer-comparison.test.tsx]; [B:AnalyticsSalary][B:AnalyticsSalaryTests], [B:JobApplicationsEndpointBehavior][B:JobApplicationsEndpointBehaviorTests]. Recorded values/empty states and salary normalization", + "historicGap": "Mobile many-offer comparison; localized currency/date visual review", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-J10", + "capability": "**PRES-J10** — CSV/JSON export, JSON import and CSV-to-JSON conversion", + "entry": "`/settings; ImportExportJobs`", + "owners": "ImportExportJobs; CSV/job controller", + "existingEvidence": "[F:csv-export][F:csv-export.test.tsx]; [B:CsvExport][B:CsvExportTests], [B:JobApplicationsController][B:JobApplicationsControllerTests]. B05 formula/quotes/UTF-8/typed dates and numeric behavior; CSV browser byte download", + "historicGap": "Full browser JSON import/count/roundtrip; Excel/LibreOffice compatibility remains separately bounded", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W01", + "capability": "**PRES-W01** — Full workspace, sections, legacy links and optional reusable overlay", + "entry": "`/jobs/:id; /applications/:id; section/followMode`", + "owners": "ApplicationWorkspacePage, jobWorkspaceRoute; workspace API", + "existingEvidence": "[F:application-workspace-overlay][F:application-workspace-overlay.test.tsx], [F:applicationWorkspace][F:applicationWorkspace.test.ts], [F:application-route-contracts][F:application-route-contracts.test.ts]; [B:ApplicationWorkspace][B:ApplicationWorkspaceTests]. Deep links, dirty cancel/discard, missing job and back/filter/focus; NEW actual App command/legacy entry", + "historicGap": "No active production caller of override/onClose overlay props found; full overlay parity needs a host fixture before adoption", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W02", + "capability": "**PRES-W02** — Detail/status/progression, recruiter/dates/description/timeline", + "entry": "`/jobs/:id overview`", + "owners": "WorkspaceHeader, JobDetailsSection, ApplicationProgress/Timeline; workflow APIs", + "existingEvidence": "[F:application-intelligence][F:application-intelligence.test.tsx], [F:workflow-trust-signals][F:workflow-trust-signals.test.tsx], [F:daily-control-loop][F:daily-control-loop.test.tsx]; [B:JobApplicationsWorkflowSignals][B:JobApplicationsWorkflowSignalsTests], [B:JobApplicationsAppliedDateHistory][B:JobApplicationsAppliedDateHistoryTests]. Timeline source labels, next-action routing and applied-date history", + "historicGap": "Edit/status→timeline real-browser sequence across locale/timezone", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W03", + "capability": "**PRES-W03** — Analysis, match/gaps, strategy and reviewed status/workflow suggestions", + "entry": "`/jobs/:id?section=analysis`", + "owners": "ApplicationAnalysis/Match/StrategySnapshot/StatusSuggestion; intelligence/AI services", + "existingEvidence": "[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], [B:JobApplicationsEndpointBehavior][B:JobApplicationsEndpointBehaviorTests]. Loading/error/empty states, match and explicit suggested action behavior", + "historicGap": "Actual model truthfulness/evaluation; source freshness and cancelled generation browser states", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W04", + "capability": "**PRES-W04** — Checklist create/edit/complete/delete/order and next action", + "entry": "`Job overview/checklist entry`", + "owners": "ApplicationChecklist; checklist service/controller", + "existingEvidence": "[F:application-checklist][F:application-checklist.test.tsx]; [B:ApplicationChecklist][B:ApplicationChecklistTests]. Persisted item actions and keyboard reorder; localized readiness", + "historicGap": "Real-API mobile edit/delete and interruption recovery", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W05", + "capability": "**PRES-W05** — Attach/select/create/tailor CV and source context", + "entry": "`Job CV section; builder deep link`", + "owners": "ApplicationCvSection/TailoringSection; ApplicationAssetsService", + "existingEvidence": "[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]. Attach re-points only, detach keeps variant, foreign owner denied, tailoring never writes source; B02 API browser", + "historicGap": "P2-D01 SQLite tailoring ordering blocks successful real-browser guidance; actual attach→render relationship beyond existing service coverage", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W06", + "capability": "**PRES-W06** — Cover-letter manual/AI review, versions/restore and dirty protection", + "entry": "`Job cover-letter section`", + "owners": "ApplicationCoverLetterSection, CoverLetterAiAssistant; assets/history", + "existingEvidence": "[F:application-assets][F:application-assets.test.tsx], [F:application-workspace-overlay][F:application-workspace-overlay.test.tsx]; [B:ApplicationAssets][B:ApplicationAssetsTests]. Manual save/discard/restore, linked-CV AI explicit apply then save, version history owner scope", + "historicGap": "Whole-browser AI reject/provider success and cover-letter history persistence; no actual model called here", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W07", + "capability": "**PRES-W07** — Application drafts and immutable submitted package/archived binaries", + "entry": "`Job cover-letter drafts; CV section package history`", + "owners": "ApplicationPackageDraftsSection, SubmittedPackagesSection; package service/storage", + "existingEvidence": "[F:application-assets][F:application-assets.test.tsx], [F:application-drafts][F:application-drafts.test.ts]; [B:SubmittedApplicationPackage][B:SubmittedApplicationPackageTests], [B:JobApplicationsApplicationPackage][B:JobApplicationsApplicationPackageTests], [B:JobApplicationsEndpointBehavior][B:JobApplicationsEndpointBehaviorTests]. Drafts keep ordinary notes; service frozen document/hash/copy-failure/tenant assertions; NEW native browser capture oracle", + "historicGap": "P2-D01 expected failure: SQLite capture 500. NEW post-capture mutation/archive assertions are NOT reached. Require real storage/provider success before package restructuring", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W08", + "capability": "**PRES-W08** — Attachments upload/category/name/AI consent/preview/download/delete", + "entry": "`Job overview Documents accordion; package archive`", + "owners": "Attachments; AttachmentsController, AttachmentStorage", + "existingEvidence": "[F:attachments][F:attachments.test.tsx]; [B:AttachmentsController][B:AttachmentsControllerTests], [B:AttachmentConsistency][B:AttachmentConsistencyTests], [B:AttachmentFlagsRecompute][B:AttachmentFlagsRecomputeTests]. Empty/flag controls, storage consistency and owned download; NEW browser fixture uploads real UTF-8 binary", + "historicGap": "Archived bytes after live delete blocked by W07; drag/drop, rename and download browser journey", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W09", + "capability": "**PRES-W09** — Interview questions/answers/ready/manual removal/AI review", + "entry": "`Job interview section`", + "owners": "InterviewPrep; interview persistence/AI endpoints", + "existingEvidence": "[F:interview-prep][F:interview-prep.test.tsx]; [B:InterviewPrepPersistence][B:InterviewPrepPersistenceTests], [B:InterviewAiContext][B:InterviewAiContextTests], [B:InterviewPrep][B:InterviewPrepTests]. Explicit AI add, manual/answer readiness, relevant prompt context without invented defaults", + "historicGap": "Populated mobile keyboard editing and real reload; actual model quality separate", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W10", + "capability": "**PRES-W10** — Debrief/follow-up draft/date/readiness", + "entry": "`Job interview section; follow-up entry`", + "owners": "InterviewPrep; follow-up draft services", + "existingEvidence": "[F:interview-prep][F:interview-prep.test.tsx]; [B:JobApplicationsFollowUpDraft][B:JobApplicationsFollowUpDraftTests], [B:InterviewPrep][B:InterviewPrepTests]. Neutral debrief template and follow-up content handling", + "historicGap": "Timezone/reload browser chain; calendar defects remain outside Phase 2", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W11", + "capability": "**PRES-W11** — Reminder rules/actions/notifications, ICS and Google/Outlook events", + "entry": "`/reminders; job calendar actions; /settings`", + "owners": "RemindersView, RulesSettingsCard, ApplicationCalendarActions; calendar/rules APIs", + "existingEvidence": "[F:daily-control-loop][F:daily-control-loop.test.tsx], [F:application-calendar][F:application-calendar.test.tsx], [F:settings-view][F:settings-view.test.tsx]; [B:ApplicationCalendarController][B:ApplicationCalendarControllerTests], [B:RulesEngineProspect][B:RulesEngineProspectTests], [B:NotificationSettingsController][B:NotificationSettingsControllerTests]. Provider write confirmation, ICS and permission; NEW per-scenario rule payload and real saved preference checks", + "historicGap": "DST/date-only correctness and real provider timezone must be resolved separately; initial rules 500 not reproduced", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-W12", + "capability": "**PRES-W12** — Async progress/failure/retry/cancel/notifications", + "entry": "`/operations; profile processing`", + "owners": "OperationsPage, CareerProfilePage; operation store/worker", + "existingEvidence": "[F:operations-page][F:operations-page.test.tsx], [F:profile-page][F:profile-page.test.tsx]; [B:OperationsController][B:OperationsControllerTests], [B:UserOperationStore][B:UserOperationStoreTests], [B:CvProcessingOperation][B:CvProcessingOperationTests]. Failure retry/cancel, durable operation IDs; extraction polling keeps dirty fields", + "historicGap": "Long-lived disconnect/reconnect and worker fault/recovery operational gaps", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C01", + "capability": "**PRES-C01** — Canonical structured career data and long-tail/custom sections", + "entry": "`/career?section=profile`", + "owners": "CareerProfilePage, career views; CareerProfileService/controller", + "existingEvidence": "[F:profile-page][F:profile-page.test.tsx]; [B:CareerProfileController][B:CareerProfileControllerTests], [B:CareerProfileService][B:CareerProfileServiceTests]. Structured field changes propagate to saved singleton, stable child IDs and relational roundtrip; NEW CV edit leaves master unchanged", + "historicGap": "Every long-tail section/mobile keyboard save; concurrent canonical saves outside scope", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C02", + "capability": "**PRES-C02** — Profile overview/completeness/import guidance/raw copy/history/restore", + "entry": "`/career`", + "owners": "CareerWorkspacePage, CareerProfilePage; version service", + "existingEvidence": "[F:career-workspace-page][F:career-workspace-page.test.tsx], [F:profile-page][F:profile-page.test.tsx]; [B:CareerProfileService][B:CareerProfileServiceTests]. First/returning state, completeness/errors and non-destructive history restore", + "historicGap": "Clipboard/avatar and full browser historical restore; real extraction quality separate", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C03", + "capability": "**PRES-C03** — Upload/extract/rebuild/reprocess/diff/select/accept/discard/retry/cancel", + "entry": "`Career import/review`", + "owners": "CareerProfilePage; profile-CV/processing/diff services", + "existingEvidence": "[F:profile-page][F:profile-page.test.tsx]; [B:ProfileCvController][B:ProfileCvControllerTests], [B:CvProfileDiffService][B:CvProfileDiffServiceTests], [B:CvProcessingOperation][B:CvProcessingOperationTests], [B:CvExtractionCoverage][B:CvExtractionCoverageTests]. Queue/upload, operation retry, pending explicit apply and polling retains edits; extraction/diff service checks", + "historicGap": "Manual low-confidence deselection/discard UI; OCR/scanned/unusual real-document quality", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C04", + "capability": "**PRES-C04** — Evidence bank source/category/tags/add/list/delete", + "entry": "`Career overview/evidence`", + "owners": "CareerEvidenceBank; CareerEvidenceController", + "existingEvidence": "[F:career-evidence][F:career-evidence.test.tsx]; [B:CareerEvidenceController][B:CareerEvidenceControllerTests]. Sourced evidence creation, tags and owner boundaries", + "historicGap": "Delete and many-item search/keyboard browser flow", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C05", + "capability": "**PRES-C05** — CV library create/copy/delete/templates/share/publication/PDF", + "entry": "`/career/builder`", + "owners": "CvBuilderPage, thumbnails; CvVariantService/PublicCvController", + "existingEvidence": "[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]. General/job-specific creation, delete cancel, duplication fresh slug, public revoke/republish; existing public browser PDF", + "historicGap": "Complete library→publish/unpublish/revoke old link browser chain", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C06", + "capability": "**PRES-C06** — Studio tabs, preview debounce/pages/fit/save state/mobile panes", + "entry": "`/career/builder/:id`", + "owners": "CvBuilderEditor, CvPreviewPane; preview API", + "existingEvidence": "[F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:CvBuilder][B:CvBuilderTests]. Five tabs, deep-link/error/save state and preview retry; NEW real mobile Edit/Preview, reload and desktop split", + "historicGap": "Keyboard preview scroll/focus (known F15), all theme/page interactions", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C07", + "capability": "**PRES-C07** — Visibility/order/custom sections and item/document overrides", + "entry": "`Builder Content`", + "owners": "CvBuilderEditor, CV controls/useDragReorder; resolver/settings", + "existingEvidence": "[F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx], [F:cvBuilder][F:cvBuilder.test.ts]; [B:CvBuilder][B:CvBuilderTests]. Add/edit/delete/order/hide, override renders without master change; NEW persisted headline and sibling isolation", + "historicGap": "Native drag/touch and override reset-to-source browser flow; item-level real saved overrides beyond headline", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C08", + "capability": "**PRES-C08** — Capability-aware templates/typography/color/header/skills/sidebar/photo", + "entry": "`Builder Template/Customize`", + "owners": "CvCustomizeTab, registry; ThemedCvRenderer", + "existingEvidence": "[F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx], [F:cvBuilder][F:cvBuilder.test.ts], [F:cv-template-thumbnail][F:cv-template-thumbnail.test.tsx]; [B:CvBuilder][B:CvBuilderTests]. Template change clears incompatible defaults; normalized overrides reach shared renderer, safe color/markdown", + "historicGap": "Complete template×advanced control visual/render parity; inaccessible color controls baseline", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C09", + "capability": "**PRES-C09** — A4/Letter/density/margins/dates/document locale/section presentation", + "entry": "`Builder Customize/Content`", + "owners": "cvBuilder, CvCustomizeTab; settings normalization/render model", + "existingEvidence": "[F:cvBuilder][F:cvBuilder.test.ts], [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:CvBuilder][B:CvBuilderTests]. Page sizes, NB controls/default labels/dates, section grid/columns; existing long searchable PDF browser", + "historicGap": "All advanced combinations, print margins and long localized text manual review", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C10", + "capability": "**PRES-C10** — Undo/redo, save queue, dirty guard, history restore/preview lifecycle", + "entry": "`Builder editor/history`", + "owners": "CvBuilderEditor; CvVariantService version history", + "existingEvidence": "[F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:CvBuilder][B:CvBuilderTests]. Undo/redo, failed save retry, guard cancel, restore-as-new-version; NEW saved override reload", + "historicGap": "Multi-browser stale-CV revision remains separate defect; history-tab browser restore and offline navigation", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C11", + "capability": "**PRES-C11** — Section and whole-document AI improve/translate/instruction/grammar review", + "entry": "`Builder AI Tools/content assistant`", + "owners": "AiSectionAssistant, DocumentAiTab; CV AI assist", + "existingEvidence": "[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], [B:ProEntitlementAuthorization][B:ProEntitlementAuthorizationTests]. NEW reject/close, edited acceptance, failure retry, whole-document apply/reject and malformed/missing/duplicate IDs rejected; no implicit PUT", + "historicGap": "Real model factual validation and section→whole review interactions; Free-disabled controls proven in new browser", + "entryStatus": "DEFERRED", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-C12", + "capability": "**PRES-C12** — Private PDF and published anonymous CV/PDF, long searchable pages", + "entry": "`Builder export; /cv/:slug`", + "owners": "PublicCvPage, cvBuilder; HtmlPdfGenerator/shared admission", + "existingEvidence": "[F:public-cv-page][F:public-cv-page.test.tsx]; [B:PublicCvController][B:PublicCvControllerTests], [B:PdfRenderAdmission][B:PdfRenderAdmissionTests], [B:CvBuilder][B:CvBuilderTests]. Anonymous public rendering versus private refusal; B03 shared capacity/failure; real multipage/public PDF browser", + "historicGap": "All templates/print engines; deployed Chromium/font behavior and PDF manual inspection", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-M01", + "capability": "**PRES-M01** — Job-scoped manual correspondence/search/delete/paste import", + "entry": "`Workspace communication accordion`", + "owners": "Correspondence; CorrespondenceController", + "existingEvidence": "[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]. Canonical communication entry does not send mail, job context and CRUD ownership", + "historicGap": "Manual note edit/delete/paste-import real browser; preserve send/log distinction", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-M02", + "capability": "**PRES-M02** — Gmail candidate/thread import/refresh/sync/unlink/relink/move", + "entry": "`Job communication Gmail tools`", + "owners": "Correspondence; GmailController/provider", + "existingEvidence": "[F:correspondence-gmail-import][F:correspondence-gmail-import.test.tsx]; [B:GmailController][B:GmailControllerTests], [B:EmailOwnershipIntegration][B:EmailOwnershipIntegrationTests]. Candidates, selected thread import/move/refresh and diagnostics; owner-bound relationships", + "historicGap": "Real provider/sandbox threads, multi-account reconnect and sync failure", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-M03", + "capability": "**PRES-M03** — Global inbox filters/page/provider/link/direction/detail/source links", + "entry": "`/correspondence`", + "owners": "CorrespondenceInboxPage; EmailController", + "existingEvidence": "[F:correspondence-inbox-page][F:correspondence-inbox-page.test.tsx]; [B:EmailController][B:EmailControllerTests], [B:EmailOwnershipIntegration][B:EmailOwnershipIntegrationTests]. Filter/pagination/detail/provider read failure distinct from empty", + "historicGap": "Real large mailbox and attachment binary browser flows", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-M04", + "capability": "**PRES-M04** — Compose/reply/provider/recipient/job; draft conflicts; confirm send/uncertainty", + "entry": "`/correspondence drafts/compose`", + "owners": "CorrespondenceInboxPage; EmailDrafts/Send/attempt store", + "existingEvidence": "[F:correspondence-inbox-page][F:correspondence-inbox-page.test.tsx]; [B:EmailDraftsController][B:EmailDraftsControllerTests], [B:EmailDraftPersistence][B:EmailDraftPersistenceTests], [B:EmailSendController][B:EmailSendControllerTests], [B:EmailSendAttemptStore][B:EmailSendAttemptStoreTests], [B:EmailProviderDelivery][B:EmailProviderDeliveryTests]. Revision conflicts, explicit send confirm, uncertain state has no automatic retry, deliberate new attempt", + "historicGap": "Actual sandbox mail delivery and browser reconnect; do not loosen idempotency/conflict guards", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-M05", + "capability": "**PRES-M05** — Review proposed jobs/link/reject/keep/notes/sync/create", + "entry": "`/correspondence?view=review; /correspondence/review`", + "owners": "GmailReviewPage, CorrespondenceInboxPage; Gmail review", + "existingEvidence": "[F:gmail-review-page][F:gmail-review-page.test.tsx], [F:correspondence-inbox-page][F:correspondence-inbox-page.test.tsx]; [B:GmailController][B:GmailControllerTests]. Review decisions/localization and inbox review entry", + "historicGap": "Real App legacy alias and suggested-job create browser workflow", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-M06", + "capability": "**PRES-M06** — Gmail/Graph/IMAP connect/status/disconnect separate from sign-in", + "entry": "`/settings/connected-accounts`", + "owners": "EmailProviderConnections; Google/Graph/IMAP controllers", + "existingEvidence": "[F:email-provider-connections][F:email-provider-connections.test.tsx]; [B:MicrosoftGraphController][B:MicrosoftGraphControllerTests], [B:ImapController][B:ImapControllerTests], [B:ImapServiceSsrfGuard][B:ImapServiceSsrfGuardTests], [B:GmailController][B:GmailControllerTests]. Connection state/NB/IMAP form and provider ownership; outbound IMAP safety", + "historicGap": "Actual provider authorization/revocation/token expiry; no credentials contacted in new tests", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-S01", + "capability": "**PRES-S01** — Personal metrics/activity/funnel/company/skills/stage/salary/next actions", + "entry": "`/dashboard`", + "owners": "DashboardView; analytics/controllers", + "existingEvidence": "[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]. Empty dashboard prioritizes onboarding, attention deep links; server analytics facts", + "historicGap": "Chart transformation fidelity and full populated/timezone browser dashboard", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-S02", + "capability": "**PRES-S02** — Owner-local five visibility preferences/onboarding dismiss/notifications", + "entry": "`/dashboard; notification bell`", + "owners": "DashboardView, OnboardingChecklist, NotificationsPopover; notification APIs", + "existingEvidence": "[F:onboarding-checklist][F:onboarding-checklist.test.tsx], [F:notifications-popover][F:notifications-popover.test.tsx], [F:app-shell-notifications][F:app-shell-notifications.test.tsx], [F:account-scoped-state][F:account-scoped-state.test.tsx]; [B:JobLifecycleEvent][B:JobLifecycleEventTests]. Onboarding actions; unread/read/dismiss UI and owner-scoped storage primitive", + "historicGap": "Five dashboard toggles/reload per account not fully tested at mounted dashboard; ordering/resizing is new work", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-S03", + "capability": "**PRES-S03** — Rules/reminder/table/theme/language preferences and account links", + "entry": "`/settings tabs/mobile selector`", + "owners": "SettingsView, RulesSettingsCard, theme/i18n; rules/notification/auth", + "existingEvidence": "[F:settings-view][F:settings-view.test.tsx], [F:theme-state][F:theme-state.test.tsx], [F:i18n-provider][F:i18n-provider.test.tsx]; [B:NotificationSettingsController][B:NotificationSettingsControllerTests], [B:RulesEngineProspect][B:RulesEngineProspectTests]. NEW failed notification retry, rule scenario preservation; NEW mobile→desktop edit + native notification/rule persistence", + "historicGap": "Initial single rules 500 unconfirmed; unsaved rule drafts are not persisted across tab unmount; table preference/router identity change gap", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-S04", + "capability": "**PRES-S04** — AI privacy/usage/limits/Free-Pro/server entitlement/conditional billing", + "entry": "`/settings; locked AI controls; plans`", + "owners": "AiPrivacySettingsCard, AiUsageCard, AccountPlanProvider; billing/entitlement", + "existingEvidence": "[F:settings-view][F:settings-view.test.tsx], [F:ai-usage-card][F:ai-usage-card.test.tsx], [F:pro-feature-notice][F:pro-feature-notice.test.tsx], [F:planCatalog][F:planCatalog.test.ts]; [B:AiPrivacyPolicy][B:AiPrivacyPolicyTests], [B:AiUsageMeter][B:AiUsageMeterTests], [B:ProEntitlementAuthorization][B:ProEntitlementAuthorizationTests], [B:BillingController][B:BillingControllerTests]. Local-only AI setting, limits/locks, billing readiness; NEW real Free CV AI denied UI and API", + "historicGap": "Real checkout/webhooks/portal; billing/account deletion issues retain independent queue", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-S05", + "capability": "**PRES-S05** — Account ZIP/encrypted backup/lifecycle/deletion confirmations", + "entry": "`Settings Backup tab`", + "owners": "BackupCard; export/backup/deletion services", + "existingEvidence": "[F:account-data-export][F:account-data-export.test.tsx]; [B:AccountDataExport][B:AccountDataExportTests], [B:BackupController][B:BackupControllerTests], [B:AccountDeletion][B:AccountDeletionTests], [B:DatabaseBackupRunner][B:DatabaseBackupRunnerTests]. ZIP protected download, recent auth, server enable flag and exact deletion phrase; service deletion/backup", + "historicGap": "Real restored account/database and paid deletion/provider cancellation operational proof; not safe to run against production", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-A01", + "capability": "**PRES-A01** — Admin user/create/roles/reset/delete/last-admin/self guards", + "entry": "`/admin/users`", + "owners": "AdminUsersPage; UsersController", + "existingEvidence": "[F:admin-users-page][F:admin-users-page.test.tsx]; [B:UsersController][B:UsersControllerTests], [B:ApiAuthorizationPosture][B:ApiAuthorizationPostureTests]. Demotion/delete confirm, last-admin server checks; NEW non-admin crafted create/read denied", + "historicGap": "Role revocation during mounted admin view and actual reset delivery; route can render empty shell without granting privilege", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-A02", + "capability": "**PRES-A02** — Audit list/detail/supported undo/job restore", + "entry": "`/admin/audit`", + "owners": "AdminAuditPage; AdminAuditController", + "existingEvidence": "[F:admin-audit-page][F:admin-audit-page.test.tsx]; [B:AuthAndSystemController][B:AuthAndSystemControllerTests], [B:ApiAuthorizationPosture][B:ApiAuthorizationPostureTests]. Unavailable-versus-empty retry and NB stored event text; server admin-only posture", + "historicGap": "Successful undo and job-restore UI against persisted API; role posture test is not undo behavior proof", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + }, + { + "id": "PRES-A03", + "capability": "**PRES-A03** — System/build/DB/AI/mail/SMTP/test/probe/benchmark/maintenance", + "entry": "`/admin/system`", + "owners": "AdminSystemPage; AdminSystemController/maintenance/benchmark", + "existingEvidence": "[F:admin-system-page][F:admin-system-page.test.tsx]; [B:AuthAndSystemController][B:AuthAndSystemControllerTests], [B:MaintenanceJobDispatcher][B:MaintenanceJobDispatcherTests], [B:CvCorpusHarness][B:CvCorpusHarnessTests]. Health/error/NB, SMTP submit and benchmark controls; dispatcher authorization and modes", + "historicGap": "Production SMTP/model/corpus/maintenance and sensitive-data presentation; no live jobs launched", + "entryStatus": "PARTIAL", + "phase9Status": "NOT TESTED" + } + ], + "apiOwners": [ + { + "file": "JobTrackerApi/Controllers/AccountLifecycleController.cs", + "baseRoutes": [ + "api/account-lifecycle" + ], + "actions": [ + { + "method": "GET", + "suffix": "status" + }, + { + "method": "POST", + "suffix": "delete" + }, + { + "method": "GET", + "suffix": "admin/requests/{id:guid}" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(Roles = \"Admin\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/AdminAuditController.cs", + "baseRoutes": [ + "api/admin/audit" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "POST", + "suffix": "{id:int}/undo" + } + ], + "authorizationAttributes": [ + "[Authorize(Roles = \"Admin\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/AdminSystemController.cs", + "baseRoutes": [ + "api/admin/system" + ], + "actions": [ + { + "method": "POST", + "suffix": "ai/probe" + }, + { + "method": "POST", + "suffix": "summarizer/probe" + }, + { + "method": "GET", + "suffix": "email-settings" + }, + { + "method": "PUT", + "suffix": "email-settings" + }, + { + "method": "GET", + "suffix": "cv-benchmark" + }, + { + "method": "GET", + "suffix": "maintenance-jobs" + }, + { + "method": "POST", + "suffix": "maintenance-jobs/{jobId}/runs" + }, + { + "method": "GET", + "suffix": "" + } + ], + "authorizationAttributes": [ + "[Authorize(Roles = \"Admin\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/AiSettingsController.cs", + "baseRoutes": [ + "api/ai/settings" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/AiUsageController.cs", + "baseRoutes": [ + "api/ai/usage" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/AiWorkspaceController.cs", + "baseRoutes": [ + "api/jobapplications/{jobId:int}/ai" + ], + "actions": [ + { + "method": "GET", + "suffix": "modules" + }, + { + "method": "POST", + "suffix": "generate" + }, + { + "method": "GET", + "suffix": "history" + }, + { + "method": "DELETE", + "suffix": "history/{id:int}" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(Policy = ProEntitlement.Policy)]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ApplicationAssetsController.cs", + "baseRoutes": [ + "api/jobapplications/{jobId:int}" + ], + "actions": [ + { + "method": "GET", + "suffix": "cv" + }, + { + "method": "PUT", + "suffix": "cv" + }, + { + "method": "GET", + "suffix": "tailoring" + }, + { + "method": "GET", + "suffix": "cover-letter" + }, + { + "method": "PUT", + "suffix": "cover-letter" + }, + { + "method": "POST", + "suffix": "cover-letter/versions/{version:int}/restore" + }, + { + "method": "GET", + "suffix": "submitted-packages" + }, + { + "method": "POST", + "suffix": "submitted-packages" + }, + { + "method": "GET", + "suffix": "submitted-packages/{packageId:int}" + }, + { + "method": "GET", + "suffix": "submitted-packages/{packageId:int}/attachments/{attachmentId:int}" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ApplicationCalendarController.cs", + "baseRoutes": [ + "api/calendar" + ], + "actions": [ + { + "method": "GET", + "suffix": "status" + }, + { + "method": "POST", + "suffix": "jobs/{jobId:int}/events" + }, + { + "method": "GET", + "suffix": "jobs/{jobId:int}/events.ics" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ApplicationChecklistController.cs", + "baseRoutes": [ + "api/jobapplications/{jobId:int}/checklist" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "POST", + "suffix": "" + }, + { + "method": "PATCH", + "suffix": "{itemId:int}" + }, + { + "method": "DELETE", + "suffix": "{itemId:int}" + }, + { + "method": "PUT", + "suffix": "order" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ApplicationIntelligenceController.cs", + "baseRoutes": [ + "api/jobapplications/{jobId:int}" + ], + "actions": [ + { + "method": "GET", + "suffix": "timeline" + }, + { + "method": "GET", + "suffix": "analysis" + }, + { + "method": "GET", + "suffix": "match" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ApplicationWorkspaceController.cs", + "baseRoutes": [ + "api/jobapplications/{jobId:int}/workspace" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/AttachmentsController.cs", + "baseRoutes": [ + "api/attachments" + ], + "actions": [ + { + "method": "GET", + "suffix": "{jobId:int}" + }, + { + "method": "GET", + "suffix": "download/{id:int}" + }, + { + "method": "PATCH", + "suffix": "{id:int}" + }, + { + "method": "DELETE", + "suffix": "{id:int}" + }, + { + "method": "POST", + "suffix": "" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/AuthController.cs", + "baseRoutes": [ + "api/auth" + ], + "actions": [ + { + "method": "GET", + "suffix": "config" + }, + { + "method": "POST", + "suffix": "login" + }, + { + "method": "POST", + "suffix": "register" + }, + { + "method": "POST", + "suffix": "google/exchange" + }, + { + "method": "POST", + "suffix": "microsoft/exchange" + }, + { + "method": "POST", + "suffix": "microsoft/legacy-relink/confirm" + }, + { + "method": "POST", + "suffix": "logout" + }, + { + "method": "GET", + "suffix": "csrf" + }, + { + "method": "GET", + "suffix": "me" + }, + { + "method": "PUT", + "suffix": "profile" + }, + { + "method": "GET", + "suffix": "preferences/dashboard" + }, + { + "method": "PUT", + "suffix": "preferences/dashboard" + }, + { + "method": "PUT", + "suffix": "preferences/language" + }, + { + "method": "GET", + "suffix": "email-change" + }, + { + "method": "POST", + "suffix": "email-change/request" + }, + { + "method": "POST", + "suffix": "email-change/confirm" + }, + { + "method": "POST", + "suffix": "email-change/cancel" + }, + { + "method": "POST", + "suffix": "google/link" + }, + { + "method": "DELETE", + "suffix": "google/link" + }, + { + "method": "POST", + "suffix": "microsoft/link" + }, + { + "method": "DELETE", + "suffix": "microsoft/link" + }, + { + "method": "POST", + "suffix": "avatar" + }, + { + "method": "DELETE", + "suffix": "avatar" + }, + { + "method": "POST", + "suffix": "change-password" + }, + { + "method": "POST", + "suffix": "request-password-reset" + }, + { + "method": "POST", + "suffix": "reset-password" + }, + { + "method": "POST", + "suffix": "verify-email" + }, + { + "method": "POST", + "suffix": "resend-verification-email" + } + ], + "authorizationAttributes": [ + "[Authorize]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/BackupController.cs", + "baseRoutes": [ + "api/backup" + ], + "actions": [ + { + "method": "POST", + "suffix": "encrypted" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/BillingController.cs", + "baseRoutes": [ + "api/billing" + ], + "actions": [ + { + "method": "GET", + "suffix": "status" + }, + { + "method": "POST", + "suffix": "checkout" + }, + { + "method": "POST", + "suffix": "portal" + }, + { + "method": "POST", + "suffix": "webhook" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/CareerEvidenceController.cs", + "baseRoutes": [ + "api/career/evidence" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "POST", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "{id:int}" + }, + { + "method": "DELETE", + "suffix": "{id:int}" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/CareerProfileController.cs", + "baseRoutes": [ + "api/career/profile" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "" + }, + { + "method": "GET", + "suffix": "completeness" + }, + { + "method": "GET", + "suffix": "versions" + }, + { + "method": "POST", + "suffix": "versions/{version:int}/restore" + } + ], + "authorizationAttributes": [ + "[Authorize]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ClientErrorsController.cs", + "baseRoutes": [ + "api/client-errors" + ], + "actions": [ + { + "method": "POST", + "suffix": "" + } + ], + "authorizationAttributes": [] + }, + { + "file": "JobTrackerApi/Controllers/CompaniesController.cs", + "baseRoutes": [ + "api/companies" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "GET", + "suffix": "{id:int}" + }, + { + "method": "GET", + "suffix": "{id:int}/relationship" + }, + { + "method": "POST", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "{id:int}" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/CorrespondenceController.cs", + "baseRoutes": [ + "api/correspondence" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "GET", + "suffix": "page" + }, + { + "method": "GET", + "suffix": "{jobId:int}" + }, + { + "method": "GET", + "suffix": "message/{id:int}" + }, + { + "method": "POST", + "suffix": "" + }, + { + "method": "DELETE", + "suffix": "{id:int}" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/CvVariantController.cs", + "baseRoutes": [ + "api/cv" + ], + "actions": [ + { + "method": "GET", + "suffix": "themes" + }, + { + "method": "GET", + "suffix": "themes/{themeId}/preview" + }, + { + "method": "GET", + "suffix": "outline" + }, + { + "method": "GET", + "suffix": "variants" + }, + { + "method": "POST", + "suffix": "variants" + }, + { + "method": "GET", + "suffix": "variants/{id:int}" + }, + { + "method": "PUT", + "suffix": "variants/{id:int}" + }, + { + "method": "DELETE", + "suffix": "variants/{id:int}" + }, + { + "method": "POST", + "suffix": "variants/{id:int}/duplicate" + }, + { + "method": "PUT", + "suffix": "variants/{id:int}/public" + }, + { + "method": "GET", + "suffix": "variants/{id:int}/versions" + }, + { + "method": "POST", + "suffix": "variants/{id:int}/versions/{version:int}/restore" + }, + { + "method": "GET", + "suffix": "variants/{id:int}/preview" + }, + { + "method": "POST", + "suffix": "preview" + }, + { + "method": "POST", + "suffix": "variants/{id:int}/export-pdf" + }, + { + "method": "POST", + "suffix": "ai/assist" + }, + { + "method": "POST", + "suffix": "variants/{id:int}/ai/apply" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]" + ] + }, + { + "file": "JobTrackerApi/Controllers/DocumentsController.cs", + "baseRoutes": [ + "api/documents" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/EmailController.cs", + "baseRoutes": [ + "api/email" + ], + "actions": [ + { + "method": "GET", + "suffix": "providers" + }, + { + "method": "GET", + "suffix": "messages" + }, + { + "method": "GET", + "suffix": "thread" + }, + { + "method": "GET", + "suffix": "message" + }, + { + "method": "POST", + "suffix": "send" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/EmailDraftsController.cs", + "baseRoutes": [ + "api/email/drafts" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "GET", + "suffix": "{id:guid}" + }, + { + "method": "POST", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "{id:guid}" + }, + { + "method": "DELETE", + "suffix": "{id:guid}" + }, + { + "method": "POST", + "suffix": "{id:guid}/new-attempt" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ExportController.cs", + "baseRoutes": [ + "api/export" + ], + "actions": [ + { + "method": "POST", + "suffix": "account" + }, + { + "method": "GET", + "suffix": "jobs" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/GmailController.cs", + "baseRoutes": [ + "api/gmail" + ], + "actions": [ + { + "method": "GET", + "suffix": "status" + }, + { + "method": "GET", + "suffix": "connect-url" + }, + { + "method": "GET", + "suffix": "job-candidates" + }, + { + "method": "GET", + "suffix": "review-candidates" + }, + { + "method": "POST", + "suffix": "review-decision" + }, + { + "method": "POST", + "suffix": "manual-sync" + }, + { + "method": "GET", + "suffix": "suggested-jobs" + }, + { + "method": "POST", + "suffix": "create-suggested-job" + }, + { + "method": "POST", + "suffix": "relink-thread" + }, + { + "method": "POST", + "suffix": "unlink-thread" + }, + { + "method": "GET", + "suffix": "oauth/callback" + }, + { + "method": "DELETE", + "suffix": "connection" + }, + { + "method": "GET", + "suffix": "messages" + }, + { + "method": "POST", + "suffix": "import" + }, + { + "method": "POST", + "suffix": "import-thread" + }, + { + "method": "POST", + "suffix": "refresh-linked-threads" + } + ], + "authorizationAttributes": [ + "[Authorize]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ImapController.cs", + "baseRoutes": [ + "api/imap" + ], + "actions": [ + { + "method": "GET", + "suffix": "status" + }, + { + "method": "POST", + "suffix": "connect" + }, + { + "method": "DELETE", + "suffix": "connection" + } + ], + "authorizationAttributes": [ + "[Authorize]" + ] + }, + { + "file": "JobTrackerApi/Controllers/InterviewPrepController.cs", + "baseRoutes": [ + "api/jobapplications/{jobId:int}" + ], + "actions": [ + { + "method": "GET", + "suffix": "interview-prep" + }, + { + "method": "POST", + "suffix": "interview-prep" + }, + { + "method": "PATCH", + "suffix": "interview-prep/{itemId:int}" + }, + { + "method": "DELETE", + "suffix": "interview-prep/{itemId:int}" + }, + { + "method": "GET", + "suffix": "follow-up" + }, + { + "method": "PUT", + "suffix": "follow-up" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/JobApplicationAnalyticsController.cs", + "baseRoutes": [ + "api/jobapplications" + ], + "actions": [ + { + "method": "GET", + "suffix": "stats" + }, + { + "method": "GET", + "suffix": "analytics" + }, + { + "method": "GET", + "suffix": "tags" + }, + { + "method": "GET", + "suffix": "analytics-overview" + }, + { + "method": "GET", + "suffix": "tag-trends" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/JobApplicationLifecycleController.cs", + "baseRoutes": [ + "api/jobapplications" + ], + "actions": [ + { + "method": "GET", + "suffix": "pipeline" + }, + { + "method": "PATCH", + "suffix": "{id:int}/status" + }, + { + "method": "GET", + "suffix": "{id:int}/status-suggestion" + }, + { + "method": "DELETE", + "suffix": "{id:int}" + }, + { + "method": "POST", + "suffix": "{id:int}/restore" + }, + { + "method": "PATCH", + "suffix": "{id:int}/followup" + }, + { + "method": "GET", + "suffix": "{id:int}/history" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/JobApplicationsController.cs", + "baseRoutes": [ + "api/jobapplications" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "GET", + "suffix": "{id:int}" + }, + { + "method": "GET", + "suffix": "board" + }, + { + "method": "GET", + "suffix": "reminders" + }, + { + "method": "POST", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "{id:int}" + }, + { + "method": "POST", + "suffix": "{id:int}/refresh-ai" + }, + { + "method": "GET", + "suffix": "{id:int}/match-score" + }, + { + "method": "GET", + "suffix": "{id:int}/candidate-fit" + }, + { + "method": "GET", + "suffix": "{id:int}/interview-prep/brief" + }, + { + "method": "GET", + "suffix": "{id:int}/readiness" + }, + { + "method": "GET", + "suffix": "{id:int}/tailored-cv-draft" + }, + { + "method": "POST", + "suffix": "{id:int}/tailored-cv-preview" + }, + { + "method": "POST", + "suffix": "{id:int}/export-tailored-cv-pdf" + }, + { + "method": "POST", + "suffix": "{id:int}/generate-tailored-cv-draft" + }, + { + "method": "PUT", + "suffix": "{id:int}/tailored-cv-draft" + }, + { + "method": "PUT", + "suffix": "{id:int}/tailored-cv" + }, + { + "method": "PUT", + "suffix": "{id:int}/application-drafts" + }, + { + "method": "POST", + "suffix": "{id:int}/generate-application-package" + }, + { + "method": "GET", + "suffix": "duplicate-check" + }, + { + "method": "GET", + "suffix": "{id:int}/followup-draft" + }, + { + "method": "POST", + "suffix": "{id:int}/send-followup" + }, + { + "method": "GET", + "suffix": "choices" + }, + { + "method": "GET", + "suffix": "ai-metrics" + }, + { + "method": "GET", + "suffix": "summarizer-metrics" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]" + ] + }, + { + "file": "JobTrackerApi/Controllers/JobDiscoveryController.cs", + "baseRoutes": [ + "api/job-discovery" + ], + "actions": [ + { + "method": "GET", + "suffix": "search" + }, + { + "method": "GET", + "suffix": "saved-searches" + }, + { + "method": "POST", + "suffix": "saved-searches" + }, + { + "method": "DELETE", + "suffix": "saved-searches/{id:int}" + }, + { + "method": "PATCH", + "suffix": "saved-searches/{id:int}" + }, + { + "method": "POST", + "suffix": "saved-searches/{id:int}/run" + }, + { + "method": "PATCH", + "suffix": "saved-searches/{id:int}/results/{externalJobId}/dismiss" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/JobImportController.cs", + "baseRoutes": [ + "api/jobimport" + ], + "actions": [ + { + "method": "POST", + "suffix": "preview" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/MicrosoftGraphController.cs", + "baseRoutes": [ + "api/microsoft-graph" + ], + "actions": [ + { + "method": "GET", + "suffix": "status" + }, + { + "method": "GET", + "suffix": "connect-url" + }, + { + "method": "GET", + "suffix": "oauth/callback" + }, + { + "method": "DELETE", + "suffix": "connection" + } + ], + "authorizationAttributes": [ + "[Authorize]" + ] + }, + { + "file": "JobTrackerApi/Controllers/NotificationSettingsController.cs", + "baseRoutes": [ + "api/notification-settings" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/OperationsController.cs", + "baseRoutes": [ + "api/operations", + "api/notifications" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "GET", + "suffix": "{id:guid}" + }, + { + "method": "POST", + "suffix": "{id:guid}/cancel" + }, + { + "method": "POST", + "suffix": "{id:guid}/retry" + }, + { + "method": "GET", + "suffix": "" + }, + { + "method": "GET", + "suffix": "unread-count" + }, + { + "method": "POST", + "suffix": "{id:guid}/read" + }, + { + "method": "DELETE", + "suffix": "{id:guid}" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/ProfileCvController.cs", + "baseRoutes": [ + "api/profile-cv" + ], + "actions": [ + { + "method": "POST", + "suffix": "upload" + }, + { + "method": "GET", + "suffix": "runs" + }, + { + "method": "GET", + "suffix": "runs/{id:int}/diff" + }, + { + "method": "POST", + "suffix": "runs/{id:int}/accept" + }, + { + "method": "POST", + "suffix": "runs/{id:int}/discard" + }, + { + "method": "POST", + "suffix": "reprocess" + }, + { + "method": "POST", + "suffix": "rebuild" + }, + { + "method": "POST", + "suffix": "rewrite-section" + }, + { + "method": "GET", + "suffix": "templates" + }, + { + "method": "POST", + "suffix": "rewrite-preview" + }, + { + "method": "POST", + "suffix": "export-pdf" + }, + { + "method": "POST", + "suffix": "parse" + }, + { + "method": "POST", + "suffix": "improve" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]", + "[Authorize(Policy = ProEntitlement.Policy)]" + ] + }, + { + "file": "JobTrackerApi/Controllers/PublicCvController.cs", + "baseRoutes": [ + "api/public-cv" + ], + "actions": [ + { + "method": "GET", + "suffix": "{slug}" + }, + { + "method": "GET", + "suffix": "{slug}/pdf" + } + ], + "authorizationAttributes": [] + }, + { + "file": "JobTrackerApi/Controllers/RulesController.cs", + "baseRoutes": [ + "api/rules" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/SessionsController.cs", + "baseRoutes": [ + "api/auth/sessions" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "DELETE", + "suffix": "{id}" + }, + { + "method": "POST", + "suffix": "revoke-others" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/StrategySnapshotController.cs", + "baseRoutes": [ + "api/jobapplications/{jobId:int}/focus-plan" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "POST", + "suffix": "operations" + }, + { + "method": "GET", + "suffix": "operation" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\", Policy = ProEntitlement.Policy)]" + ] + }, + { + "file": "JobTrackerApi/Controllers/TwoFactorController.cs", + "baseRoutes": [ + "api/auth/2fa" + ], + "actions": [ + { + "method": "POST", + "suffix": "setup" + }, + { + "method": "POST", + "suffix": "verify-setup" + }, + { + "method": "POST", + "suffix": "disable" + }, + { + "method": "GET", + "suffix": "status" + }, + { + "method": "POST", + "suffix": "recovery-codes/regenerate" + }, + { + "method": "POST", + "suffix": "challenge" + }, + { + "method": "GET", + "suffix": "trusted-devices" + }, + { + "method": "DELETE", + "suffix": "trusted-devices/{id:int}" + }, + { + "method": "POST", + "suffix": "trusted-devices/revoke-all" + } + ], + "authorizationAttributes": [ + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]", + "[Authorize(AuthenticationSchemes = \"local\")]" + ] + }, + { + "file": "JobTrackerApi/Controllers/UsersController.cs", + "baseRoutes": [ + "api/users" + ], + "actions": [ + { + "method": "GET", + "suffix": "" + }, + { + "method": "POST", + "suffix": "" + }, + { + "method": "PUT", + "suffix": "{id}/roles" + }, + { + "method": "DELETE", + "suffix": "{id}" + }, + { + "method": "POST", + "suffix": "{id}/send-password-reset" + }, + { + "method": "POST", + "suffix": "send-test-email" + } + ], + "authorizationAttributes": [ + "[Authorize(Roles = \"Admin\")]" + ] + } + ], + "rolesFromUsersController": [ + "Admin" + ], + "entitlementRoles": [ + "Admin", + "Premium" + ], + "rolesCaveat": "Admin controls user administration; Admin/Premium grant pro entitlements; ordinary accounts may have no role. UsersController supports custom role strings, which do not imply new grants. Public/anonymous is distinct.", + "frontendPages": [ + "job-tracker-ui/src/views/AdminAuditPage.tsx", + "job-tracker-ui/src/views/AdminSystemPage.tsx", + "job-tracker-ui/src/views/AdminUsersPage.tsx", + "job-tracker-ui/src/views/AnalyticsPage.tsx", + "job-tracker-ui/src/views/ApplicationWorkspacePage.tsx", + "job-tracker-ui/src/views/CareerProfilePage.tsx", + "job-tracker-ui/src/views/CareerWorkspacePage.tsx", + "job-tracker-ui/src/views/ConnectedAccountsPage.tsx", + "job-tracker-ui/src/views/CorrespondenceInboxPage.tsx", + "job-tracker-ui/src/views/CvBuilderEditor.tsx", + "job-tracker-ui/src/views/CvBuilderPage.tsx", + "job-tracker-ui/src/views/DocumentsPage.tsx", + "job-tracker-ui/src/views/ForgotPasswordPage.tsx", + "job-tracker-ui/src/views/GmailReviewPage.tsx", + "job-tracker-ui/src/views/JobDiscoveryPage.tsx", + "job-tracker-ui/src/views/LandingPage.tsx", + "job-tracker-ui/src/views/LoginPage.tsx", + "job-tracker-ui/src/views/MicrosoftLegacyRelinkPage.tsx", + "job-tracker-ui/src/views/NotFoundPage.tsx", + "job-tracker-ui/src/views/OfferComparisonPage.tsx", + "job-tracker-ui/src/views/OperationsPage.tsx", + "job-tracker-ui/src/views/ProfilePage.tsx", + "job-tracker-ui/src/views/PublicCvPage.tsx", + "job-tracker-ui/src/views/ResetPasswordPage.tsx", + "job-tracker-ui/src/views/RouteErrorPage.tsx", + "job-tracker-ui/src/views/VerifyEmailPage.tsx" + ], + "sharedComponents": [ + "job-tracker-ui/src/components/AddJobModal.tsx", + "job-tracker-ui/src/components/AiPrivacySettingsCard.tsx", + "job-tracker-ui/src/components/AiUsageCard.tsx", + "job-tracker-ui/src/components/ApplicationAssets.tsx", + "job-tracker-ui/src/components/ApplicationCalendarActions.tsx", + "job-tracker-ui/src/components/ApplicationChecklist.tsx", + "job-tracker-ui/src/components/ApplicationIntelligence.tsx", + "job-tracker-ui/src/components/ApplicationWorkflowAssist.tsx", + "job-tracker-ui/src/components/Attachment.tsx", + "job-tracker-ui/src/components/Attachments.tsx", + "job-tracker-ui/src/components/AuthStatusCard.tsx", + "job-tracker-ui/src/components/BackupCard.tsx", + "job-tracker-ui/src/components/CompaniesTable.tsx", + "job-tracker-ui/src/components/Correspondence.tsx", + "job-tracker-ui/src/components/CropImageDialog.tsx", + "job-tracker-ui/src/components/cv/AiSectionAssistant.tsx", + "job-tracker-ui/src/components/cv/CvCustomizeTab.tsx", + "job-tracker-ui/src/components/CvTemplateGallery.tsx", + "job-tracker-ui/src/components/CvTemplateThumbnail.tsx", + "job-tracker-ui/src/components/DashboardLayoutEditor.tsx", + "job-tracker-ui/src/components/DashboardView.tsx", + "job-tracker-ui/src/components/EditJobDialog.tsx", + "job-tracker-ui/src/components/EmailProviderConnections.tsx", + "job-tracker-ui/src/components/ErrorBoundary.tsx", + "job-tracker-ui/src/components/GoogleAuthCard.tsx", + "job-tracker-ui/src/components/GradientButton.tsx", + "job-tracker-ui/src/components/ImportExportJobs.tsx", + "job-tracker-ui/src/components/InterviewPrep.tsx", + "job-tracker-ui/src/components/JobDetailsPanels.tsx", + "job-tracker-ui/src/components/JobFlowBar.tsx", + "job-tracker-ui/src/components/JobTable.tsx", + "job-tracker-ui/src/components/KanbanBoard.tsx", + "job-tracker-ui/src/components/Markdown.tsx", + "job-tracker-ui/src/components/MicrosoftAuthCard.tsx", + "job-tracker-ui/src/components/NotificationsPopover.tsx", + "job-tracker-ui/src/components/OnboardingChecklist.tsx", + "job-tracker-ui/src/components/ProFeatureNotice.tsx", + "job-tracker-ui/src/components/QuickCaptureCard.tsx", + "job-tracker-ui/src/components/QuickCommandDialog.tsx", + "job-tracker-ui/src/components/RemindersView.tsx", + "job-tracker-ui/src/components/RichTextField.tsx", + "job-tracker-ui/src/components/RulesSettingsCard.tsx", + "job-tracker-ui/src/components/SavedViewsMenu.tsx", + "job-tracker-ui/src/components/SessionsSettingsCard.tsx", + "job-tracker-ui/src/components/SettingsView.tsx", + "job-tracker-ui/src/components/TagsInput.tsx", + "job-tracker-ui/src/components/TurnstileWidget.tsx", + "job-tracker-ui/src/components/TwoFactorChallenge.tsx", + "job-tracker-ui/src/components/TwoFactorSettingsCard.tsx", + "job-tracker-ui/src/components/UserManagementCard.tsx", + "job-tracker-ui/src/components/ViewStateNotice.tsx" + ], + "tests": { + "backend": [ + "JobTrackerApi.Tests/AccountDataExportTests.cs", + "JobTrackerApi.Tests/AccountDeletionTests.cs", + "JobTrackerApi.Tests/AccountPlansTests.cs", + "JobTrackerApi.Tests/AiEvaluationFixtureTests.cs", + "JobTrackerApi.Tests/AiOperationQueueTests.cs", + "JobTrackerApi.Tests/AiPrivacyPolicyTests.cs", + "JobTrackerApi.Tests/AiUsageMeterTests.cs", + "JobTrackerApi.Tests/AiWorkspaceNotePersistenceTests.cs", + "JobTrackerApi.Tests/AiWorkspaceTests.cs", + "JobTrackerApi.Tests/AnalyticsSalaryTests.cs", + "JobTrackerApi.Tests/ApiAuthorizationPostureTests.cs", + "JobTrackerApi.Tests/ApplicationAssetsTests.cs", + "JobTrackerApi.Tests/ApplicationCalendarControllerTests.cs", + "JobTrackerApi.Tests/ApplicationChecklistTests.cs", + "JobTrackerApi.Tests/ApplicationIntelligenceTests.cs", + "JobTrackerApi.Tests/ApplicationWorkspaceTests.cs", + "JobTrackerApi.Tests/AttachmentConsistencyTests.cs", + "JobTrackerApi.Tests/AttachmentFlagsRecomputeTests.cs", + "JobTrackerApi.Tests/AttachmentsControllerTests.cs", + "JobTrackerApi.Tests/AuthAndSystemControllerTests.cs", + "JobTrackerApi.Tests/AuthSessionRevocationTests.cs", + "JobTrackerApi.Tests/AvatarStorageTests.cs", + "JobTrackerApi.Tests/BackgroundWorkerTenantTests.cs", + "JobTrackerApi.Tests/BackupControllerTests.cs", + "JobTrackerApi.Tests/BillingControllerTests.cs", + "JobTrackerApi.Tests/BuildMetadataTests.cs", + "JobTrackerApi.Tests/CareerEvidenceControllerTests.cs", + "JobTrackerApi.Tests/CareerProfileControllerTests.cs", + "JobTrackerApi.Tests/CareerProfileServiceTests.cs", + "JobTrackerApi.Tests/ClientErrorsControllerTests.cs", + "JobTrackerApi.Tests/CompanyCreateCompatibilityTests.cs", + "JobTrackerApi.Tests/CompanyRelationshipTests.cs", + "JobTrackerApi.Tests/ConcurrentInitializationTests.cs", + "JobTrackerApi.Tests/CorrespondenceControllerTests.cs", + "JobTrackerApi.Tests/CsvExportTests.cs", + "JobTrackerApi.Tests/CurrentUserIdLiveEvaluationTests.cs", + "JobTrackerApi.Tests/CvAiEvaluationTests.cs", + "JobTrackerApi.Tests/CvAiGroundingTests.cs", + "JobTrackerApi.Tests/CvAiReadinessTests.cs", + "JobTrackerApi.Tests/CvBuilderTests.cs", + "JobTrackerApi.Tests/CvCorpusHarnessTests.cs", + "JobTrackerApi.Tests/CvExportRetentionTests.cs", + "JobTrackerApi.Tests/CvExtractionCoverageTests.cs", + "JobTrackerApi.Tests/CvProcessingOperationTests.cs", + "JobTrackerApi.Tests/CvProfileDiffServiceTests.cs", + "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "JobTrackerApi.Tests/DashboardPreferencesTests.cs", + "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "JobTrackerApi.Tests/DocumentsControllerTests.cs", + "JobTrackerApi.Tests/EmailControllerTests.cs", + "JobTrackerApi.Tests/EmailDraftPersistenceTests.cs", + "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs", + "JobTrackerApi.Tests/EmailProviderDeliveryTests.cs", + "JobTrackerApi.Tests/EmailSendAttemptStoreTests.cs", + "JobTrackerApi.Tests/EmailSendControllerTests.cs", + "JobTrackerApi.Tests/EmailStatusClassifierTests.cs", + "JobTrackerApi.Tests/ExternalOriginTests.cs", + "JobTrackerApi.Tests/ForwardedIngressTests.cs", + "JobTrackerApi.Tests/GmailControllerTests.cs", + "JobTrackerApi.Tests/GoogleTokenValidatorTests.cs", + "JobTrackerApi.Tests/HumanLanguageCatalogTests.cs", + "JobTrackerApi.Tests/ImapControllerTests.cs", + "JobTrackerApi.Tests/ImapProviderTests.cs", + "JobTrackerApi.Tests/ImapServiceSsrfGuardTests.cs", + "JobTrackerApi.Tests/InterviewAiContextTests.cs", + "JobTrackerApi.Tests/InterviewPrepPersistenceTests.cs", + "JobTrackerApi.Tests/InterviewPrepTests.cs", + "JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs", + "JobTrackerApi.Tests/JobApplicationsAppliedDateHistoryTests.cs", + "JobTrackerApi.Tests/JobApplicationsAuthorizationTests.cs", + "JobTrackerApi.Tests/JobApplicationsControllerTests.cs", + "JobTrackerApi.Tests/JobApplicationsEndpointBehaviorTests.cs", + "JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs", + "JobTrackerApi.Tests/JobApplicationsMariaDraftTests.cs", + "JobTrackerApi.Tests/JobApplicationsWorkflowSignalsTests.cs", + "JobTrackerApi.Tests/JobCvMatchServiceTests.cs", + "JobTrackerApi.Tests/JobDiscoveryControllerTests.cs", + "JobTrackerApi.Tests/JobImportHttpTransportTests.cs", + "JobTrackerApi.Tests/JobImportServiceTests.cs", + "JobTrackerApi.Tests/JobLifecycleEventTests.cs", + "JobTrackerApi.Tests/JobOpportunitySyncTests.cs", + "JobTrackerApi.Tests/JobPipelineTests.cs", + "JobTrackerApi.Tests/JobQueryParityTests.cs", + "JobTrackerApi.Tests/LocalAuthIdentityTests.cs", + "JobTrackerApi.Tests/MaintenanceJobDispatcherTests.cs", + "JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs", + "JobTrackerApi.Tests/MicrosoftGraphControllerTests.cs", + "JobTrackerApi.Tests/MicrosoftGraphProviderTests.cs", + "JobTrackerApi.Tests/MicrosoftTokenValidatorTests.cs", + "JobTrackerApi.Tests/MigrationChainTests.cs", + "JobTrackerApi.Tests/NotificationSettingsControllerTests.cs", + "JobTrackerApi.Tests/OperationsControllerTests.cs", + "JobTrackerApi.Tests/OwnershipGuardTests.cs", + "JobTrackerApi.Tests/PdfRenderAdmissionTests.cs", + "JobTrackerApi.Tests/ProductionConfigTests.cs", + "JobTrackerApi.Tests/ProEntitlementAuthorizationTests.cs", + "JobTrackerApi.Tests/ProfileCvControllerTests.cs", + "JobTrackerApi.Tests/PublicCvControllerTests.cs", + "JobTrackerApi.Tests/RateLimitPartitionKeysTests.cs", + "JobTrackerApi.Tests/RouteUniquenessTests.cs", + "JobTrackerApi.Tests/RulesEngineProspectTests.cs", + "JobTrackerApi.Tests/SavedJobSearchAlertTests.cs", + "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "JobTrackerApi.Tests/SessionContextMiddlewareTests.cs", + "JobTrackerApi.Tests/SessionsControllerTests.cs", + "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "JobTrackerApi.Tests/SqliteMigrationHelperTests.cs", + "JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs", + "JobTrackerApi.Tests/StageAnalyticsTests.cs", + "JobTrackerApi.Tests/StartupSchemaOwnershipTests.cs", + "JobTrackerApi.Tests/StrategySnapshotOperationTests.cs", + "JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs", + "JobTrackerApi.Tests/SummarizerServiceTests.cs", + "JobTrackerApi.Tests/TwoFactorControllerTests.cs", + "JobTrackerApi.Tests/UserOperationStoreTests.cs", + "JobTrackerApi.Tests/UsersControllerTests.cs" + ], + "frontend": [ + "job-tracker-ui/src/account-data-export.test.tsx", + "job-tracker-ui/src/account-providers.test.tsx", + "job-tracker-ui/src/account-scoped-state.test.tsx", + "job-tracker-ui/src/account-security-flows.test.tsx", + "job-tracker-ui/src/account-security-presentation.test.tsx", + "job-tracker-ui/src/admin-audit-page.test.tsx", + "job-tracker-ui/src/admin-system-page.test.tsx", + "job-tracker-ui/src/admin-users-page.test.tsx", + "job-tracker-ui/src/ai-privacy-settings.test.tsx", + "job-tracker-ui/src/ai-section-assistant.test.tsx", + "job-tracker-ui/src/ai-usage-card.test.tsx", + "job-tracker-ui/src/analytics-presentation.test.tsx", + "job-tracker-ui/src/api-error-localisation.test.ts", + "job-tracker-ui/src/app-shell-navigation.test.tsx", + "job-tracker-ui/src/app-shell-notifications.test.tsx", + "job-tracker-ui/src/App.test.tsx", + "job-tracker-ui/src/application-assets.test.tsx", + "job-tracker-ui/src/application-calendar.test.tsx", + "job-tracker-ui/src/application-checklist.test.tsx", + "job-tracker-ui/src/application-drafts.test.ts", + "job-tracker-ui/src/application-intelligence.test.tsx", + "job-tracker-ui/src/application-route-contracts.test.ts", + "job-tracker-ui/src/application-workflow-assist.test.tsx", + "job-tracker-ui/src/application-workspace-overlay.test.tsx", + "job-tracker-ui/src/applicationWorkspace.test.ts", + "job-tracker-ui/src/attachments.test.tsx", + "job-tracker-ui/src/backup-lifetime.test.tsx", + "job-tracker-ui/src/captureUrl.test.ts", + "job-tracker-ui/src/career-editor.test.tsx", + "job-tracker-ui/src/career-evidence.test.tsx", + "job-tracker-ui/src/career-history-view.test.tsx", + "job-tracker-ui/src/career-import-review.test.tsx", + "job-tracker-ui/src/career-workspace-page.test.tsx", + "job-tracker-ui/src/companies-relationship.test.tsx", + "job-tracker-ui/src/confirm-flow.test.tsx", + "job-tracker-ui/src/confirm.test.tsx", + "job-tracker-ui/src/correspondence-gmail-import.test.tsx", + "job-tracker-ui/src/correspondence-inbox-page.test.tsx", + "job-tracker-ui/src/correspondence-search-context.test.ts", + "job-tracker-ui/src/csv-export.test.tsx", + "job-tracker-ui/src/cv-builder-deep-link.test.tsx", + "job-tracker-ui/src/cv-builder-page.test.tsx", + "job-tracker-ui/src/cv-document-controls.test.tsx", + "job-tracker-ui/src/cv-template-gallery.test.tsx", + "job-tracker-ui/src/cv-template-thumbnail.test.tsx", + "job-tracker-ui/src/cvBuilder.test.ts", + "job-tracker-ui/src/daily-control-loop.test.tsx", + "job-tracker-ui/src/dashboard-customisation.test.tsx", + "job-tracker-ui/src/dashboard-presentation.test.tsx", + "job-tracker-ui/src/dashboardLayout.test.ts", + "job-tracker-ui/src/dialog-flow.test.tsx", + "job-tracker-ui/src/documents-page.test.tsx", + "job-tracker-ui/src/email-provider-connections.test.tsx", + "job-tracker-ui/src/end-to-end-trust-loop.test.tsx", + "job-tracker-ui/src/file-picker-activation.test.tsx", + "job-tracker-ui/src/gmail-review-page.test.tsx", + "job-tracker-ui/src/hooks/useDashboardLayout.test.tsx", + "job-tracker-ui/src/i18n-provider.test.tsx", + "job-tracker-ui/src/interview-prep.test.tsx", + "job-tracker-ui/src/job-discovery.test.tsx", + "job-tracker-ui/src/job-import.test.tsx", + "job-tracker-ui/src/job-table-density.test.tsx", + "job-tracker-ui/src/jobs-view-integration.test.tsx", + "job-tracker-ui/src/kanban-grouped-board.test.tsx", + "job-tracker-ui/src/landing-page.test.tsx", + "job-tracker-ui/src/LandingPage.authRedirect.test.tsx", + "job-tracker-ui/src/loaded-theme-states.test.tsx", + "job-tracker-ui/src/locale-fetch-stability.test.tsx", + "job-tracker-ui/src/login-page.test.tsx", + "job-tracker-ui/src/microsoft-legacy-relink-page.test.tsx", + "job-tracker-ui/src/modal-state.test.tsx", + "job-tracker-ui/src/named-controls.test.tsx", + "job-tracker-ui/src/nginx-config.test.ts", + "job-tracker-ui/src/not-found-page.test.tsx", + "job-tracker-ui/src/notifications-popover.test.tsx", + "job-tracker-ui/src/offer-comparison.test.tsx", + "job-tracker-ui/src/onboarding-checklist.test.tsx", + "job-tracker-ui/src/operations-page.test.tsx", + "job-tracker-ui/src/page-layout.test.tsx", + "job-tracker-ui/src/pipeline.test.ts", + "job-tracker-ui/src/planCatalog.test.ts", + "job-tracker-ui/src/pro-feature-notice.test.tsx", + "job-tracker-ui/src/profile-page.test.tsx", + "job-tracker-ui/src/profileCv.test.ts", + "job-tracker-ui/src/prompt.test.tsx", + "job-tracker-ui/src/public-auth-presentation.test.tsx", + "job-tracker-ui/src/public-cv-page.test.tsx", + "job-tracker-ui/src/quick-capture.test.tsx", + "job-tracker-ui/src/quick-command-preservation.test.tsx", + "job-tracker-ui/src/reminders-presentation.test.tsx", + "job-tracker-ui/src/session-boundary.test.ts", + "job-tracker-ui/src/settings-import-lifetime.test.tsx", + "job-tracker-ui/src/settings-view.test.tsx", + "job-tracker-ui/src/shell-readiness.test.tsx", + "job-tracker-ui/src/sidebar-active-nav.test.ts", + "job-tracker-ui/src/theme-contrast.test.ts", + "job-tracker-ui/src/theme-state.test.tsx", + "job-tracker-ui/src/turnstile-widget.test.tsx", + "job-tracker-ui/src/two-factor-settings.test.tsx", + "job-tracker-ui/src/use-drag-reorder.test.tsx", + "job-tracker-ui/src/use-view-resource.test.tsx", + "job-tracker-ui/src/verify-email-page.test.tsx", + "job-tracker-ui/src/view-state-announcements.test.tsx", + "job-tracker-ui/src/workflow-trust-signals.test.tsx" + ], + "browser": [ + "job-tracker-ui/e2e/accessibility.spec.ts", + "job-tracker-ui/e2e/account-isolation.spec.ts", + "job-tracker-ui/e2e/analytics-auth-repair.spec.ts", + "job-tracker-ui/e2e/analytics-presentation.spec.ts", + "job-tracker-ui/e2e/board-presentation.spec.ts", + "job-tracker-ui/e2e/browser-zoom-audit.spec.ts", + "job-tracker-ui/e2e/builder-preview-keyboard.spec.ts", + "job-tracker-ui/e2e/csv-export.spec.ts", + "job-tracker-ui/e2e/cv-editor-frame.spec.ts", + "job-tracker-ui/e2e/cv-pagination.spec.ts", + "job-tracker-ui/e2e/cv-preview-presentation.spec.ts", + "job-tracker-ui/e2e/cv-readiness.spec.ts", + "job-tracker-ui/e2e/cv-responsive-workflow.spec.ts", + "job-tracker-ui/e2e/cv-section-scope.spec.ts", + "job-tracker-ui/e2e/cv-settings-presentation.spec.ts", + "job-tracker-ui/e2e/dashboard-presentation.spec.ts", + "job-tracker-ui/e2e/functional-acceptance.spec.ts", + "job-tracker-ui/e2e/job-discovery.spec.ts", + "job-tracker-ui/e2e/job-overview-presentation.spec.ts", + "job-tracker-ui/e2e/job-sections-presentation.spec.ts", + "job-tracker-ui/e2e/kanban-theme.spec.ts", + "job-tracker-ui/e2e/named-controls-modal-state.spec.ts", + "job-tracker-ui/e2e/phase7-account-security.spec.ts", + "job-tracker-ui/e2e/phase7-admin-audit.spec.ts", + "job-tracker-ui/e2e/phase7-admin-system.spec.ts", + "job-tracker-ui/e2e/phase7-admin-users.spec.ts", + "job-tracker-ui/e2e/phase7-application-forms.spec.ts", + "job-tracker-ui/e2e/phase7-authentication.spec.ts", + "job-tracker-ui/e2e/phase7-career-editor.spec.ts", + "job-tracker-ui/e2e/phase7-career-import-review.spec.ts", + "job-tracker-ui/e2e/phase7-career-overview.spec.ts", + "job-tracker-ui/e2e/phase7-career-source-ids.spec.ts", + "job-tracker-ui/e2e/phase7-companies.spec.ts", + "job-tracker-ui/e2e/phase7-correspondence-compose.spec.ts", + "job-tracker-ui/e2e/phase7-correspondence-read.spec.ts", + "job-tracker-ui/e2e/phase7-cv-library.spec.ts", + "job-tracker-ui/e2e/phase7-discovery.spec.ts", + "job-tracker-ui/e2e/phase7-documents-contract.spec.ts", + "job-tracker-ui/e2e/phase7-documents.spec.ts", + "job-tracker-ui/e2e/phase7-job-import.spec.ts", + "job-tracker-ui/e2e/phase7-notifications.spec.ts", + "job-tracker-ui/e2e/phase7-oauth-sender.spec.ts", + "job-tracker-ui/e2e/phase7-offers.spec.ts", + "job-tracker-ui/e2e/phase7-onboarding.spec.ts", + "job-tracker-ui/e2e/phase7-operations.spec.ts", + "job-tracker-ui/e2e/phase7-public-cv.spec.ts", + "job-tracker-ui/e2e/phase7-reminders.spec.ts", + "job-tracker-ui/e2e/phase7-settings-preferences.spec.ts", + "job-tracker-ui/e2e/phase8-dashboard-customisation.spec.ts", + "job-tracker-ui/e2e/redesign-preservation.spec.ts", + "job-tracker-ui/e2e/responsive-accessibility-audit.spec.ts", + "job-tracker-ui/e2e/rules-draft-repair.spec.ts", + "job-tracker-ui/e2e/saved-search-repair.spec.ts", + "job-tracker-ui/e2e/semantic-foundations.spec.ts", + "job-tracker-ui/e2e/settings-page-layout.spec.ts", + "job-tracker-ui/e2e/shell-readiness.spec.ts", + "job-tracker-ui/e2e/smoke.spec.ts", + "job-tracker-ui/e2e/table-density.spec.ts" + ], + "sidecar": [ + "tools/summarizer/tests/test_app.py", + "tools/summarizer/tests/test_cv_grounding.py" + ] + }, + "databaseWorkflows": [ + "JobTrackerApi/Data/JobTrackerContext.cs" + ], + "migrations": [ + "JobTrackerApi/Migrations/20260310174114_AddCorrespondence.cs", + "JobTrackerApi/Migrations/20260310174114_AddCorrespondence.Designer.cs", + "JobTrackerApi/Migrations/20260310195000_AddJobFieldsAndSoftDelete.cs", + "JobTrackerApi/Migrations/20260310195000_AddJobFieldsAndSoftDelete.Designer.cs", + "JobTrackerApi/Migrations/20260311090000_AddAutomationRulesAndFields.cs", + "JobTrackerApi/Migrations/20260311090000_AddAutomationRulesAndFields.Designer.cs", + "JobTrackerApi/Migrations/20260311093000_AddAttachmentsAndJobEvents.cs", + "JobTrackerApi/Migrations/20260311093000_AddAttachmentsAndJobEvents.Designer.cs", + "JobTrackerApi/Migrations/20260311103000_AddCompanyCrmAndChecklistAndIndexes.cs", + "JobTrackerApi/Migrations/20260311103000_AddCompanyCrmAndChecklistAndIndexes.Designer.cs", + "JobTrackerApi/Migrations/20260311121000_AddCorrespondenceEmailFields.cs", + "JobTrackerApi/Migrations/20260311140000_AddJobImportFields.cs", + "JobTrackerApi/Migrations/20260311180000_AddShortSummary.cs", + "JobTrackerApi/Migrations/20260711181039_SyncModelSnapshot.cs", + "JobTrackerApi/Migrations/20260711181039_SyncModelSnapshot.Designer.cs", + "JobTrackerApi/Migrations/20260717071417_AddJobEntityAndProspectStages.cs", + "JobTrackerApi/Migrations/20260717071417_AddJobEntityAndProspectStages.Designer.cs", + "JobTrackerApi/Migrations/20260717222917_AddCareerProfileRelationalChildren.cs", + "JobTrackerApi/Migrations/20260717222917_AddCareerProfileRelationalChildren.Designer.cs", + "JobTrackerApi/Migrations/20260718074509_AddCvVariants.cs", + "JobTrackerApi/Migrations/20260718074509_AddCvVariants.Designer.cs", + "JobTrackerApi/Migrations/20260718131138_AddAiInteractions.cs", + "JobTrackerApi/Migrations/20260718131138_AddAiInteractions.Designer.cs", + "JobTrackerApi/Migrations/20260719085904_AddApplicationChecklistItems.cs", + "JobTrackerApi/Migrations/20260719085904_AddApplicationChecklistItems.Designer.cs", + "JobTrackerApi/Migrations/20260719094728_SyncCareerChildKeyLengths.cs", + "JobTrackerApi/Migrations/20260719094728_SyncCareerChildKeyLengths.Designer.cs", + "JobTrackerApi/Migrations/20260719120954_AddCoverLetterVersions.cs", + "JobTrackerApi/Migrations/20260719120954_AddCoverLetterVersions.Designer.cs", + "JobTrackerApi/Migrations/20260719145044_AddInterviewPrepItems.cs", + "JobTrackerApi/Migrations/20260719145044_AddInterviewPrepItems.Designer.cs", + "JobTrackerApi/Migrations/20260730203422_AddAiUsageMetering.cs", + "JobTrackerApi/Migrations/20260730203422_AddAiUsageMetering.Designer.cs", + "JobTrackerApi/Migrations/20260731115022_AddStripeBillingState.cs", + "JobTrackerApi/Migrations/20260731115022_AddStripeBillingState.Designer.cs", + "JobTrackerApi/Migrations/20260802205800_AddPendingEmailChange.cs", + "JobTrackerApi/Migrations/20260802205800_AddPendingEmailChange.Designer.cs", + "JobTrackerApi/Migrations/20260802212509_AddCanonicalMicrosoftIdentity.cs", + "JobTrackerApi/Migrations/20260802212509_AddCanonicalMicrosoftIdentity.Designer.cs", + "JobTrackerApi/Migrations/20260802224646_AddUserOperations.cs", + "JobTrackerApi/Migrations/20260802224646_AddUserOperations.Designer.cs", + "JobTrackerApi/Migrations/20260802225941_AddUserNotifications.cs", + "JobTrackerApi/Migrations/20260802225941_AddUserNotifications.Designer.cs", + "JobTrackerApi/Migrations/20260803001138_AddAiPrivacyPreferences.cs", + "JobTrackerApi/Migrations/20260803001138_AddAiPrivacyPreferences.Designer.cs", + "JobTrackerApi/Migrations/20260809195014_AddEmailSendAttempts.cs", + "JobTrackerApi/Migrations/20260809195014_AddEmailSendAttempts.Designer.cs", + "JobTrackerApi/Migrations/20260810075206_AddEmailDrafts.cs", + "JobTrackerApi/Migrations/20260810075206_AddEmailDrafts.Designer.cs", + "JobTrackerApi/Migrations/20260810080858_AddEmailDraftClientRequestId.cs", + "JobTrackerApi/Migrations/20260810080858_AddEmailDraftClientRequestId.Designer.cs", + "JobTrackerApi/Migrations/20260815164027_AddAccountDeletionLifecycle.cs", + "JobTrackerApi/Migrations/20260815164027_AddAccountDeletionLifecycle.Designer.cs", + "JobTrackerApi/Migrations/20260815175236_AddCrossFeatureAiUsage.cs", + "JobTrackerApi/Migrations/20260815175236_AddCrossFeatureAiUsage.Designer.cs", + "JobTrackerApi/Migrations/20260824090000_AddNotificationPreferences.cs", + "JobTrackerApi/Migrations/20260828090000_AddUiLanguagePreference.cs", + "JobTrackerApi/Migrations/20260830120000_AdoptSystemEmailSettingsSchema.cs", + "JobTrackerApi/Migrations/20260830121000_AdoptUserRuleSettingsSchema.cs", + "JobTrackerApi/Migrations/20260830122000_AdoptGmailReviewDecisionsSchema.cs", + "JobTrackerApi/Migrations/20260830123000_AdoptAuthenticationSupportSchema.cs", + "JobTrackerApi/Migrations/20260830124000_AdoptEmailConnectionSchema.cs", + "JobTrackerApi/Migrations/20260830125000_AdoptCvExtractionSchema.cs", + "JobTrackerApi/Migrations/20260830126000_AdoptTailoredCvDraftSchema.cs", + "JobTrackerApi/Migrations/20260830127000_AdoptJobWorkspaceNotesSchema.cs", + "JobTrackerApi/Migrations/20260830128000_AdoptCvVariantSchema.cs", + "JobTrackerApi/Migrations/20260830129000_AdoptAiInteractionSchema.cs", + "JobTrackerApi/Migrations/20260830130000_AdoptApplicationChecklistSchema.cs", + "JobTrackerApi/Migrations/20260830131000_AdoptCoverLetterVersionSchema.cs", + "JobTrackerApi/Migrations/20260830132000_AdoptInterviewPrepItemSchema.cs", + "JobTrackerApi/Migrations/20260830133000_AdoptCareerProfileSchema.cs", + "JobTrackerApi/Migrations/20260830134000_AdoptIdentitySchema.cs", + "JobTrackerApi/Migrations/20260830135000_AdoptSubmittedApplicationPackageSchema.cs", + "JobTrackerApi/Migrations/20260830136000_AdoptCareerEvidenceSchema.cs", + "JobTrackerApi/Migrations/20260830137000_AdoptSavedJobSearchSchema.cs", + "JobTrackerApi/Migrations/20261021090000_AddDashboardLayoutPreference.cs", + "JobTrackerApi/Migrations/JobTrackerContextModelSnapshot.cs" + ], + "cvDocumentOwners": [ + "JobTrackerApi/Controllers/CareerProfileController.cs", + "JobTrackerApi/Controllers/DocumentsController.cs", + "JobTrackerApi/Migrations/20260717222917_AddCareerProfileRelationalChildren.cs", + "JobTrackerApi/Migrations/20260717222917_AddCareerProfileRelationalChildren.Designer.cs", + "JobTrackerApi/Migrations/20260830133000_AdoptCareerProfileSchema.cs", + "JobTrackerApi/Models/CareerProfile.cs", + "JobTrackerApi/Services/CareerProfileMapper.cs", + "JobTrackerApi/Services/CareerProfileService.cs", + "JobTrackerApi/Services/CareerProfileValidator.cs", + "JobTrackerApi/Services/CvRenderModel.cs", + "JobTrackerApi/Services/DocumentsIndexService.cs", + "JobTrackerApi/Services/PdfRenderAdmission.cs", + "JobTrackerApi/Services/PdfRenderExceptionHandler.cs", + "JobTrackerApi/Services/PlaywrightCvPdfExporter.cs", + "JobTrackerApi/Services/ThemedCvRenderer.cs" + ] +} diff --git a/docs/redesign/phase-9/p9-00/inventory.py b/docs/redesign/phase-9/p9-00/inventory.py new file mode 100644 index 0000000..38c33ce --- /dev/null +++ b/docs/redesign/phase-9/p9-00/inventory.py @@ -0,0 +1,100 @@ +"""Reproducible source census; test-file associations are candidates, not passes.""" +import json +import re +from pathlib import Path +import shutil + +ROOT = Path(__file__).resolve().parents[4] +HERE = Path(__file__).resolve().parent +UI = ROOT / 'job-tracker-ui' + + +def relative(path): + return path.relative_to(ROOT).as_posix() + + +def collect(): + app = (UI / 'src/App.tsx').read_text(encoding='utf-8') + routes = {} + for match in re.finditer(r'