8.8 KiB
Route plan
ARC-02. This is a future migration plan, not live route configuration. Preserve the SPA/static deployment and current React Router authority. Most current URLs stay canonical: meaningful labels do not require renaming stable paths.
All existing route patterns
“Keep” includes refresh, direct entry, back/forward and owner/role behavior. No existing public or callback URL is removed.
| Current pattern | Target and disposition | Navigation owner | PRES contracts |
|---|---|---|---|
| / | Keep public landing and authenticated redirect behavior | Public | PRES-E01 |
| /login | Keep | Public/account entry | PRES-E02, PRES-E03, PRES-E04 |
| /register | Keep configured registration | Public | PRES-E02 |
| /forgot-password | Keep | Public | PRES-E02 |
| /reset-password | Keep token query contract | Public | PRES-E02 |
| /verify-email | Keep token query contract | Public | PRES-E02 |
| /confirm-email-change | Keep pending identity confirmation | Public | PRES-E06 |
| /microsoft-legacy-relink | Keep recovery/relink | Public/account | PRES-E03 |
| /cv/:slug | Keep published-only page/PDF; never redirect to numeric ID | Public share | PRES-C05, PRES-C12 |
| /dashboard | Keep personal dashboard | Dashboard | PRES-S01, PRES-S02 |
| /discover | Keep, present as Jobs → Discover | Jobs | PRES-J01, PRES-J02 |
| /jobs | Keep; add presentation query view=table or view=board | Jobs → Tracked | PRES-J03, PRES-J05, PRES-J06, PRES-J07 |
| /jobs/:id | Keep; staged section plan below | Jobs → job | PRES-W01–PRES-W12, PRES-M01, PRES-M02 |
| /reminders | Keep as Jobs → Follow-ups | Jobs | PRES-W11 |
| /operations | Keep progress/retry/cancel; utility link | Notifications / user activity | PRES-W12 |
| /kanban | Future replace redirect to /jobs?view=board after unified board parity | Jobs → Tracked | PRES-J07 |
| /companies | Keep including ?edit=id | Jobs → Companies | PRES-J08, PRES-E07 |
| /offers | Keep | Jobs → Offers | PRES-J09 |
| /correspondence | Keep inbox/drafts/review workspace | Correspondence | PRES-M01–PRES-M06 |
| /correspondence/review | Keep existing alias to /correspondence?view=review | Correspondence | PRES-M05 |
| /profile | Keep account identity/security under Settings; no rename to Career Profile | Settings → Account/Security | PRES-E04, PRES-E05, PRES-E06 |
| /applications/:id | Keep existing alias to /jobs/:id with query and router state | Jobs → job | PRES-W01 |
| /career | Keep | Career Profile | PRES-C01–PRES-C04 |
| /career/builder | Keep; label CVs | CVs | PRES-C05 |
| /career/builder/:id | Keep identified CV editor | CVs → CV | PRES-C06–PRES-C12 |
| /admin/audit | Keep privileged audit/undo | Admin → Audit | PRES-A02 |
| /admin/users | Keep privileged user management | Admin → Users | PRES-A01 |
| /admin/system | Keep operational diagnostics, configuration and maintenance | Admin → System | PRES-A03 |
| /trash | Keep deleted-only semantics as Jobs utility | Jobs → Trash | PRES-J06 |
| /settings | Keep; later add validated section query for shared account navigation | Settings | PRES-S03, PRES-S04, PRES-S05, PRES-J10 |
| /settings/connected-accounts | Keep; separate login identity from mail/calendar authorization | Settings → Connections | PRES-M06, PRES-E03 |
31 existing patterns mapped: 29 pages and two existing aliases. /kanban is currently a page, not already an alias. Outer /*, inner * and the inner root redirect stay as routing/error infrastructure. Do not confuse them with user pages.
New destinations and readiness
| Proposed path | Minimum meaningful content / prerequisite |
|---|---|
| /analytics | Existing analytics charts and definitions; source/sample/period shown. New metrics only after their data contract |
| /documents | Owner-scoped artifact index with job/type/state links; cross-job listing/query availability gated in Documents plan |
| /notifications | Expanded existing notification centre; read/dismiss actions and operation links, not a new notification store |
| /admin | Aggregate dashboard after authorized count endpoints exist; until then keep existing admin children visible with no empty dashboard |
These routes are not introduced in Phase 4 foundations. No /cvs rename, /account rename or nested Jobs child-URL rewrite is necessary. A future desire for prettier URLs needs its own compatibility proposal.
Job section compatibility
Successor clarification, explicitly approved by Connor on 2026-10-07: P5-08b readiness preserves followMode as compatibility metadata and defers mode-specific UI to the mail phase. The original compose-mode assumption below is not present in the current frontend and is not a P5-08b prerequisite. Numeric helper outputs and existing section/query compatibility remain protected.
Current accepted keys are overview, analysis, cv, cover-letter, interview. Current legacy keys collapse to analysis or overview in applicationWorkspace.ts. Future mappings must reveal the intended content more precisely without losing current capabilities.
| Incoming key | Current resolution | Future destination |
|---|---|---|
| absent, overview, job-details | overview | Overview; details anchor for job-details |
| analysis, match | analysis | Match (analysis + profile comparison + strategy) |
| cv | cv | Application → CV |
| cover-letter | cover-letter | Application → Cover letter |
| interview | interview | Interview |
| documents | overview | Documents |
| timeline | overview | Timeline |
| checklist | overview | Notes & tasks → checklist |
| communication | overview | Timeline → correspondence/follow-up context |
Future canonical top sections: overview, match, application, documents, timeline, tasks, interview. application may use sub=cv, letter, answers, submission; timeline may use sub=activity or correspondence. This is a small navigation adapter; do not change API section strings or persistent checklist links in bulk.
Keep all numeric tab helper inputs: 0 overview; 1 correspondence; 2 attachments; 3 tailored CV; 4 follow-up; 5 candidate fit; 6 focus plan; 7 interview prep; 8 readiness; 9 history. Translate their existing section outputs through the table. Preserve followMode and open its actual compose/follow-up mode; do not silently drop it as current tab switching can. Unknown keys fall back safely to Overview without submitting or mutating data.
Query, state and compatibility contract
- Preserve Jobs q, status, companyId, location, needsFollowUp, readiness, includeDeleted, sortBy, sortDir and page. Keep existing page-number interpretation. view changes only presentation. Board query parity must be tested before /kanban redirects.
- Preserve return state from/focusJobId; return to exact filter/list context, restore focus or a safe nearby list heading if the row no longer exists. Only local safe return paths are accepted.
- Preserve capture ?add= and ?addtext=, encoding, consumed-once review and optional post-create attachment/CV work. Do not put private draft bodies in new URLs or command history.
- Preserve /companies?edit=id and correspondence ?view=review. Draft identity/revision stays with its service; adding a draft deep link must not create/resend a draft.
- Preserve /career?section=overview, profile, evidence or import; missing/unknown selects Overview as today. Canonical editing and import-review entry must remain distinct. No CV editor query contract is invented from a test filename.
- Keep public token URLs and backend OAuth callback/postMessage origin/state behavior. Do not migrate them through a generic route redirect.
- Prefer React Router replace for compatibility aliases so Back does not loop. Preserve relevant query/hash/state; never trust URL account identifiers as authorization.
- Keep aliases throughout migration and at least the first completed full rollout. There is no approved removal date. Removal requires explicit decision, observed old-link usage without private data, updated extension/bookmarklet/notifications and regression evidence. No redirect chains: every alias targets the canonical resolver directly.
Titles, breadcrumbs and route validation
One h1 per page. Collection title: Jobs / Career Profile / CVs. Detail: role at company or CV name, safely text-rendered; browser title adds section and current Jobjakt name. Public token pages must not copy tokens into titles. Breadcrumbs on detail/Settings/Admin only when they provide navigation, e.g. Jobs → Role, CVs → CV name; status and tabs are not extra breadcrumb ancestors.
Phase 5 route changes require an actual App browser fixture for every migrated canonical/alias entry, loaded and missing/foreign objects, query retention, capture no-write, browser Back/refresh, dirty Cancel/Discard, focus return and account switch. Existing route-helper tests alone are insufficient. Test real static nginx fallback separately before deployment; F04 remains open.