Files
jobtrackingapp/docs/redesign/phase-5/p5-15/p5-15-01/PRES_RESULTS.md
T

118 lines
141 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P5-15-01 functional preservation results
**Current R-03 successor:** [Analytics authentication repair](analytics-auth-repair/README.md) supersedes AUTH-01 for its proved return-path scope. The unchanged original native assertion now passes both in isolation and the final full run. [Fresh final validation](analytics-auth-repair/evidence/validation.json) records **134/134 ordinary browser cases**, zero failures/skips/flaky/retries, diagnostics2/2, backend1,033/frontend490, unchanged revision/rendering/security gates. [Native proof](analytics-auth-repair/evidence/auth-proof.json) includes the genuine RED, encoded query/fragment/default/history/expiry/logout cases, foreign resource404s and rejected unsafe return targets. The [parent current column](../PRESERVATION_ACCEPTANCE.md) records **56 PARTIAL / 1 DEFERRED**, zero PASS/FAIL/BLOCKED/NOT VERIFIED whole groups: **only E02 moves FAIL→PARTIAL**. Original audit rows, counts and failed historical observations below remain unchanged.
The affected groups are E02 (local return journey), E03 (existing provider completion boundary), E04 (existing challenge completion), E07 (shared protected navigation) and E09 (account/session disposal). W01 supplies another owned/foreign protected Job-section deep link; J02 supplies unchanged saved-search regression safety, with all three repair cases passing alongside four Rules cases and117 inherited browser cases. This evidence does not qualify real Google/Microsoft, reset-mail/Turnstile, authenticators/recovery devices, BFCache/offline/old-bundle behavior, screen readers or physical devices. Full mandatory requirements remain in the original matrix and the current parent traceability table. Automated axe267/zero violations/**2,041 incomplete node occurrences** is not full accessibility acceptance. Original followMode metadata-only deferral, C11/P5-13 withholding, historical preference500 causes, unexplained CV Unsaved intermittent assertion and production evidence blockers remain open. Production remains NO-GO; P5-15-02 is not started.
**Historical R-02 successor:** [Rules draft repair](rules-draft-repair/README.md) closes SETTINGS-01 for its verified draft/save/error/account scope. This matrix remains the historical01 audit; the [parent successor matrix](../PRESERVATION_ACCEPTANCE.md) now records **55PARTIAL/1FAIL/1DEFERRED**, zero whole-group PASS/BLOCKED/NOT VERIFIED. Fresh R-02 full regression/native evidence is in the successor, including ordinary browser128pass/1fail and diagnostics2/2. E02/AUTH-01 stays FAIL and P5-13 remains deferred/withheld; no P5-15-02 or production GO is implied.
**Historical R-01 successor:** [saved-search repair](saved-search-repair/README.md) verifies the native SQLite/list feedback repair. J02 becomes PARTIAL in R-01; its57 totals are54PARTIAL/2FAIL/1DEFERRED in the retained [parent successor column](../PRESERVATION_ACCEPTANCE.md). This01 matrix and its53PARTIAL/3FAIL/1DEFERRED totals remain the original audit outcome, not a current open-defect count. No full group has been certified PASS.
Audit source **`932b962b9038ddb5ad59b982c0199475bfb50454`**, branch `codex/ui-redesign-phase4`, 2026-10-09. This document compares every original protected capability with actual current API/owner, frontend reach action, read/write boundary, inspected tests and outstanding evidence. It is a functional evidence record; no application repair, provider/model call, production operation, Docker recovery or B07 work belongs to it.
The original [Phase 1 ledger](../../../audit/FUNCTIONALITY_INVENTORY.md), [Phase 2 matrix](../../../phase-2/PRESERVATION_MATRIX.md), [approved Phase 5 plan](../../PHASE5_PLAN.md), [P5-15-00 matrix](../PRESERVATION_ACCEPTANCE.md) and [execution plan](../EXECUTION_PLAN.md) remain the contracts. Architecture follows the [API/controller/service/tenant boundaries](../../../../architecture/backend.md) and [client React Router/API layer](../../../../architecture/frontend.md). Each row includes the original full capability; its short test description covers representative assertions only.
**Status discipline:** PASS requires adequate current evidence for the whole named criterion. PARTIAL means evidenced sub-behaviors with required long-tail/manual/provider proof still missing. FAIL means an observed contradiction, including a carried defect when freshly reproduced. DEFERRED requires an approved exclusion. BLOCKED means execution cannot be performed in the available environment; NOT VERIFIED means adequate evidence has not been collected. A PARTIAL group can contain those outstanding sub-checks. Test/source existence is static observation, never an execution or PASS. Before means P5-15-00 acceptance; after means this audit's full original capability decision. Child test results may pass while their group remains PARTIAL.
## Execution provenance and limits
**Fresh backend/frontend execution:** [backend summary](evidence/backend-summary.json) records 1,023/1,023 backend cases, 108/108 focused AI and 5/5 revision subsets (included within 1,023), offline sidecar 49/49, configuration helpers 3/3, supply-chain helpers 3/3, offline evaluation helpers 5/5 and extension parser 3/3; zero failures/skips. API/test Release builds passed with zero warnings/errors. [Frontend/static summary](evidence/frontend-summary.json) records 459/459 tests across 82/82 suites, zero failed/pending/todo cases, success true; app TypeScript, complete current E2E/AI plus diagnostic TypeScript, lint and production build exited zero. Both runs used unchanged application source from the audit checkpoint. Backend runtime is Windows/.NET SDK 9.0.317, host 9.0.19; deterministic fixtures and disposable SQLite/files. Run dates, commands, counts/hashes and provider limitations are in those portable summaries.
**Fresh browser/native reconciliation:** [browser evidence](evidence/browser-summary.json) records all 117 inherited cases passing in the full run. The five added cases were rerun after harness corrections: two pass; three fail on real application behavior. The latest unique-case result is **119 pass / 3 fail / 122 total**, combined across declared runs, not one all-green final run. Separate preference diagnostics are **one pass / one fail**, outside that total. Real-HTTP 2, rate-limit 9, ingress 6 and PDF admission 1 passed. All runs have zero skips, expected failures and flaky retries. [Fresh fidelity](evidence/fidelity-summary.json): 16/16 (36=36 pages), settings 8/8 (24=24), unchanged tolerances; native package/revision fixtures remain green. Counts overlap across rows and must never be added into a second total. Human, provider, physical-device and production acceptance remain absent. [Journeys](JOURNEYS_AND_CONTROLS.md) distinguish real writes/readback, fault injection, API setup and browser interaction.
The ignored `.artifacts/p5-15-01/matrix/source-checks.json` records the exact 57 IDs, inspected mapped test names/assertion excerpts and file SHA-256 values. It is a local source cross-check, not a new production test framework or substitute for final run reports.
## Complete 57-capability matrix
API paths below include `/api`; `{id}` means the owned resource ID and nested `{jobId}` means the owning job. Controller routes and HTTP attributes were inspected directly. Source ownership is an intended boundary, with negative test anchors separately mapped; it is not a blanket security certification. Read paths can seed deterministic system checklist state where specifically stated. Every reach action is a current source action to execute, not a claim that it was clicked in this static review.
| ID / complete original capability | Actual API path and owner | Frontend route / entry and concrete reach action | Read/write and ownership semantics | Inspected test anchors / protected contract | Source observation versus fresh execution | Required missing/manual/provider evidence; risk / owner | P5-15-00 before | P5-15-01 after |
|---|---|---|---|---|---|---|---|---|
| **PRES-E01** — Public product explanation, Free/Pro feature comparison, honest unavailable-billing states and sign-in/register links<br>Original contract: `LandingPage`, `planCatalog`; do not invent prices or purchasable capabilities | `GET /api/billing/status`;<br>`BillingController / AccountPlans` | / public landing: choose Sign in/Create account; compare Free/Pro | Public read; billing configuration and server entitlements determine availability; landing cannot activate payment | [F:landing-page](../../../../../job-tracker-ui/src/landing-page.test.tsx); [F:planCatalog](../../../../../job-tracker-ui/src/planCatalog.test.ts); [B:AccountPlans](../../../../../JobTrackerApi.Tests/AccountPlansTests.cs)<br>Representative tests with inspected assertions: `shows exactly Free and Pro without invented commercial terms`; `publishes only capability-based Free and Pro plans`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AccountPlansTests 7/7. Frontend: landing-page.test.tsx 2/2, planCatalog.test.ts 1/1.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Smoke and all-role census verify public plans, configured-disabled registration and sign-in entry; actual billing activation remains unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Actual checkout/billing provider availability and public mobile/keyboard acceptance remain unverified.<br>Public/commerce owner; M — audit loaded mobile/keyboard EN/NB plans and honest unavailable billing; provider readiness separately. | **PARTIAL** | **PARTIAL** |
| **PRES-E02** — Local sign-in/registration, remember-me, configured Turnstile, resend verification, reset password, verify email<br>Original contract: `LoginPage`, reset/verification views, `TurnstileWidget`; server configuration controls availability | `GET /api/auth/config`;<br>`POST /api/auth/login, register, request-password-reset, reset-password, verify-email, resend-verification-email`;<br>`AuthController` | /login or /register public forms; Forgot password opens /forgot-password; emailed token opens /reset-password or /verify-email | Public token/config reads and explicit identity writes; configured registration/Turnstile, remember cookie and challenge control sign-in; never infer mail delivery | [F:login-page](../../../../../job-tracker-ui/src/login-page.test.tsx); [F:verify-email-page](../../../../../job-tracker-ui/src/verify-email-page.test.tsx); [B:LocalAuthIdentity](../../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs); [B:AuthAndSystemController](../../../../../JobTrackerApi.Tests/AuthAndSystemControllerTests.cs); [EmailOwnershipIntegrationTests.cs](../../../../../JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs) — actual confirmation/change-email tokens, not mailbox ownership<br>Representative tests with inspected assertions: `posts remember-me preference without storing an auth token in browser storage`; `confirms the account and shows success when the link is valid`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: LocalAuthIdentityTests 3/3, AuthAndSystemControllerTests 38/38, EmailOwnershipIntegrationTests 3/3. Frontend: login-page.test.tsx 13/13, verify-email-page.test.tsx 4/4.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Real local login works; anonymous route census then reproduces loss of /analytics?months=6 after sign-in. **FAIL AUTH-01**; missing-token/config-disabled states are intentional. Reset delivery/provider journeys remain unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Real reset-mail delivery, Turnstile/browser configuration and complete token-reset submit journey remain unverified.<br>Identity owner; H — trace reset request/token submit/verification/challenge errors in real App; sandbox mail/Turnstile only under later authorization. **Confirmed defect:** [register](DEFECTS.md); separate owner repair required. | **PARTIAL** | **FAIL** |
| **PRES-E03** — Google/Microsoft sign-in/link flows, Microsoft legacy relink, provider popup success/error handling<br>Original contract: `GoogleAuthCard`, `MicrosoftAuthCard`, `MicrosoftLegacyRelinkPage`; OAuth/state/origin rules remain | `POST /api/auth/google/exchange, google/link`;<br>`POST /api/auth/microsoft/exchange, microsoft/link, microsoft/legacy-relink/confirm`;<br>`AuthController + token validators` | /login provider buttons; /profile link controls; emailed recovery enters /microsoft-legacy-relink | Exchange creates authenticated identity only after validated token; linking requires own local identity; OAuth popup origin/state and provider token identity remain mandatory | [F:login-page](../../../../../job-tracker-ui/src/login-page.test.tsx); [F:microsoft-legacy-relink-page](../../../../../job-tracker-ui/src/microsoft-legacy-relink-page.test.tsx); [B:GoogleTokenValidator](../../../../../JobTrackerApi.Tests/GoogleTokenValidatorTests.cs); [B:MicrosoftTokenValidator](../../../../../JobTrackerApi.Tests/MicrosoftTokenValidatorTests.cs)<br>Representative tests with inspected assertions: `handles Microsoft cancellation without exchanging or navigating`; `Exchange_microsoft_token_creates_new_user_when_registration_allowed`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AuthAndSystemControllerTests 38/38, GoogleTokenValidatorTests 1/1, MicrosoftTokenValidatorTests 17/17. Frontend: login-page.test.tsx 13/13, microsoft-legacy-relink-page.test.tsx 1/1.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** All-role census verifies missing-token Microsoft relink page only; actual external sign-in/link/consent is NOT VERIFIED. No provider calls were made. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Real provider consent/popups, revoked grants and sandbox outcomes remain unverified; origin/state contracts remain required.<br>Identity/provider owner; H — audit popup origin/state, revoke/relink and provider errors using approved sandbox; keep sign-in and mailbox grants separate. | **PARTIAL** | **PARTIAL** |
| **PRES-E04** — 2FA challenge, recovery codes, setup/verify/disable/regenerate, trusted devices and revocation<br>Original contract: `TwoFactorChallenge`, `TwoFactorSettingsCard`; preserve sensitive confirmation and recovery presentation | `GET /api/auth/2fa/status, trusted-devices`;<br>`POST setup, verify-setup, challenge, disable, recovery-codes/regenerate, trusted-devices/revoke-all`;<br>`DELETE trusted-devices/{id}`;<br>`TwoFactorController` | /login challenge after password; account menu Profile opens /profile Security setup/verify/recovery/disable/trusted-device controls | Sensitive own-account security writes require confirmation/code/password; setup secret is pending until verification; trusted-device identity cannot bypass another account | [F:two-factor-settings](../../../../../job-tracker-ui/src/two-factor-settings.test.tsx); [F:login-page](../../../../../job-tracker-ui/src/login-page.test.tsx); [B:TwoFactorController](../../../../../JobTrackerApi.Tests/TwoFactorControllerTests.cs); [B:SessionsController](../../../../../JobTrackerApi.Tests/SessionsControllerTests.cs)<br>Representative tests with inspected assertions: `shows the 2FA code step when login requires two-factor, then proceeds like a normal login on success`; `Login_locks_account_after_five_failed_attempts_and_rejects_sixth_even_with_correct_password`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AuthAndSystemControllerTests 38/38, TwoFactorControllerTests 9/9, SessionsControllerTests 8/8. Frontend: login-page.test.tsx 13/13, two-factor-settings.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** No native authenticator/recovery-device journey added; fresh named backend/component assertions only. Full real-device security flow NOT VERIFIED. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Real mobile authenticator/recovery and trusted-device UI traversal remain open; no security-form acceptance inferred from navigation.<br>Identity/accessibility owner; H — manual keyboard/screen-reader recovery/trusted-device traversal plus real authenticator proof. | **PARTIAL** | **PARTIAL** |
| **PRES-E05** — Active session list, current-device distinction, single/other-session revocation, logout<br>Original contract: `SessionsSettingsCard`, `AppShell`, `auth`, `sessionBoundary`; invalidation must clear private UI | `DELETE /api/auth/sessions/{id}`;<br>`GET /api/auth/sessions`;<br>`POST revoke-others`;<br>`POST /api/auth/logout`;<br>`SessionsController + AuthController` | Account menu Profile opens /profile session card; Revoke/other sessions; user menu Sign out | Owner session reads/revocations; current session distinguished; logout revokes exact principal and client clears private state | [F:session-boundary](../../../../../job-tracker-ui/src/session-boundary.test.ts); [F:account-scoped-state](../../../../../job-tracker-ui/src/account-scoped-state.test.tsx); [B:SessionsController](../../../../../JobTrackerApi.Tests/SessionsControllerTests.cs); [B:AuthSessionRevocation](../../../../../JobTrackerApi.Tests/AuthSessionRevocationTests.cs)<br>Representative tests with inspected assertions: `Login_creates_a_user_session_row_and_threads_its_id_into_the_token`; `another session cannot be adopted even if the readable cookie signal is unchanged`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: SessionsControllerTests 8/8, AuthSessionRevocationTests 8/8. Frontend: session-boundary.test.ts 15/15, account-scoped-state.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Account-isolation browser fixtures verify finite session invalidation/private-state disposal and crafted session-context denial. Native session-card revoke/recovery long-tail remains unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Session-card selection/refresh after remote revocation remains open; broad device/AT acceptance is not established.<br>Identity/shell owner; H — audit session card remote-revoke refresh and Sign out private disposal/focus at every shell entry. | **PARTIAL** | **PARTIAL** |
| **PRES-E06** — Avatar upload/remove, name/display name/headline, account email-change request/cancel/confirm, local password change<br>Original contract: `ProfilePage`; account identity is distinct from canonical career data | `PUT /api/auth/profile`;<br>`POST/DELETE /api/auth/avatar`;<br>`POST change-password, email-change/request, email-change/cancel, email-change/confirm`;<br>`GET email-change`;<br>`AuthController + AvatarStorage` | Account menu Profile /profile: edit names/headline, upload/remove image, security/password/email controls; emailed /confirm-email-change | Own account identity writes; password/recent proof for sensitive changes; pending email is distinct from accepted email; avatar storage is separate from career source | [F:profile-page](../../../../../job-tracker-ui/src/profile-page.test.tsx); [F:verify-email-page](../../../../../job-tracker-ui/src/verify-email-page.test.tsx); [B:AvatarStorage](../../../../../JobTrackerApi.Tests/AvatarStorageTests.cs); [B:LocalAuthIdentity](../../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs); [EmailOwnershipIntegrationTests.cs](../../../../../JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs) — actual confirmation/change-email tokens, not mailbox ownership<br>Representative tests with inspected assertions: `confirms a pending email change and requires a fresh sign-in`; `GetRequiredUserId_returns_null_when_subject_claim_is_missing`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: LocalAuthIdentityTests 3/3, AuthAndSystemControllerTests 38/38, AvatarStorageTests 1/1, EmailOwnershipIntegrationTests 3/3. Frontend: verify-email-page.test.tsx 4/4, profile-page.test.tsx 15/15.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** All-role profile route/native read verified; no complete native avatar/email/password mutation journey added. Fresh named token/form cases only for those mutations. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Avatar upload/remove and password-change browser journeys remain unverified; account identity stays distinct from Career Profile.<br>Identity owner; H — audit native avatar/remove/password/email-change, missing/error states and cross-account negative paths. | **PARTIAL** | **PARTIAL** |
| **PRES-E07** — Collapsible desktop sidebar, mobile drawer, active subsection matching, keyboard command launcher<br>Original contract: `AppShell`, `QuickCommandDialog`; job/company search and fixed navigation/add commands | `GET /api/jobapplications/choices`;<br>`GET /api/companies`;<br>`OperationsController notifications`;<br>`AppShell + QuickCommandDialog` | Desktop rail collapse/mobile menu; Ctrl/Cmd+K search job/company or fixed destination/Add job; bell opens popover | Navigation/search reads only; reviewed Add job opens modal without creation; private query caches must discard on account switch; hidden Admin entry never establishes permission | [F:sidebar-active-nav](../../../../../job-tracker-ui/src/sidebar-active-nav.test.ts); [F:app-shell-notifications](../../../../../job-tracker-ui/src/app-shell-notifications.test.tsx); [B:JobApplicationsAuthorization](../../../../../JobTrackerApi.Tests/JobApplicationsAuthorizationTests.cs); [B:CompanyRelationship](../../../../../JobTrackerApi.Tests/CompanyRelationshipTests.cs)<br>Representative tests with inspected assertions: `/career activates Career Workspace only`; `notification bell exposes its unread count and keyboard-accessible action`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobApplicationsAuthorizationTests 4/4, CompanyRelationshipTests 2/2. Frontend: sidebar-active-nav.test.ts 10/10, app-shell-notifications.test.tsx 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh shell/readiness/utility native keyboard, collapse/mobile controls, destination and role census pass their finite fixtures. AUTH-01 remains a cross-cutting sign-in context defect; spoken names/announcements remain unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Original route/command/drawer defects have scoped successor evidence; manual screen reader and inherited command/focus timing debt remain open. This census is not browser route acceptance.<br>Shell/accessibility owner; H — audit every nav/command destination, collapsed/mobile labels, route focus, dirty Cancel and manual spoken names (P5-02-D01; P5-04b-R01). | **PARTIAL** | **PARTIAL** |
| **PRES-E08** — Theme light/dark/system, EN/Bokmål preference with server hydration, toast/confirm/prompt and error routes<br>Original contract: `themePrefs`, `I18nProvider`, `toast`, `confirm`, `prompt`, route error/not-found views | `PUT /api/auth/preferences/language`;<br>`GET /api/auth/me`;<br>`AuthController`;<br>`browser themePrefs` | Settings /settings General theme/language selectors; shell preferences; confirm/prompt/toast; unknown route and error retry | Theme is browser preference; language has local presentation and server hydration/write; modal Cancel must not mutate; toast success cannot replace server acknowledgment | [F:theme-state](../../../../../job-tracker-ui/src/theme-state.test.tsx); [F:i18n-provider](../../../../../job-tracker-ui/src/i18n-provider.test.tsx); [B:LocalAuthIdentity](../../../../../JobTrackerApi.Tests/LocalAuthIdentityTests.cs)<br>Representative tests with inspected assertions: `GetRequiredUserId_returns_null_when_subject_claim_is_missing`; `Login_locks_account_after_five_failed_attempts_and_rejects_sixth_even_with_correct_password`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: LocalAuthIdentityTests 3/3, AuthAndSystemControllerTests 38/38. Frontend: theme-state.test.tsx 7/7, i18n-provider.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh shell/settings theme/locale/focus/feedback fixtures pass; three genuine concurrent preference rounds persist/reload correctly. Historical intermittent 500 is not closed; no human full contrast/AT acceptance. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Full theme/locale/state/OS cross-product, spoken names/announcements, incomplete axe, zoom/forced-colours/text-spacing and shared-dialog timing remain unverified.<br>Shared UI/accessibility owner; H — audit loaded error/confirm/prompt states, OS theme, locale hydration, zoom/forced colours and announcements; incomplete axe remains open. | **PARTIAL** | **PARTIAL** |
| **PRES-E09** — Cross-tab account switch, stale mutation/read rejection, BFCache/focus revalidation and reauthentication<br>Original contract: `api`, `sessionBoundary`, `App`; B02 server precondition and client unmount/abort must survive extraction | `GET /api/auth/me, csrf`;<br>`SessionContextMiddleware + JobTrackerContext current-user filters` | Private shell revalidates at account/tab/focus/BFCache boundaries; sign out/sign in A then B; stale request callback | Client abort/unmount and server X-Session-Context 428/409 preserve owner; no stale read/write can adopt cookie-switched B or expose A state | [F:session-boundary](../../../../../job-tracker-ui/src/session-boundary.test.ts); [F:account-scoped-state](../../../../../job-tracker-ui/src/account-scoped-state.test.tsx); [B:SessionContextMiddleware](../../../../../JobTrackerApi.Tests/SessionContextMiddlewareTests.cs); [B:CurrentUserIdLiveEvaluation](../../../../../JobTrackerApi.Tests/CurrentUserIdLiveEvaluationTests.cs)<br>Representative tests with inspected assertions: `cookie switch rejects a stale callback before transport and never adopts B's context`; `keeps saved views private to the account that created them`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: SessionContextMiddlewareTests 13/13, CurrentUserIdLiveEvaluationTests 2/2. Frontend: session-boundary.test.ts 15/15, account-scoped-state.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh account-isolation browser runs actual cookie/session transport, retained A request with B context, missing/forged context and two-tab disposal. Finite boundaries pass, not every BFCache/offline/device combination. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Real BFCache variations/long offline retries and deployed old-bundle/session behavior remain unverified; images and mocked components cannot prove tenant isolation.<br>Identity owner; H — rerun real account-switch/two-tab stale read/write evidence at execution checkpoint; extend BFCache/offline/old-bundle audit when authorized. | **PARTIAL** | **PARTIAL** |
| **PRES-J01** — Search NAV listings by role/company/municipality, sorting, source/freshness/deadline/work-arrangement details, external listing links<br>Original contract: `JobDiscoveryPage`; provider failures and empty results distinguishable | `GET /api/job-discovery/search`;<br>`JobDiscoveryController + NavJobDiscoverySearchService` | Primary Discover /discover: enter role/company/municipality, Search, sort, inspect listing and external source | Read discovery provider metadata; empty differs from provider failure; saving requires reviewed AddJobModal, search never creates application | [F:job-discovery](../../../../../job-tracker-ui/src/job-discovery.test.tsx); [B:JobDiscoveryController](../../../../../JobTrackerApi.Tests/JobDiscoveryControllerTests.cs); [B:JobOpportunitySync](../../../../../JobTrackerApi.Tests/JobOpportunitySyncTests.cs)<br>Representative tests with inspected assertions: `distinguishes the initial guidance from a completed empty search`; `Search_filters_recent_active_nav_jobs`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobDiscoveryControllerTests 3/3, JobOpportunitySyncTests 1/1. Frontend: job-discovery.test.tsx 7/7.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Discover route/header resolves, but NAV search/import browser data are deterministic substituted provider fixtures. Saved-search500 is separately J02; real external NAV acquisition remains NOT VERIFIED. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Live NAV freshness/availability and long result keyboard traversal remain open.<br>Discovery owner; M — audit long results/mobile keyboard/source/deadline/retry; live NAV availability separately. | **PARTIAL** | **PARTIAL** |
| **PRES-J02** — Named saved searches, run/delete, automatic alert preference, new/updated results and dismissal<br>Original contract: `JobDiscoveryPage`, saved-search APIs; retain owner scope and alert metadata | `GET/POST/PATCH/DELETE /api/job-discovery/saved-searches`;<br>`POST {id}/run`;<br>`PATCH {id}/results/{externalJobId}/dismiss`;<br>`JobDiscoveryController` | Discover /discover: name/save search, select/run, toggle alert, dismiss result, delete saved search | Saved search/results/alert metadata owner-scoped; run is explicit persisted search update; background baseline does not alert all existing results | [F:job-discovery](../../../../../job-tracker-ui/src/job-discovery.test.tsx); [B:SavedJobSearchAlert](../../../../../JobTrackerApi.Tests/SavedJobSearchAlertTests.cs); [B:JobDiscoveryController](../../../../../JobTrackerApi.Tests/JobDiscoveryControllerTests.cs)<br>Representative tests with inspected assertions: `shows honest source metadata and offers the existing reviewed save flow`; `Saved_search_tracks_new_seen_and_dismissed_results_per_owner`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobDiscoveryControllerTests 3/3, SavedJobSearchAlertTests 1/1. Frontend: job-discovery.test.tsx 7/7.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Normal and admin saved-search GETs fail500 on entry and refresh (four genuine observations); exact installed SQLite translation rejects DateTimeOffset ORDER BY. **FAIL DISCOVERY-01**; no app fix or provider call. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Scheduler-to-notification browser journey and mobile delete confirmation remain unverified; no new producer or delivery certification.<br>Discovery/notifications owner; M — audit saved search delete/pause/run, mobile confirmation and scheduler-to-owned-notification chain. **Confirmed defect:** [register](DEFECTS.md); separate owner repair required. | **PARTIAL** | **FAIL** |
| **PRES-J03** — Add job manually or from URL/pasted listing, reviewed preview, company lookup/create, tags and dates, duplicate warning<br>Original contract: `AddJobModal`; preview is not a write; keep B01 outbound boundary and existing review step | `POST /api/jobimport/preview`;<br>`GET /api/jobapplications/duplicate-check`;<br>`POST /api/jobapplications`;<br>`GET/POST /api/companies`;<br>`JobImportController + JobApplicationsController` | Shell Add job or Jobs Add job: manual/URL/pasted preview, select/create company, tags/dates, confirm Save | Preview outbound guarded by B01 and is not application write; create explicit after review; owned company association validated; duplicate warning does not imply deduplication | [F:quick-capture](../../../../../job-tracker-ui/src/quick-capture.test.tsx); [B:JobImportService](../../../../../JobTrackerApi.Tests/JobImportServiceTests.cs); [B:JobImportHttpTransport](../../../../../JobTrackerApi.Tests/JobImportHttpTransportTests.cs)<br>Representative tests with inspected assertions: `auto-imports from initialUrl and prefills the form`; `Preview_rejects_equivalent_private_literals_before_http_send`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobImportServiceTests 16/16, JobImportHttpTransportTests 76/76. Frontend: quick-capture.test.tsx 4/4.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Smoke executes reviewed Add UI and observes created role; native fixture setup elsewhere is API creation, not full UI acquisition. URL/NAV imports use approved synthetic provider fixtures; live imports unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Duplicate/company/date edge UI and creation-intent idempotency remain independent gaps; import network boundary evidence is separate from live site success.<br>Capture/API owner; H — audit reviewed duplicate/company/date boundaries and interrupted creation; creation-intent idempotency stays a separate contract. | **PARTIAL** | **PARTIAL** |
| **PRES-J04** — Capture via browser extension, bookmarklet and share/capture query; optional job attachment and tailored CV draft after create<br>Original contract: `QuickCaptureCard`, `captureUrl`, `App`, `browser-extension`; preserve payload/URL contracts | `POST /api/jobimport/preview`;<br>`POST /api/jobapplications`;<br>`attachment and tailored-cv APIs`;<br>`captureUrl + AddJobModal` | Settings Quick capture install/bookmarklet; extension/share opens capture query handled by App; reviewed Add job then optional attachment/CV | Capture query preserves URL/text payload, no auto-create; optional post-create writes bind to created owned job; extension parsing tests are not installed-browser proof | [F:captureUrl](../../../../../job-tracker-ui/src/captureUrl.test.ts); [F:quick-capture](../../../../../job-tracker-ui/src/quick-capture.test.tsx); [B:JobImportService](../../../../../JobTrackerApi.Tests/JobImportServiceTests.cs); [B:CvBuilder](../../../../../JobTrackerApi.Tests/CvBuilderTests.cs)<br>Representative tests with inspected assertions: `auto-imports from initialUrl and prefills the form`; `Preview_rejects_equivalent_private_literals_before_http_send`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobImportServiceTests 16/16, CvBuilderTests 35/35. Frontend: quick-capture.test.tsx 4/4, captureUrl.test.ts 4/4.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Existing acquisition/capture assertions freshly rerun; original extension/parser3 pass. Real installed extension/PWA/platform share and external acquisition not executed. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Installed extension permissions/share flow and optional attachment failure recovery remain unverified.<br>Capture owner; H — audit installed extension/share/no-replay and post-create attachment failure recovery without auto-create. | **PARTIAL** | **PARTIAL** |
| **PRES-J05** — Job table search/filter/sort/pagination, visible columns/page size, saved named views, row/card actions<br>Original contract: `JobTable`, `SavedViewsMenu`; mobile cards and accessible full-workspace entry already exist | `GET /api/jobapplications (paged), board, choices`;<br>`JobApplicationsController` | Primary Jobs /jobs: search/filter/sort, page/page-size/columns/density, Saved views; activate row/card workspace; Board switch | Queries/saved-view owner state retain complete matching records; read Table/Board identity parity; row control events must not open workspace accidentally | [F:application-workspace-overlay](../../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx); [F:account-scoped-state](../../../../../job-tracker-ui/src/account-scoped-state.test.tsx); [B:JobApplicationsController](../../../../../JobTrackerApi.Tests/JobApplicationsControllerTests.cs); [B:JobApplicationsEndpointBehavior](../../../../../JobTrackerApi.Tests/JobApplicationsEndpointBehaviorTests.cs)<br>Representative tests with inspected assertions: `keeps saved views private to the account that created them`; `opens the dedicated workspace from the whole row and preserves list state on return`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobApplicationsControllerTests 2/2, JobApplicationsEndpointBehaviorTests 9/9. Frontend: account-scoped-state.test.tsx 2/2, application-workspace-overlay.test.tsx 18/18.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh density/integrated Board fixtures preserve finite filter/sort/page/selection/row-focus/density contracts. Added250 exact-ID test traverses17 Table pages and equals Board API/DOM population. Saved-view/bulk long-tail remains outstanding. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Finite saved-view/filter/Back/error/selection fixtures do not exhaust saved-view CRUD or dirty nested page-size combinations; full-array scaling remains limited.<br>Jobs owner; H — audit full saved-view CRUD, Back/refresh/unknown query, dirty nested page-size and all-result scaling. | **PARTIAL** | **PARTIAL** |
| **PRES-J06** — Selection/bulk status/delete/restore, soft-delete/trash and restore, edit job/company association<br>Original contract: `JobTable`, `EditJobDialog`; preserve partial-error handling and confirmation semantics | `PUT /api/jobapplications/{id}`;<br>`PATCH {id}/status`;<br>`DELETE {id}`;<br>`POST {id}/restore`;<br>`JobApplicationsController + JobApplicationLifecycleController` | Jobs select rows then bulk status/delete; row edit; secondary Trash /trash select/restore; confirmation dialogs | Owner-scoped writes and soft deletion; partial bulk failures retained; restoring differs from recreating; foreign job/company associations denied | [F:application-workspace-overlay](../../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx); [F:confirm-flow](../../../../../job-tracker-ui/src/confirm-flow.test.tsx); [B:JobApplicationsController](../../../../../JobTrackerApi.Tests/JobApplicationsControllerTests.cs); [B:JobApplicationsAuthorization](../../../../../JobTrackerApi.Tests/JobApplicationsAuthorizationTests.cs)<br>Representative tests with inspected assertions: `GetHistory_returns_not_found_for_other_users_job`; `opens the dedicated workspace from the whole row and preserves list state on return`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobApplicationsAuthorizationTests 4/4, JobApplicationsControllerTests 2/2. Frontend: application-workspace-overlay.test.tsx 18/18, confirm-flow.test.tsx 1/1.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh Jobs/Trash density fixtures exercise owned selection/status/delete-scope/restore/readback for named cases; backend mutations remain green. Not every bulk partial-failure/edit field is a complete browser journey. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Scoped native restore and bulk/mutation fixtures supersede earlier bare-confirm gaps; all bulk partial-failure/dirty-state combinations and deeper manual AT remain unverified.<br>Jobs/API owner; H — audit selected scope, partial bulk failures and Trash restore with native persistence/dirty protection. | **PARTIAL** | **PARTIAL** |
| **PRES-J07** — Kanban grouped status views, drag move, keyboard pickup/drop/cancel, direct status selection, job opening<br>Original contract: `KanbanBoard`, `pipeline`; same records as table, not a second job model | `GET /api/jobapplications/board`;<br>`PATCH /api/jobapplications/{id}/status`;<br>`JobApplicationsController + JobApplicationLifecycleController` | Jobs Board /jobs?view=board; legacy /kanban redirects; drag, keyboard pickup/drop/Cancel, card status menu/open | Same owned complete matching IDs as Table; custom/unknown status represented; failed status move rolls back; explicit no-drag selector writes same status API | [F:kanban-grouped-board](../../../../../job-tracker-ui/src/kanban-grouped-board.test.tsx); [F:pipeline](../../../../../job-tracker-ui/src/pipeline.test.ts); [B:JobPipeline](../../../../../JobTrackerApi.Tests/JobPipelineTests.cs)<br>Representative tests with inspected assertions: `a custom status gets an Other column that is not a drop target`; `statusLabel localizes canonical and passes through custom`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobPipelineTests 46/46. Frontend: kanban-grouped-board.test.tsx 15/15, pipeline.test.ts 11/11.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh Board presentation/integration fixtures prove pointer/keyboard status movement, custom statuses, failed-move feedback, query/history and exact IDs. Added250 population passes; scaling and physical native touch remain unqualified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Physical touch/native drag, broader responsive focus/cancel combinations and full-result scaling remain open; grouped statuses are not a new pipeline.<br>Jobs/accessibility owner; H — audit keyboard cancel/view focus, physical touch/drag and complete filtered membership at scale; no new pipeline. | **PARTIAL** | **PARTIAL** |
| **PRES-J08** — Company directory, recruiter/contact/source/location and pipeline/contact-date editing; company relationship job history<br>Original contract: `CompaniesTable`; company creation is integrated with job/import flows, not assumed standalone CRUD | `GET/POST/PUT /api/companies`;<br>`GET /api/companies/{id}/relationship`;<br>`CompaniesController` | Jobs group Companies /companies; command company result opens relationship; row edit contact/recruiter/source/pipeline; creation from Add job/import | Owned directory reads and edit writes; company job/contact history owner-bound; integrated creation exists, no standalone CRUD flow inferred | [F:companies-relationship](../../../../../job-tracker-ui/src/companies-relationship.test.tsx); [F:quick-command-preservation](../../../../../job-tracker-ui/src/quick-command-preservation.test.tsx); [B:CompanyRelationship](../../../../../JobTrackerApi.Tests/CompanyRelationshipTests.cs)<br>Representative tests with inspected assertions: `Relationship_combines_owned_applications_and_contact_history`; `opens one company relationship view with applications and recent contact`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CompanyRelationshipTests 2/2. Frontend: companies-relationship.test.tsx 1/1, quick-command-preservation.test.tsx 9/9.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** All-role company route/native GET and existing creation/edit component/backend cases pass. Full native recruiter/contact/pipeline CRUD and outside-modal feedback race remain outstanding. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | All contact/date edits and source-URL safety browser journeys remain unverified; P4-02-D02 inaccessible modal-save error is open for its owner.<br>Companies/accessibility owner; H — fix and prove durable in-modal save error before form migration (P4-02-D02); audit contact/date/source links. | **PARTIAL** | **PARTIAL** |
| **PRES-J09** — Offer comparison including recorded compensation, decision deadline and notes, source-job links<br>Original contract: `OfferComparisonPage`; no new compensation calculator implied | `GET /api/jobapplications`;<br>`PUT /api/jobapplications/{id}`;<br>`JobApplicationsController` | Secondary Offers /offers compares offer records, open source job; source job edit compensation/deadline/notes | Recorded compensation read, no invented calculation; edit remains job owner write; missing values remain unknown | [F:offer-comparison](../../../../../job-tracker-ui/src/offer-comparison.test.tsx); [B:AnalyticsSalary](../../../../../JobTrackerApi.Tests/AnalyticsSalaryTests.cs); [B:JobApplicationsEndpointBehavior](../../../../../JobTrackerApi.Tests/JobApplicationsEndpointBehaviorTests.cs)<br>Representative tests with inspected assertions: `Save_application_drafts_updates_cover_letter_and_notes`; `compares recorded offer facts without filling missing values`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobApplicationsEndpointBehaviorTests 9/9, AnalyticsSalaryTests 1/1. Frontend: offer-comparison.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** All-role Offers route/native GET passes; named compensation/offer comparison fixtures pass. Full multi-offer native editing/decision workflow not newly performed. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Mobile many-offer comparison and localized currency/date visual acceptance remain open; no new salary facts are claimed.<br>Offers owner; M — audit many-offer narrow layout, currency/period/date labels and safe source links across EN/NB. | **PARTIAL** | **PARTIAL** |
| **PRES-J10** — JSON/CSV job export; JSON import; CSV-to-import-JSON conversion and import counts<br>Original contract: `ImportExportJobs`; preserve B05 blob bytes/BOM, spreadsheet safety and typed formats; do not claim full account restore from job import | `GET /api/export/jobs`;<br>`POST /api/companies, /api/jobapplications`;<br>`ExportController + ImportExportJobs` | Settings General /settings Jobs Import/export: JSON/CSV download, JSON upload, CSV-to-import-JSON conversion | Blob/BOM/CSV spreadsheet safety retained; import creates owned company/job records and reports counts, not existing-record restoration; job import is not complete account restore | [F:csv-export](../../../../../job-tracker-ui/src/csv-export.test.tsx); [B:CsvExport](../../../../../JobTrackerApi.Tests/CsvExportTests.cs); [B:JobApplicationsController](../../../../../JobTrackerApi.Tests/JobApplicationsControllerTests.cs)<br>Representative tests with inspected assertions: `Application_package_record_exposes_expected_fields`; `%s download preserves server bytes and a generated safe filename`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobApplicationsControllerTests 2/2, CsvExportTests 25/25. Frontend: csv-export.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh named import/export backend/component cases pass; no complete file-upload/conversion/download UI lifecycle added. Production account restore is separate, unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Full JSON import/count/roundtrip browser proof and spreadsheet-client compatibility remain separately bounded; byte/formula/Unicode fixtures are not exhaustive.<br>Settings/data owner; H — audit native JSON import counts/roundtrip, Unicode/formula-safe bytes and target spreadsheet compatibility. | **PARTIAL** | **PARTIAL** |
| **PRES-W01** — Dedicated job workspace and reusable quick overlay; overview/analysis/CV/cover-letter/interview sections; old deep-link mapping<br>Original contract: `ApplicationWorkspacePage`, `ApplicationWorkspace`, `jobWorkspaceRoute`; retain full-page/overlay parity | `GET /api/jobapplications/{id}/workspace`;<br>`ApplicationWorkspaceController` | Jobs row /jobs/:id; legacy /applications/:id redirect; seven tabs plus aliases; reusable overlay host where already invoked | Overview read aggregates owners without copying canonical data; URL/query/Back/dirty protections; mount/navigation must not generate AI; P5-05 new quick-preview host remains deferred | [F:application-workspace-overlay](../../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx); [F:applicationWorkspace](../../../../../job-tracker-ui/src/applicationWorkspace.test.ts); [B:ApplicationWorkspace](../../../../../JobTrackerApi.Tests/ApplicationWorkspaceTests.cs)<br>Representative tests with inspected assertions: `opens the dedicated workspace from the whole row and preserves list state on return`; `workspace navigation exposes seven purposes and preserves legacy links`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: ApplicationWorkspaceTests 10/10. Frontend: application-workspace-overlay.test.tsx 18/18, applicationWorkspace.test.ts 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh job-section/Overview/preservation plus32-route census verify direct/alias entry, refresh, sections, Back/Forward and Jobs context; foreign/missing Job404 has no private title. Quick-preview host remains unused/approved deferred. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Reusable overlay has no active production host; followMode metadata retained but mode-specific UI explicitly deferred to mail. Full manual AT and historical transition-capture limits remain.<br>Workspace/mail owner; H — audit all canonical/legacy entries and numeric navigation-helper arguments, safe query/state, dirty/Back/focus; carry followMode UI to mail phase. | **PARTIAL** | **PARTIAL** |
| **PRES-W02** — Job detail/status/progression, next actions, dates, description, recruiter/contact and timeline<br>Original contract: `JobDetailsSection`, `ApplicationProgress`, `ApplicationTimeline`; do not redefine pipeline enums or history | `GET /api/jobapplications/{id}`;<br>`PATCH {id}/status, followup`;<br>`GET {id}/history, timeline`;<br>`JobApplicationLifecycleController + ApplicationIntelligenceController` | Job workspace Overview header/status/Edit; Timeline Activity subview | Owned status/date writes and append-only history; moving backward has explicit applied-date semantics; human notes differ from package answers/events | [F:application-intelligence](../../../../../job-tracker-ui/src/application-intelligence.test.tsx); [F:workflow-trust-signals](../../../../../job-tracker-ui/src/workflow-trust-signals.test.tsx); [B:JobApplicationsWorkflowSignals](../../../../../JobTrackerApi.Tests/JobApplicationsWorkflowSignalsTests.cs); [B:JobApplicationsAppliedDateHistory](../../../../../JobTrackerApi.Tests/JobApplicationsAppliedDateHistoryTests.cs)<br>Representative tests with inspected assertions: `timeline renders grouped days, milestones and readable summaries`; `follow-up workflow signals route all overview surfaces to the same follow-up workspace`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobApplicationsWorkflowSignalsTests 2/2, JobApplicationsAppliedDateHistoryTests 4/4. Frontend: application-intelligence.test.tsx 11/11, workflow-trust-signals.test.tsx 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh populated/sparse Overview and sections fixtures exercise header/status/metadata/actions/timeline under four theme/locale pairs; no inferred events. Long-tail contact/date/history mutations remain outstanding. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Localized backend event/content text, timezone/reload/status-to-timeline combinations and human AT remain unverified; job revision semantics were not repaired.<br>Workspace/API owner; H — audit native edit/status/date-to-timeline and localized stored content/timezones; job revision debt separately. | **PARTIAL** | **PARTIAL** |
| **PRES-W03** — Analysis, profile match/gaps, strategy snapshot, workflow assistance and status suggestions<br>Original contract: `ApplicationAnalysis`, `ApplicationMatch`, `ApplicationStatusSuggestion`, `ApplicationStrategySnapshot`; show provenance/loading/failure and confirmation | `GET /api/jobapplications/{id}/analysis, match, status-suggestion, focus-plan`;<br>`POST focus-plan/operations, {id}/refresh-ai`;<br>`ApplicationIntelligenceController + StrategySnapshotController` | Job workspace Match; refresh/strategy generation and suggestion Apply controls | Saved/read projections distinct from explicit provider generation; accepted status suggestion writes only after confirmation; owner/provenance/failure state retained | [F:application-intelligence](../../../../../job-tracker-ui/src/application-intelligence.test.tsx); [F:application-workflow-assist](../../../../../job-tracker-ui/src/application-workflow-assist.test.tsx); [B:ApplicationIntelligence](../../../../../JobTrackerApi.Tests/ApplicationIntelligenceTests.cs); [B:StrategySnapshotOperation](../../../../../JobTrackerApi.Tests/StrategySnapshotOperationTests.cs)<br>Representative tests with inspected assertions: `timeline renders grouped days, milestones and readable summaries`; `recruiter status suggestions require an explicit apply action`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: ApplicationIntelligenceTests 19/19, StrategySnapshotOperationTests 4/4. Frontend: application-intelligence.test.tsx 11/11, application-workflow-assist.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh deterministic analysis/strategy/match suites and native section presentation pass finite behavior; no live model quality or new grounded analysis generated for qualification. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Live model truthfulness, freshness/cancelled generation and provider quality remain unverified; P5-13 production CV withholding must not disable these unrelated AI paths.<br>Workspace/AI owner; H — audit reviewed suggestions/error/cancel/freshness/no-write entry; qualify live factuality separately from CV exception. | **PARTIAL** | **PARTIAL** |
| **PRES-W04** — Checklist create/edit/complete/delete/order, progress and recommended next action<br>Original contract: `ApplicationChecklist`; keep keyboard reorder and persisted item identity | `GET/POST/PATCH/DELETE /api/jobapplications/{id}/checklist`;<br>`PUT checklist/order`;<br>`ApplicationChecklistController` | Job workspace Tasks: add/edit/complete/delete task, keyboard move up/down, progress/next action | Item IDs owned through job; first read can seed/recompute deterministic system checklist, not AI generation; manual reorder persists identity | [F:application-checklist](../../../../../job-tracker-ui/src/application-checklist.test.tsx); [B:ApplicationChecklist](../../../../../JobTrackerApi.Tests/ApplicationChecklistTests.cs)<br>Representative tests with inspected assertions: `reordering sends the new id order`; `Reordering_persists_the_new_order`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: ApplicationChecklistTests 15/15. Frontend: application-checklist.test.tsx 7/7.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh sections/checklist fixtures exercise owned task completion/edit/readback and next-action presentation. GET seed/recompute remains an existing server write contract; all scheduler/CRUD combinations not certified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Real mobile interruption/edit/delete combinations and human AT remain open; no task due-date schema or automatic notification added.<br>Workspace owner; H — audit native mobile item edit/delete/reorder/interruption and manual/system/dismissed next actions. | **PARTIAL** | **PARTIAL** |
| **PRES-W05** — Select/attach a CV, create/tailor document variants, review tailoring guidance and selected-source context<br>Original contract: `ApplicationCvSection`, `ApplicationTailoringSection`, `applicationWorkspace`; owner+job association enforced by API | `GET/PUT /api/jobapplications/{id}/cv`;<br>`GET tailoring`;<br>`tailored-cv-draft GET/PUT/generate`;<br>`ApplicationAssetsController + JobApplicationsController` | Job workspace Application CV: select/attach/detach, create/tailor variant, open identified CV builder | Association changes owned job pointer and does not mutate canonical profile/other CV; selected CV must share owner; generation explicit and guidance requires review | [F:application-assets](../../../../../job-tracker-ui/src/application-assets.test.tsx); [F:cv-builder-deep-link](../../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:ApplicationAssets](../../../../../JobTrackerApi.Tests/ApplicationAssetsTests.cs); [B:CvBuilder](../../../../../JobTrackerApi.Tests/CvBuilderTests.cs)<br>Representative tests with inspected assertions: `Resolver_defaults_include_every_populated_section`; `cv section shows the attached variant and the ones available to attach`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CvBuilderTests 35/35, ApplicationAssetsTests 15/15. Frontend: application-assets.test.tsx 18/18, cv-builder-deep-link.test.tsx 41/41.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh native preservation/section fixtures select owned CV/tailoring source and preserve captured CV association after source changes; backend native ZIP proof separately passes. Job tailoring live-model quality not qualified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | P2-D01 is an ordinary passing native regression, not current expected failure. Broader attach-render combinations, provider tailoring quality and deployed restore remain unverified; CV review production exception stays distinct.<br>Workspace/CV owner; H — audit attach/render/detach/create/tailor with source and foreign-owner checks; retain ordinary native P2-D01 successor. | **PARTIAL** | **PARTIAL** |
| **PRES-W06** — Cover-letter editing, AI suggestion review/reject/apply, saved versions and restore, unsaved navigation protection<br>Original contract: `ApplicationAssets`, `CoverLetterAiAssistant`; document override must not mutate master profile | `GET/PUT /api/jobapplications/{id}/cover-letter`;<br>`POST cover-letter/versions/{version}/restore`;<br>`ApplicationAssetsController + AiWorkspaceController` | Job workspace Application Cover letter: edit/save, request AI/review/apply/reject, versions restore; attempt leaving dirty | Owned document versions separate from canonical source; no write on navigation; Cancel keeps draft, Discard permits leave; restore is explicit new document state | [F:application-assets](../../../../../job-tracker-ui/src/application-assets.test.tsx); [F:application-workspace-overlay](../../../../../job-tracker-ui/src/application-workspace-overlay.test.tsx); [B:ApplicationAssets](../../../../../JobTrackerApi.Tests/ApplicationAssetsTests.cs)<br>Representative tests with inspected assertions: `opens the dedicated workspace from the whole row and preserves list state on return`; `cover letter loads the current text and its history`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: ApplicationAssetsTests 15/15. Frontend: application-workspace-overlay.test.tsx 18/18, application-assets.test.tsx 18/18.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh workspace draft/navigation fixtures cover dirty Cancel/Discard and native cover-letter state; named accept/reject/history backend/component cases pass. No live provider or every restore race qualification. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Native/mocked review/history evidence does not establish live-model or provider quality; full screen-reader and every reject/history sequence remain unverified.<br>Workspace/AI owner; H — audit native manual/AI reject/accept/save/history and dirty Cancel/Discard; actual model quality separately. | **PARTIAL** | **PARTIAL** |
| **PRES-W07** — Application draft fields, submission/package preparation, frozen submitted-package versions and archived attachment download<br>Original contract: `ApplicationAssets`, `SubmittedPackagesSection`, `applicationWorkspace`; historical package is distinct from current draft | `PUT /api/jobapplications/{id}/application-drafts`;<br>`GET/POST submitted-packages`;<br>`GET submitted-packages/{packageId}/attachments/{attachmentId}`;<br>`ApplicationAssetsController + SubmittedApplicationPackageService` | Job workspace Application Answers/Submission: edit drafts, prepare/capture, open frozen version, download ZIP/archive attachment | Current drafts differ from immutable historical capture; answer markers preserve human notes; exact archived bytes/hash survive source edits/delete; owner+job+package enforced | [F:application-assets](../../../../../job-tracker-ui/src/application-assets.test.tsx); [F:application-drafts](../../../../../job-tracker-ui/src/application-drafts.test.ts); [B:SubmittedApplicationPackage](../../../../../JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs); [B:JobApplicationsApplicationPackage](../../../../../JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs)<br>Representative tests with inspected assertions: `document package history is read-only and separates captured notes from answers`; `application answer helpers keep human notes separate`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: SubmittedApplicationPackageTests 4/4, JobApplicationsApplicationPackageTests 11/11. Frontend: application-assets.test.tsx 18/18, application-drafts.test.ts 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh browser capture/immutable JSON/readback/archive-file download and fresh native backend ZIP/extraction fixture pass. Frozen source/answers/attachments remain historical; production storage/restore not tested. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Earlier P2-D01 capture expected failure is superseded by ordinary native passing evidence. Production restore/rollback and all storage/provider combinations remain unverified; capture is not external send.<br>Workspace/storage owner; H — retain native capture→source mutation→archive/ZIP immutable-byte regression; release owner proves restore/rollback independently. | **PARTIAL** | **PARTIAL** |
| **PRES-W08** — Attachments upload/drag-drop, category/purpose, rename, AI-use flag, preview/download/delete<br>Original contract: `Attachments`; owner-scoped binary retrieval, consent selection and size/error handling | `GET/POST /api/attachments`;<br>`GET /api/attachments/{jobId}, download/{id}`;<br>`PATCH/DELETE {id}`;<br>`AttachmentsController` | Job workspace Documents: Upload/drop file, category/purpose/name/AI-use, preview/download/delete confirmation | Binary and metadata owner-scoped; 10 MB/type/storage boundaries; per-file consent controls AI use; archive retention independent from current attachment deletion | [F:attachments](../../../../../job-tracker-ui/src/attachments.test.tsx); [B:AttachmentsController](../../../../../JobTrackerApi.Tests/AttachmentsControllerTests.cs); [B:AttachmentConsistency](../../../../../JobTrackerApi.Tests/AttachmentConsistencyTests.cs)<br>Representative tests with inspected assertions: `attachments metadata controls update purpose and ai usage`; `Controller_requires_local_authorization`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AttachmentsControllerTests 3/3, AttachmentConsistencyTests 14/14. Frontend: attachments.test.tsx 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh attachment/section fixtures retain owned archived/current file relationships and download/delete behavior; owner-negative backend cases pass. Initial attachment-focus race/human and all MIME/device combinations remain open. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Archive gate is locally satisfied for recorded native fixtures; physical drag/drop, broad rename/download/manual AT and production storage behavior remain unverified.<br>Workspace/storage owner; H — audit upload/category/name/consent/preview/download/delete and physical drop with live/frozen identity. | **PARTIAL** | **PARTIAL** |
| **PRES-W09** — Interview questions/categories, manual items, answers, ready status, remove, contextual AI review/add-to-prep<br>Original contract: `InterviewPrep`, `applicationWorkspace`; generated facts/answers require review | `GET/POST/PATCH/DELETE /api/jobapplications/{id}/interview-prep`;<br>`POST {id}/ai/generate`;<br>`InterviewPrepController + AiWorkspaceController` | Job workspace Interview: add question/category/answer, ready toggle/remove; AI generate/review/Add to prep | Owned prep items only explicitly accepted from AI history; generated facts/answers must not become truth automatically; source context/refresh and consent retained | [F:interview-prep](../../../../../job-tracker-ui/src/interview-prep.test.tsx); [B:InterviewPrepPersistence](../../../../../JobTrackerApi.Tests/InterviewPrepPersistenceTests.cs); [B:InterviewAiContext](../../../../../JobTrackerApi.Tests/InterviewAiContextTests.cs)<br>Representative tests with inspected assertions: `prep renders grouped items with progress and marks AI-sourced ones`; `GetInterviewPrep_persists_and_reuses_the_generated_note`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: InterviewPrepPersistenceTests 3/3, InterviewAiContextTests 8/8. Frontend: interview-prep.test.tsx 13/13.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh interview manual question/preparation/context section fixtures pass; deterministic grounded AI cases only. Actual provider quality and every question/answer manipulation not newly certified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Real-model quality, physical mobile keyboard/populated reload and manual AT remain open; prep does not establish scheduled interview data.<br>Workspace/AI owner; H — audit populated mobile keyboard/reload/manual removal and explicit AI review; no scheduled-interview inference. | **PARTIAL** | **PARTIAL** |
| **PRES-W10** — Interview debrief template and follow-up content/date, readiness and next-action state<br>Original contract: `InterviewPrep`; neutral prompts must not seed invented company/achievement facts | `GET/PUT /api/jobapplications/{id}/follow-up`;<br>`GET {id}/followup-draft, readiness`;<br>`InterviewPrepController + JobApplicationsController` | Job workspace Interview Debrief template/answer and follow-up edit/date; Overview next-action opens Timeline correspondence | Neutral template, no invented achievements; own follow-up content/date writes; old send-followup gone, real delivery belongs to Mail; followMode only metadata | [F:interview-prep](../../../../../job-tracker-ui/src/interview-prep.test.tsx); [B:JobApplicationsFollowUpDraft](../../../../../JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs); [B:InterviewPrep](../../../../../JobTrackerApi.Tests/InterviewPrepTests.cs)<br>Representative tests with inspected assertions: `starts a structured interview debrief without inventing answers`; `Follow_up_draft_uses_imported_thread_and_saved_package_context`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobApplicationsFollowUpDraftTests 2/2, InterviewPrepTests 11/11. Frontend: interview-prep.test.tsx 13/13.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh interview/debrief/next-action and section query fixtures pass named state; followMode retains compatibility metadata only. Mode-specific follow-up compose UI remains approved later-mail deferral. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Timezone/reload chains and provider delivery remain unverified; followMode-specific compose UI is deferred rather than implemented.<br>Workspace/mail/calendar owner; H — audit debrief/date/reload and metadata links; defer mode-specific compose UI under recorded decision. | **PARTIAL** | **PARTIAL** |
| **PRES-W11** — Follow-up/reminder workflow, rule-driven dates/stages, notifications, deadline/follow-up ICS and Google/Outlook calendar event actions<br>Original contract: `RemindersView`, `RulesSettingsCard`, `ApplicationCalendarActions`; calendar integration already exists, date-only/timestamp semantics must survive | `GET /api/jobapplications/reminders`;<br>`GET/PUT /api/rules`;<br>`PATCH {id}/followup`;<br>`GET /api/calendar/status, jobs/{id}/events.ics`;<br>`POST jobs/{id}/events`;<br>`ApplicationCalendarController` | Reminders /reminders opens job/follow-up; Settings Follow-ups; job calendar menu Download ICS/Add Google/Outlook | Owned reminder/date writes; rules do not ghost prospects; date-only all-day vs timestamp preserved; provider connection does not imply writable calendar consent | [F:daily-control-loop](../../../../../job-tracker-ui/src/daily-control-loop.test.tsx); [F:application-calendar](../../../../../job-tracker-ui/src/application-calendar.test.tsx); [B:ApplicationCalendarController](../../../../../JobTrackerApi.Tests/ApplicationCalendarControllerTests.cs); [B:RulesEngineProspect](../../../../../JobTrackerApi.Tests/RulesEngineProspectTests.cs)<br>Representative tests with inspected assertions: `dashboard attention card opens follow-up workspace`; `adds the selected application date to a writable connected calendar`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: ApplicationCalendarControllerTests 4/4, RulesEngineProspectTests 5/5. Frontend: daily-control-loop.test.tsx 4/4, application-calendar.test.tsx 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh reminders route/read, calendar/rule/date/export backend/component fixtures pass; native Rules draft loss is recorded under S03. External calendar operations and actual scheduled delivery remain NOT VERIFIED. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | F21 DST/date-only/provider timezone gap, actual Google/Outlook events, scheduler delivery and historical unconfirmed rules-save 500 remain open.<br>Calendar/API owner; H — investigate F21 DST/date-only semantics before event changes; audit real ICS/rules/reminder and approved provider writes. | **PARTIAL** | **PARTIAL** |
| **PRES-W12** — Async operation progress, pending/failed/retry/cancel states and associated notifications<br>Original contract: `OperationsPage`, profile processing components; preserve operation IDs and server state, avoid duplicate starts on rerender | `GET /api/operations, {id}`;<br>`POST {id}/retry, cancel`;<br>`GET /api/notifications`;<br>`OperationsController + UserOperationStore` | Account/utility Operations /operations: inspect pending/failure, Retry/Cancel; bell opens linked operation | Persistent owner operation IDs, explicit retry/cancel and notification read/dismiss; idempotent producer/worker claims; rerender is not duplicate generation authorization | [F:operations-page](../../../../../job-tracker-ui/src/operations-page.test.tsx); [F:profile-page](../../../../../job-tracker-ui/src/profile-page.test.tsx); [B:OperationsController](../../../../../JobTrackerApi.Tests/OperationsControllerTests.cs); [B:UserOperationStore](../../../../../JobTrackerApi.Tests/UserOperationStoreTests.cs)<br>Representative tests with inspected assertions: `profile page loads persisted structured cv and can re-parse it`; `shows persistent operation and notification states with accessible actions`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: OperationsControllerTests 3/3, UserOperationStoreTests 10/10. Frontend: profile-page.test.tsx 15/15, operations-page.test.tsx 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** All-role Operations route/native GET and named dispatcher/operation cancellation/retry suites pass. No production worker/provider execution launched; full async delivery remains unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Long disconnect/reconnect and F20 enabled worker fault containment remain operational gaps; no live job/worker recovery was certified.<br>Operations/worker owner; H — audit disconnect/reconnect/late-result/no-duplicate starts/cancel/retry; F20 recovery before enabling producers. | **PARTIAL** | **PARTIAL** |
| **PRES-C01** — Canonical structured career profile: personal details, summary, skills, work, education, languages, interests and long-tail/custom sections<br>Original contract: `CareerProfilePage`, `views/career/*`; profile save is an account singleton, CV is an identified derived resource | `GET/PUT /api/career/profile`;<br>`CareerProfileController + CareerProfileService` | Career /career section Profile: structured personal/summary/work/education/skills/languages/interests/custom fields Save | Canonical account singleton write with version history; CV identified lens separate; no selected-CV override may replace canonical source | [F:profile-page](../../../../../job-tracker-ui/src/profile-page.test.tsx); [B:CareerProfileController](../../../../../JobTrackerApi.Tests/CareerProfileControllerTests.cs); [B:CareerProfileService](../../../../../JobTrackerApi.Tests/CareerProfileServiceTests.cs)<br>Representative tests with inspected assertions: `profile page loads persisted structured cv and can re-parse it`; `Put_then_get_round_trips_the_profile_and_updates_the_projection`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CareerProfileControllerTests 6/6, CareerProfileServiceTests 21/21. Frontend: profile-page.test.tsx 15/15.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh source-scope/preservation native fixtures prove canonical source versus selected/sibling CV isolation and readback; no complete all-entry canonical CRUD/import journey. Named backend/component cases pass. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Full long-tail Career/mobile save and canonical concurrent updates remain separate; scoped CV acceptance never implies canonical-profile revision safety.<br>Career/API owner; H — audit every long-tail/custom field and mobile save/source isolation; canonical concurrent saves remain separate. | **PARTIAL** | **PARTIAL** |
| **PRES-C02** — Profile overview, completeness/import guidance, manual edit, copy raw CV text, avatar and version history/restore<br>Original contract: `CareerWorkspacePage`, `CareerProfilePage`; preserve projection/history behavior without redesigning schema | `GET /api/career/profile/completeness, versions`;<br>`POST versions/{version}/restore`;<br>`GET /api/profile-cv/runs`;<br>`CareerProfileController` | Career /career overview/profile: completeness/import guidance, edit, raw-text copy/avatar, History Restore | Projection read and explicit profile restore writes a canonical version; account avatar identity remains separate; source history not CV settings history | [F:career-workspace-page](../../../../../job-tracker-ui/src/career-workspace-page.test.tsx); [F:profile-page](../../../../../job-tracker-ui/src/profile-page.test.tsx); [B:CareerProfileService](../../../../../JobTrackerApi.Tests/CareerProfileServiceTests.cs)<br>Representative tests with inspected assertions: `/career shows the profile completeness overview`; `SaveVersionAsync_assigns_stable_ids_to_items_missing_one`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CareerProfileServiceTests 21/21. Frontend: profile-page.test.tsx 15/15, career-workspace-page.test.tsx 7/7.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh current Career route/read and revision/profile named suites pass; complete native canonical-history restore/avatar/raw-copy long-tail remains outstanding. No new profile-snapshot semantics invented. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Clipboard/avatar and complete native profile historical restore/manual AT remain unverified; real extraction quality is separate.<br>Career owner; M — audit raw copy, overview/completeness/import guidance and full historical restore without silent data replacement. | **PARTIAL** | **PARTIAL** |
| **PRES-C03** — CV/file upload and extraction, rebuild/improve/reprocess, progress/history, diff, explicit low-confidence selection, accept/discard, retry/cancel<br>Original contract: `CareerProfilePage`, `/profile-cv/*`; uploaded proposal is not silently canonical truth | `POST /api/profile-cv/upload, rebuild, improve, reprocess`;<br>`GET runs, runs/{id}/diff`;<br>`POST runs/{id}/accept, discard`;<br>`ProfileCvController + operation store` | Career /career Profile Import/upload/history/diff: select low-confidence changes, Accept/Discard, Retry/Cancel | Owned extracted proposal not silently canonical; explicit accept only selected content; file artifacts/progress/failed operations require retention and recovery | [F:profile-page](../../../../../job-tracker-ui/src/profile-page.test.tsx); [B:ProfileCvController](../../../../../JobTrackerApi.Tests/ProfileCvControllerTests.cs); [B:CvProfileDiffService](../../../../../JobTrackerApi.Tests/CvProfileDiffServiceTests.cs)<br>Representative tests with inspected assertions: `pending CV extraction can be reviewed and applied`; `Upload_rejects_unsupported_extension`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: ProfileCvControllerTests 32/32, CvProfileDiffServiceTests 11/11. Frontend: profile-page.test.tsx 15/15.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh deterministic extraction/review/progress/selection regression suites pass. Actual external extraction/provider/cancellation delivery and all formats/low-confidence combinations remain unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Unusual/scanned/OCR document quality and full low-confidence deselection/discard browser acceptance remain unverified; no provider certification.<br>Career/extraction owner; H — audit low-confidence deselect/discard/retry/cancel and corpus quality; approve provider calls separately. | **PARTIAL** | **PARTIAL** |
| **PRES-C04** — Evidence bank: sourced statement/title/category/tags, add/list/delete and truthfulness guidance<br>Original contract: `CareerEvidenceBank`; evidence belongs to profile owner and is not AI-invented experience | `GET/POST/PUT/DELETE /api/career/evidence`;<br>`CareerEvidenceController` | Career /career Evidence: add sourced title/statement/category/tags, list/delete | Own user-approved evidence with provenance; statements cannot become invented employment; deletion explicit and tenant-bound | [F:career-evidence](../../../../../job-tracker-ui/src/career-evidence.test.tsx); [B:CareerEvidenceController](../../../../../JobTrackerApi.Tests/CareerEvidenceControllerTests.cs)<br>Representative tests with inspected assertions: `saves factual evidence with provenance and tags`; `Evidence_is_user_approved_tenant_scoped_and_deletable`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CareerEvidenceControllerTests 1/1. Frontend: career-evidence.test.tsx 1/1.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh evidence-bank CRUD/owner backend/component cases pass; no native full add/tag/delete route traversal added. Evidence-source factual review remains a human obligation. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Full delete/many-item search/keyboard browser acceptance remains open; broader Career page work stays Phase 7.<br>Career owner; M — audit evidence source/category/tags/delete and large-list keyboard/source navigation. | **PARTIAL** | **PARTIAL** |
| **PRES-C05** — CV library create/name/copy/delete, template gallery and real sample thumbnails, publish/unpublish/share and PDF download<br>Original contract: `CvBuilderPage`, `cvBuilder`; separate public slug from numeric private ID | `GET/POST/PUT/DELETE /api/cv/variants`;<br>`POST {id}/duplicate`;<br>`PUT {id}/public`;<br>`themes/preview`;<br>`CvVariantController` | CV library /career/builder: Create/name/copy/delete, template card real sample, Publish/Unpublish/Share/PDF; open /:id | Owned private numeric IDs distinct from public slug; publish explicit; copying preserves selected settings; deleting/unpublishing removes public reach as documented | [F:cv-builder-page](../../../../../job-tracker-ui/src/cv-builder-page.test.tsx); [F:cv-template-thumbnail](../../../../../job-tracker-ui/src/cv-template-thumbnail.test.tsx); [B:CvBuilder](../../../../../JobTrackerApi.Tests/CvBuilderTests.cs); [B:PublicCvController](../../../../../JobTrackerApi.Tests/PublicCvControllerTests.cs)<br>Representative tests with inspected assertions: `Create_then_save_increments_version_and_keeps_history`; `shows the empty state and creates a CV then navigates to the editor`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CvBuilderTests 35/35, PublicCvControllerTests 3/3. Frontend: cv-builder-page.test.tsx 6/6, cv-template-thumbnail.test.tsx 1/1.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh smoke API setup publishes synthetic public CV and downloads anonymous HTML/PDF; editor-frame UI revoke and library/template fixtures pass. This is not full UI creation/publication lifecycle or deployed rendering proof. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Complete publish/unpublish/old-link revocation chain and every library/template combination remain unverified; library redesign is not claimed.<br>CV owner; H — audit create/copy/delete/gallery/share/publish/unpublish and old-public-link revocation; keep numeric/slug identity distinct. | **PARTIAL** | **PARTIAL** |
| **PRES-C06** — Studio Template/Content/Customize/AI Tools/History navigation; debounced preview, page boundaries/automatic fit and save state<br>Original contract: `CvBuilderEditor`; existing mobile edit/preview and desktop split must retain parity; automatic fit is not a manual zoom control | `GET /api/cv/variants/{id}, preview`;<br>`POST /api/cv/preview`;<br>`PUT variants/{id}`;<br>`CvVariantController` | Identified studio /career/builder/:id Template/Content/Customize/AI Tools/History; mobile Edit/Preview and Fit/Return | Debounced read preview and queued explicit/autosave owner revision write; white document page/count separate from application theme; fit not manual zoom | [F:cv-builder-deep-link](../../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:CvBuilder](../../../../../JobTrackerApi.Tests/CvBuilderTests.cs)<br>Representative tests with inspected assertions: `Section_presentation_is_normalized_and_shared_by_preview_and_pdf_renderer`; `pane navigation focuses the existing preview without changing the pending draft`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CvBuilderTests 35/35. Frontend: cv-builder-deep-link.test.tsx 41/41.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh CV frame/responsive/preview native fixtures verify five tabs, save/history access, mode switching, region names, fit/page indicators and retention; measured16/16 standard fidelity. Human/device/production-font acceptance open. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | P5-14 now supplies the integrated held-PUT pane/viewport, preview boundary-key/scroll, reachable return, canvas and hit-test successor. Physical touch/software keyboard, 200%/400% zoom, human AT, broader wrapped/short-height states and production rendering remain unaccepted.<br>CV/accessibility owner; H — retain P5-14 held-PUT/responsive/scroll checks; obtain physical touch/software keyboard/zoom/manual AT evidence. | **PARTIAL** | **PARTIAL** |
| **PRES-C07** — Built-in item visibility/order, custom sections, preset/free-text section catalog, item/content overrides, hide/remove, native section drag and keyboard reorder<br>Original contract: `CvBuilderEditor`, `components/cv/*`, `useDragReorder`; selected profile source and overrides remain distinguishable | `PUT /api/cv/variants/{id}`;<br>`GET /api/cv/outline`;<br>`CvVariantController + CvVariantService` | Studio Content: show/hide/remove, source/reset override, custom preset/free-text section, move up/down/native drag | Selected CV settings/override writes retain stable source/item IDs; omitted differs from deleted canonical; custom section ownership and nested/foreign drop boundaries retained | [F:cv-builder-deep-link](../../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [F:cvBuilder](../../../../../job-tracker-ui/src/cvBuilder.test.ts); [B:CvBuilder](../../../../../JobTrackerApi.Tests/CvBuilderTests.cs)<br>Representative tests with inspected assertions: `Resolver_applies_item_override_bullets_without_touching_the_master`; `[P5-10 PRES-C07 C10] resetting one entry field preserves omission, sibling override and order and supports undo`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CvBuilderTests 35/35. Frontend: cv-builder-deep-link.test.tsx 41/41, cvBuilder.test.ts 13/13.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh source-scope/responsive native fixtures verify override/reset/omission/CV-only entry, section order/reorder alternatives and canonical isolation; native browser pointer automation is not physical-touch acceptance. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | P5-14 closes P5-10-O01 only for tested ownership/default-drop cases: entry/section order, inactive nested lists and foreign editable-title non-mutation. Physical touch/text selection/all-browser gestures and exhaustive saved override/reset combinations remain unqualified.<br>CV/accessibility owner; H — retain tested native nested ownership/default-drop checks; audit physical touch/text selection/all-browser overrides before broader claim. | **PARTIAL** | **PARTIAL** |
| **PRES-C08** — Template-capability-aware typography/colors/header/headings, skills presentation/groups, one/two-column and sidebar settings, photo/icons<br>Original contract: `CvCustomizeTab`, theme registry; retain unsupported-setting handling and server render equivalence | `GET /api/cv/themes`;<br>`PUT /api/cv/variants/{id}`;<br>`CvVariantController + theme renderer registry` | Studio Template/Customize Style: typography/color/header/headings/skills/groups/columns/sidebar/photo/icons | Capability-aware setting writes; unsupported controls/default reset do not erase unrelated dormant values; server renderer authoritative, theme toggle must not change document palette | [F:cv-builder-deep-link](../../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [F:cvBuilder](../../../../../job-tracker-ui/src/cvBuilder.test.ts); [B:CvBuilder](../../../../../JobTrackerApi.Tests/CvBuilderTests.cs)<br>Representative tests with inspected assertions: `Resolver_defaults_include_every_populated_section`; `choosing a template restores its own structure instead of inheriting the previous template layout`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CvBuilderTests 35/35. Frontend: cv-builder-deep-link.test.tsx 41/41, cvBuilder.test.ts 13/13.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh template/style controls and8 native settings exports pass; representative capabilities/IDs/colors/fonts retained. Production font/photo and every template/capability combination remain unqualified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | All-template/font/photo/wrapped-line/browser/control combinations and broad custom-colour/manual AT remain unverified; finite capability matrix and Pro locks are not exhaustive.<br>CV/renderer owner; M — audit capability controls/locks and broader font/photo/wrapped text; manual custom-colour names and contrast. | **PARTIAL** | **PARTIAL** |
| **PRES-C09** — A4/Letter, density, margins/spacing, date format, document language, per-section rows/grid/compact/bubbles and columns<br>Original contract: `cvBuilder`, `CvCustomizeTab`, content controls; do not drop advanced controls merely to simplify layout | `PUT /api/cv/variants/{id}`;<br>`POST variants/{id}/export-pdf`;<br>`CvVariantController` | Studio Customize Layout/Advanced: A4/Letter/density/margin/spacing/date/language/rows/grid/compact/bubbles/columns | Validated document settings owner revision write; retained advanced fields/render semantics; locale of controls distinct from document language; geometry oracles unchanged | [F:cvBuilder](../../../../../job-tracker-ui/src/cvBuilder.test.ts); [F:cv-builder-deep-link](../../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:CvBuilder](../../../../../JobTrackerApi.Tests/CvBuilderTests.cs)<br>Representative tests with inspected assertions: `Variant_settings_reject_css_injection_in_visual_overrides`; `editor sections, design controls and document settings render in Bokmål`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CvBuilderTests 35/35. Frontend: cv-builder-deep-link.test.tsx 41/41, cvBuilder.test.ts 13/13.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh settings/Layout control before/after exports yield24 preview=24PDF pages; standard36=36 also passes unchanged tolerances. Actual wider zoom/reflow and arbitrary settings combinations remain unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Recorded unchanged-tolerance local fidelity supersedes prior six-fixture failures; all advanced combinations, deployment fonts/photo/wrapped text and manual print inspection remain open.<br>CV/renderer owner; H — retain unchanged numerical oracle/settings exports; audit advanced locale/layout combinations and actual deployed print/fonts. | **PARTIAL** | **PARTIAL** |
| **PRES-C10** — Undo/redo of editor settings, save queue, unsaved guard, history/version restore and preview lifecycle<br>Original contract: `CvBuilderEditor`; current queue serializes one mounted editor only, not concurrent browsers | `PUT /api/cv/variants/{id}`;<br>`GET versions`;<br>`POST versions/{version}/restore`;<br>`CvVariantController + CvVariantService` | Studio Undo/Redo, save status/retry/recovery; History select Restore; dirty navigation Keep editing/Discard | Undo local settings vs reset live-source override vs persisted history lens distinct; expected revision blocks lost update; queue serializes mounted editor, not all browsers | [F:cv-builder-deep-link](../../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:CvBuilder](../../../../../JobTrackerApi.Tests/CvBuilderTests.cs)<br>Representative tests with inspected assertions: `Resolver_defaults_include_every_populated_section`; `revision conflict retains the draft and blocks later autosaves until explicit reload`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CvBuilderTests 35/35. Frontend: cv-builder-deep-link.test.tsx 41/41.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh five backend revision safety cases plus browser dirty/conflict/recovery/history access and undo/redo fixtures pass; generated/unaccepted AI history protections deterministic. No all multi-device race certification. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | CV stale-write/history safety has scoped native evidence; long offline/history combinations and profile/job concurrent edits remain separate. No new save owner or history store.<br>CV/API owner; H — audit long offline/history/conflict/undo/dirty transitions; retain downloadable draft and one save/history owner. | **PARTIAL** | **PARTIAL** |
| **PRES-C11** — Per-section AI improve/translate/custom instruction and whole-document translate/improve/spelling review<br>Original contract: `AiSectionAssistant`, builder AI tab; source/target language, current/suggestion comparison, apply/reject | `POST /api/cv/ai/assist, variants/{id}/ai/apply`;<br>`CvVariantController + optional CvAiSuggestionService` | Studio AI Tools and per-section assistant: improve/translate/custom/spelling, compare, Apply/Reject | Pro entitlement, owner/revision/proposal binding and explicit apply; Production service withheld 503 cv_ai_unavailable; qualification/review UI obligation deferred, not fulfilled by safety tests | [F:ai-section-assistant](../../../../../job-tracker-ui/src/ai-section-assistant.test.tsx); [F:cv-builder-deep-link](../../../../../job-tracker-ui/src/cv-builder-deep-link.test.tsx); [B:AiWorkspace](../../../../../JobTrackerApi.Tests/AiWorkspaceTests.cs); [B:AiPrivacyPolicy](../../../../../JobTrackerApi.Tests/AiPrivacyPolicyTests.cs) ; [Production no-write checks](../../../../../JobTrackerApi.Tests/CvAiReadinessTests.cs), [isolated HTTP contract](../../../../../job-tracker-ui/ai-tests/cv-ai-readiness.spec.ts)<br>Representative tests with inspected assertions: `[PRES-C11 PRES-C07] whole-document AI %s changes only an explicitly accepted CV override`; `section AI uses the CV document language and requires explicit server acceptance`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AiWorkspaceTests 9/9, AiPrivacyPolicyTests 9/9, CvAiReadinessTests 29/29. Frontend: cv-builder-deep-link.test.tsx 41/41, ai-section-assistant.test.tsx 14/14.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Approved P5-13 deferral:0/366 configured-model calls,0 human reviews, UI unimplemented. Fresh108 deterministic AI and realHTTP2 prove Production503 before provider/write and unrelated AI fixture availability only. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Full CV rewriting/review remains DEFERRED — BLOCKED / NOT QUALIFIED: deployed model identity unverified; frozen 32-case/366-call qualification has 0 completed calls and 0 human reviews; factuality unmeasured; P5-13 review UI unimplemented. Current Production guard returns 503 cv_ai_unavailable; safe withholding is an exception, not successful generation/review. Existing assistant affordances can report unavailable.<br>AI/CV/product owner; H — meet frozen model identity/corpus/rubric/human review and review-UI return conditions; retain Production 503/no-write/unrelated-AI checks. | **DEFERRED** | **DEFERRED** |
| **PRES-C12** — Authenticated PDF export and anonymous published-CV preview/PDF; long searchable multipage documents<br>Original contract: `PublicCvPage`, `cvBuilder`, server renderer; B03 shared resource admission and public ownership/publication checks | `POST /api/cv/variants/{id}/export-pdf`;<br>`GET /api/public-cv/{slug}, {slug}/pdf`;<br>`CvVariantController + PublicCvController + PdfRenderAdmission` | Private studio/library PDF; Share public /cv/:slug anonymous page and PDF download | Private owner check; anonymous only published slug; revoke/unknown slug denies render; shared owner/global admission prevents overlaunch; long searchable pages require native output proof | [F:public-cv-page](../../../../../job-tracker-ui/src/public-cv-page.test.tsx); [B:PublicCvController](../../../../../JobTrackerApi.Tests/PublicCvControllerTests.cs); [B:PdfRenderAdmission](../../../../../JobTrackerApi.Tests/PdfRenderAdmissionTests.cs)<br>Representative tests with inspected assertions: `Pdf_download_is_rate_limited`; `public CV exposes the rendered CV and PDF download`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: PublicCvControllerTests 3/3, PdfRenderAdmissionTests 22/22. Frontend: public-cv-page.test.tsx 1/1.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh16 standard and8 settings native preview/PDF exports pass exact page membership and unchanged metrics; browser public/download and native frozen attachment proof pass. Production fonts/photos/storage/render deployment unverified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | P5-14 retains unchanged 16-fixture/36-page native preview/PDF and 8-settings/24-page export historical proof at unchanged tolerances. This is finite local evidence; deployed Chromium/Linux/fonts/photo/all-print-engine and manual print inspection remain unverified.<br>CV/rendering/release owner; H — audit public revoke/private denial/PDF busy recovery and deployed Linux/fonts/photos/manual print; preserve admission. | **PARTIAL** | **PARTIAL** |
| **PRES-M01** — Job-scoped manual note/email log, search, delete, paste/import message; current job/company context<br>Original contract: `Correspondence`; manual record is different from sending a real email | `GET/POST /api/correspondence`;<br>`GET {jobId}, message/{id}, page`;<br>`DELETE {id}`;<br>`CorrespondenceController` | Job workspace Timeline Correspondence: log note/email, contextual search, paste/import, delete | Owner/job-bound manual records and search; recording is not delivery; imported text/context cannot bypass owned job relationship | [F:end-to-end-trust-loop](../../../../../job-tracker-ui/src/end-to-end-trust-loop.test.tsx); [F:correspondence-search-context](../../../../../job-tracker-ui/src/correspondence-search-context.test.ts); [B:CorrespondenceController](../../../../../JobTrackerApi.Tests/CorrespondenceControllerTests.cs)<br>Representative tests with inspected assertions: `overview entry opens the canonical communication workspace without sending mail`; `builds contextual suggestions for the shared application correspondence view`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: CorrespondenceControllerTests 3/3. Frontend: end-to-end-trust-loop.test.tsx 1/1, correspondence-search-context.test.ts 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh timeline/correspondence section fixture and native inbox GET pass; full mail filters/open/reply/send/provider lifecycle not traversed. Named backend/component cases prove their finite contracts. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Full manual edit/delete/paste-import browser combinations and manual AT remain unverified; logging correspondence is not sending mail.<br>Mail/workspace owner; H — audit native log CRUD/search/paste import and no-send distinction. | **PARTIAL** | **PARTIAL** |
| **PRES-M02** — Gmail candidate search/import, linked-thread refresh/sync history, import thread, unlink/relink/move with job selection<br>Original contract: `Correspondence`; cross-job relationship changes remain owner-bound | `GET /api/gmail/job-candidates, messages`;<br>`POST import, import-thread, refresh-linked-threads, manual-sync, unlink-thread, relink-thread`;<br>`GmailController` | Job Timeline Correspondence Gmail tools: candidate/import/thread/refresh, unlink/relink/move owned job picker | Owner provider grant + job/thread/message links; move cannot cross tenant; provider absence/error distinct from no correspondence; sync is external and remains sandbox-unverified | [F:correspondence-gmail-import](../../../../../job-tracker-ui/src/correspondence-gmail-import.test.tsx); [B:GmailController](../../../../../JobTrackerApi.Tests/GmailControllerTests.cs); [B:EmailOwnershipIntegration](../../../../../JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs)<br>Inherited EmailOwnershipIntegration anchor is an identity-token suite and is excluded from this mail group’s fresh coverage.<br>Representative tests with inspected assertions: `automatically refreshes already-linked Gmail threads without manual re-import`; `Import_thread_rejects_missing_message_ids`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: GmailControllerTests 19/19. Frontend: correspondence-gmail-import.test.tsx 6/6.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh named draft/correspondence owner and conflict tests pass; no real delivery/provider integration executed. Identity email-token tests are excluded from mailbox ownership evidence. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Live provider threads, multi-account reconnect/revoked grants and sync failures remain unverified.<br>Mail/provider owner; H — audit owned thread/job link/move/unlink/reconnect and approved live sync failures. | **PARTIAL** | **PARTIAL** |
| **PRES-M03** — Global correspondence inbox with pagination/search/filter/direction/provider/link state, full message and attachment information, source-job links<br>Original contract: `CorrespondenceInboxPage`; provider read failure distinct from no messages | `GET /api/correspondence/page, message/{id}`;<br>`GET /api/email/providers, messages, thread, message`;<br>`EmailController + CorrespondenceController` | Secondary Correspondence /correspondence: search/filter/page/provider/direction/link; open message and source-job link | Owned saved inbox can display while provider unavailable; fetched plain text avoids provider HTML injection; large mailbox/binary attachment delivery not proven by mock detail | [F:correspondence-inbox-page](../../../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx); [B:EmailController](../../../../../JobTrackerApi.Tests/EmailControllerTests.cs); [B:EmailOwnershipIntegration](../../../../../JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs)<br>Inherited EmailOwnershipIntegration anchor is an identity-token suite and is excluded from this mail group’s fresh coverage.<br>Representative tests with inspected assertions: `keeps saved correspondence visible when provider status is unavailable`; `Provider_status_is_owner_scoped_and_does_not_claim_send_support`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: EmailControllerTests 3/3. Frontend: correspondence-inbox-page.test.tsx 16/16.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh named provider/correspondence ownership tests pass; no external binary mailbox sync or live reconnect exercised. Identity email confirmation tests contribute no mailbox isolation proof. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Real large-mailbox/attachment-binary flows and complete native inbox/AT acceptance remain open; global inbox redesign stays Phase 7.<br>Mail owner; H — audit large native inbox paging/provider failure/detail/attachment binaries and manual AT. | **PARTIAL** | **PARTIAL** |
| **PRES-M04** — Compose/reply, choose connected provider and job/recipient, save/resume/delete drafts, review/confirm send, delivery states and explicit new attempt<br>Original contract: `CorrespondenceInboxPage`; persisted draft revision and send idempotency/uncertain delivery controls must survive navigation changes | `GET/POST/PUT/DELETE /api/email/drafts`;<br>`POST {id}/new-attempt`;<br>`POST /api/email/send`;<br>`EmailDraftsController + EmailController` | Correspondence /correspondence Compose or message Reply; select provider/job/recipient, Save/Resume/Delete, review final Send | Owned draft revision + ClientRequestId/send identity; explicit send confirmation; uncertain delivery never auto-retried; definitive failure permits explicit new attempt only; followMode compose UI deferred | [F:correspondence-inbox-page](../../../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx); [B:EmailDraftsController](../../../../../JobTrackerApi.Tests/EmailDraftsControllerTests.cs); [B:EmailDraftPersistence](../../../../../JobTrackerApi.Tests/EmailDraftPersistenceTests.cs)<br>Representative tests with inspected assertions: `resumes a saved draft and surfaces revision conflicts without overwriting it`; `Revision_conflicts_prevent_lost_updates_and_cross_tenant_deletes`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: EmailDraftsControllerTests 5/5, EmailDraftPersistenceTests 1/1. Frontend: correspondence-inbox-page.test.tsx 16/16.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh named inbox/draft/send conflict and section entry fixtures pass finite semantics; no real send/reconnect or every dirty/uncertain interruption journey. followMode UI remains deferred, no automatic resend. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Actual sandbox mail delivery/reconnect and every dirty/send interruption remain unverified; no automatic uncertain-send retry. followMode-specific UI remains deferred.<br>Mail/API owner; H — audit draft conflicts, explicit send/uncertain-new-attempt, reconnect/dirty interruption; followMode UI deferred, no automatic resend. | **PARTIAL** | **PARTIAL** |
| **PRES-M05** — Gmail review candidates, proposed jobs, link/reject/keep decisions, notes, manual sync and create suggested job<br>Original contract: `GmailReviewPage` embedded in inbox; retain legacy review redirect | `GET /api/gmail/review-candidates, suggested-jobs`;<br>`POST review-decision, manual-sync, create-suggested-job`;<br>`GmailController` | Correspondence Review view /correspondence?view=review; /correspondence/review alias; Link/Reject/Keep/notes/Sync/Create | Reviewed owner decisions; no create on navigation/sync; proposed-job creation explicit and retains connection/thread association; real provider source unknown | [F:gmail-review-page](../../../../../job-tracker-ui/src/gmail-review-page.test.tsx); [F:correspondence-inbox-page](../../../../../job-tracker-ui/src/correspondence-inbox-page.test.tsx); [B:GmailController](../../../../../JobTrackerApi.Tests/GmailControllerTests.cs)<br>Representative tests with inspected assertions: `Save_review_decision_links_thread_and_imports_messages`; `renders correspondence inbox items and reloads with filters`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: GmailControllerTests 19/19. Frontend: correspondence-inbox-page.test.tsx 16/16, gmail-review-page.test.tsx 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** All-role review alias retains destination and intentional Gmail-not-connected409 with named warning; fresh review/component/backend cases pass. Actual provider suggested-job/link/create not exercised. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Real provider review and complete suggested-job creation browser journey remain unverified; no automatic creation from navigation.<br>Mail/capture owner; H — audit review alias, proposed-job/link/reject/keep/notes/sync/create confirmation and owner boundaries. | **PARTIAL** | **PARTIAL** |
| **PRES-M06** — Gmail/Google and Microsoft Graph connection/status/disconnect, IMAP connection/status/disconnect<br>Original contract: `EmailProviderConnections`, `ConnectedAccountsPage`; login identity and mail-provider identity are separate capabilities | `GET /api/gmail/status, connect-url`;<br>`DELETE connection`;<br>`/api/microsoft-graph equivalents`;<br>`GET /api/imap/status`;<br>`POST connect`;<br>`DELETE connection`;<br>`provider controllers` | Settings Manage connected accounts /settings/connected-accounts; Google/Outlook Connect/Disconnect; IMAP host/user/password connection | Owner provider authorization independent from sign-in link; IMAP SSRF/ciphertext credential handling; actual token revocation/expiry/reconnect remains external evidence | [F:email-provider-connections](../../../../../job-tracker-ui/src/email-provider-connections.test.tsx); [B:MicrosoftGraphController](../../../../../JobTrackerApi.Tests/MicrosoftGraphControllerTests.cs); [B:ImapController](../../../../../JobTrackerApi.Tests/ImapControllerTests.cs)<br>Representative tests with inspected assertions: `renders connection controls in Norwegian Bokmål`; `Status_returns_sync_state_fields_for_connected_account`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: MicrosoftGraphControllerTests 7/7, ImapControllerTests 9/9. Frontend: email-provider-connections.test.tsx 3/3.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** All-role connected-account route observes genuine Gmail status; backend/component Graph/IMAP contracts pass. Full live Gmail/Graph/IMAP grant/revoke/expiry and every status not established by census. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Actual provider authorization/revocation/token expiry/reconnect remain unverified; no credentials or live provider operations in this review.<br>Connections/provider owner; H — audit actual grants/revoke/expiry/reconnect and IMAP safety; provider sandbox authorization required. | **PARTIAL** | **PARTIAL** |
| **PRES-S01** — Personal dashboard counts, activity/funnel/company/skill trends, stage/salary insights and actionable next steps<br>Original contract: `DashboardView`, analytics APIs; chart transformations and empty/error states preserved | `GET /api/jobapplications/stats, analytics, analytics-overview, tag-trends`;<br>`JobApplicationAnalyticsController` | Primary Dashboard /dashboard and Analytics /analytics: report period/table/value/insight/action drill-down | Read owned exact population/period/stage/salary metrics; no invented compensation/denominator; error distinct from empty; Dashboard flags do not hide Analytics report families | [F:daily-control-loop](../../../../../job-tracker-ui/src/daily-control-loop.test.tsx); [F:workflow-trust-signals](../../../../../job-tracker-ui/src/workflow-trust-signals.test.tsx); [B:StageAnalytics](../../../../../JobTrackerApi.Tests/StageAnalyticsTests.cs); [B:AnalyticsSalary](../../../../../JobTrackerApi.Tests/AnalyticsSalaryTests.cs)<br>Representative tests with inspected assertions: `Salary_insights_keep_currency_and_period_groups_separate`; `follow-up workflow signals route all overview surfaces to the same follow-up workspace`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AnalyticsSalaryTests 1/1, StageAnalyticsTests 4/4. Frontend: workflow-trust-signals.test.tsx 3/3, daily-control-loop.test.tsx 4/4.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh Dashboard/Analytics browser fixtures validate real recorded cohorts/exact chart alternatives/periods/drill-down and account isolation; four theme/locale pairs. New unsupported metrics remain absent; production timezone/provider/human chart reading not certified. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Scoped native chart/value/population transformations supersede earlier unmapped chart gaps; server timezone/date/population limits and unsupported NEW metrics remain explicit.<br>Reports/API owner; M — audit exact cohort/sample/date definitions and drill-down links; retain unsupported-metric boundaries. | **PARTIAL** | **PARTIAL** |
| **PRES-S02** — Five per-owner local visibility preferences; onboarding progress and dismiss; notification bell/unread/read/dismiss<br>Original contract: `DashboardView`, `OnboardingChecklist`, `NotificationsPopover`; no server widget-order/resize contract exists yet | `GET /api/notifications, unread-count`;<br>`POST {id}/read`;<br>`DELETE {id}`;<br>`OperationsController`;<br>`browser owner-local flags` | Dashboard visibility toggles/onboarding Dismiss; shell bell read/dismiss/open notification | Five local flags owner keyed; no server widget-order/resize/reset contract; notification writes tenant-bound and idempotent; server language save is distinct from local flag persistence | [F:onboarding-checklist](../../../../../job-tracker-ui/src/onboarding-checklist.test.tsx); [F:notifications-popover](../../../../../job-tracker-ui/src/notifications-popover.test.tsx); [B:JobLifecycleEvent](../../../../../JobTrackerApi.Tests/JobLifecycleEventTests.cs)<br>Representative tests with inspected assertions: `uses structured career data and connected inbox status for onboarding progress`; `shows notifications and updates read and dismissed state in place`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: JobLifecycleEventTests 9/9. Frontend: onboarding-checklist.test.tsx 1/1, notifications-popover.test.tsx 6/6.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh Dashboard five owner-local visibility flags/reload/account-switch and shell notification fixtures pass. Three language/notification overlap rounds pass separately; earlier generic language500 remains open, not a Dashboard-toggle failure. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Five owner-local Dashboard visibility flags and scoped reload/account evidence remain; order/resize/reset is deferred. Recorded P5-06-O01 generic language-preference 500 during overlapping Dashboard/setup reads has no established exception/root cause; sequential fixture setup does not close concurrent save reliability.<br>Dashboard/shell/identity owner; H — investigate recorded P5-06-O01 language-save 500 during reads; audit five flags A/B/reload plus bell/onboarding; order/resize/reset deferred. | **PARTIAL** | **PARTIAL** |
| **PRES-S03** — Follow-up/ghosting rule settings, email reminder preference, table preferences, theme/language and connected-account links<br>Original contract: `SettingsView`, `RulesSettingsCard`; preferences have different scopes, do not replace with one unsafely shared object | `GET/PUT /api/rules, notification-settings`;<br>`PUT /api/auth/preferences/language`;<br>`RulesController + NotificationSettingsController + AuthController` | Settings General/Follow-ups/Notifications tabs or mobile section picker; edit/Save rules and reminders, table/theme/language; connections link | Rules/reminder/language server writes vs browser/table preferences have separate scopes; failure must preserve actionable draft; tab unmount discards local RulesSettingsCard draft in current source | [F:settings-view](../../../../../job-tracker-ui/src/settings-view.test.tsx); [F:theme-state](../../../../../job-tracker-ui/src/theme-state.test.tsx); [B:NotificationSettingsController](../../../../../JobTrackerApi.Tests/NotificationSettingsControllerTests.cs); [B:RulesEngineProspect](../../../../../JobTrackerApi.Tests/RulesEngineProspectTests.cs)<br>Representative tests with inspected assertions: `uses one browser preference and falls back to System`; `A_prospect_is_never_followed_up_or_ghosted_however_old`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: RulesEngineProspectTests 5/5, NotificationSettingsControllerTests 3/3. Frontend: theme-state.test.tsx 7/7, settings-view.test.tsx 5/5.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Native Rules diagnostic loses unsaved5 back to14 on tab return; persisted14 and zero writes. **FAIL SETTINGS-01**. Saved rule/readback and three overlapping language/notification saves pass, but historical500 remains open. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | P4-04-O02 recorded SQLite notification saves had 2/10 HTTP 500/database-locked attempts; isolated rules 500 remains unconfirmed. P5-06-O01 language-preference 500 and rule drafts lost on tab unmount stay open; sequential success does not establish concurrency safety.<br>Settings/API/identity owner; H — investigate P4-04-O02 concurrent notification 500 and P5-06-O01 language-save 500; audit rule draft/tab lifecycle, unknown route/preferences. **Confirmed defect:** [register](DEFECTS.md); separate owner repair required. | **PARTIAL** | **FAIL** |
| **PRES-S04** — AI privacy settings, usage/limits, honest Free/Pro lock states, billing status, conditional checkout and portal<br>Original contract: `AiPrivacySettingsCard`, `AiUsageCard`, `AccountPlanProvider`; server entitlement authoritative, not client context defaults | `GET/PUT /api/ai/settings`;<br>`GET /api/ai/usage`;<br>`GET /api/billing/status`;<br>`POST checkout, portal`;<br>`AiSettingsController + AiUsageController + BillingController` | Settings General privacy/usage/plan; Pro locks in domains; Upgrade/Manage only when server billing available | Server entitlement and monthly owner metering authoritative; privacy consent external processing gated; conditional billing is not real checkout proof; C11 Production exception bounded | [F:settings-view](../../../../../job-tracker-ui/src/settings-view.test.tsx); [F:ai-usage-card](../../../../../job-tracker-ui/src/ai-usage-card.test.tsx); [B:AiPrivacyPolicy](../../../../../JobTrackerApi.Tests/AiPrivacyPolicyTests.cs); [B:AiUsageMeter](../../../../../JobTrackerApi.Tests/AiUsageMeterTests.cs)<br>Representative tests with inspected assertions: `External_processing_requires_admin_gate_user_consent_and_pro`; `settings view has no accent picker and uses one follow-up section, one notification section`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AiPrivacyPolicyTests 9/9, AiUsageMeterTests 3/3. Frontend: settings-view.test.tsx 5/5, ai-usage-card.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh entitlement/privacy/usage deterministic suites and realHTTP withholding fixtures pass; existing unrelated AI remains available in fixture. No live checkout/webhook/provider consent or P5-13 semantic qualification. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Actual checkout/webhooks/portal and provider consent/delivery remain unverified. Production CV unavailability is temporary authorized P5-13 debt, not fulfillment or disabling other AI.<br>AI/commerce/API owner; H — retain entitlement/privacy/metering and bounded Production CV exception; separately prove checkout/webhooks/portal before activation. | **PARTIAL** | **PARTIAL** |
| **PRES-S05** — Account export, encrypted backup download, lifecycle status and deliberate deletion confirmation<br>Original contract: `BackupCard`; recent-auth/password/provider restrictions remain; a downloadable backup is not proven restore readiness | `POST /api/export/account, /api/backup/encrypted`;<br>`GET /api/account-lifecycle/status`;<br>`POST delete`;<br>`ExportController + BackupController + AccountLifecycleController` | Settings Backup: readable ZIP/encrypted download; lifecycle/deletion enabled server flag then deliberate confirmation | Recent-auth/password/provider restrictions; complete owner ZIP/redaction distinct from full recoverable restore; account deletion destructive, not run in this audit | [F:account-data-export](../../../../../job-tracker-ui/src/account-data-export.test.tsx); [B:AccountDataExport](../../../../../JobTrackerApi.Tests/AccountDataExportTests.cs); [B:BackupController](../../../../../JobTrackerApi.Tests/BackupControllerTests.cs)<br>Representative tests with inspected assertions: `downloads the readable account ZIP from the protected endpoint`; `Readable_zip_is_complete_checksummed_owner_isolated_and_redacted`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AccountDataExportTests 3/3, BackupControllerTests 3/3. Frontend: account-data-export.test.tsx 4/4.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh account ZIP/encrypted backup/lifecycle backend/component cases pass; native Job-package ZIP proof is distinct. No current production database backup/restore or destructive account lifecycle rehearsal. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Actual database/account restore, verified recoverable backups, paid deletion/provider cancellation and rollback remain production release gates; no destructive rehearsal occurred.<br>Account lifecycle/release owner; H — audit exact confirmations/ZIP/backup gates; current recoverable restore/paid deletion/provider cancellation/rollback require authorized rehearsal. | **PARTIAL** | **PARTIAL** |
| **PRES-A01** — Admin user list/create, role promotion/demotion guards, reset link and delete with last-admin/self warnings<br>Original contract: `AdminUsersPage`, `/users`; API roles enforce privilege regardless of navigation | `GET/POST /api/users`;<br>`PUT {id}/roles`;<br>`DELETE {id}`;<br>`POST {id}/send-password-reset`;<br>`UsersController` | Admin Users /admin/users via role-gated Admin group; create/list/promote/demote/reset/delete confirmations | Admin API authority independent from shell; last-admin guard and self-confirmation, role changes revoke sessions/trusted devices; actual reset email not proved by controller mock | [F:admin-users-page](../../../../../job-tracker-ui/src/admin-users-page.test.tsx); [B:UsersController](../../../../../JobTrackerApi.Tests/UsersControllerTests.cs); [B:ApiAuthorizationPosture](../../../../../JobTrackerApi.Tests/ApiAuthorizationPostureTests.cs)<br>Representative tests with inspected assertions: `warns before demoting another administrator`; `SetRoles_rejects_removing_the_final_administrator`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: UsersControllerTests 7/7, ApiAuthorizationPostureTests 5/5. Frontend: admin-users-page.test.tsx 4/4.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh32-route census normal403/admin200 and account metadata distinction; guarded role/last-admin/self backend suites pass. Full native successful user mutations/reset delivery/role revocation not performed. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Mounted-view role revocation, full mutations and actual reset delivery remain unverified; hidden nav/synthetic shell never proves authorization.<br>Admin/identity owner; H — audit full guarded mutations, mounted-role revoke and real reset; crafted API denial remains mandatory. | **PARTIAL** | **PARTIAL** |
| **PRES-A02** — Admin audit event list/detail, supported undo and job restore<br>Original contract: `AdminAuditPage`; preserve event/ownership semantics rather than generic mutation buttons | `GET /api/admin/audit`;<br>`POST {id}/undo`;<br>`AdminAuditController` | Admin Audit /admin/audit: filters/list/detail, supported Undo/job restore | Admin read/mutation with supported event semantics and restore ownership; unsupported undo unavailable; role posture test alone is not successful undo proof | [F:admin-audit-page](../../../../../job-tracker-ui/src/admin-audit-page.test.tsx); [B:AuthAndSystemController](../../../../../JobTrackerApi.Tests/AuthAndSystemControllerTests.cs); [B:ApiAuthorizationPosture](../../../../../JobTrackerApi.Tests/ApiAuthorizationPostureTests.cs)<br>Inherited AuthAndSystemController anchor has no Audit/Undo assertion and is excluded from this group’s fresh coverage. Authorization posture is reflection evidence only.<br>Representative tests with inspected assertions: `Every_controller_either_requires_authorization_or_is_listed_as_public`; `distinguishes an unavailable audit log from an empty audit log and retries`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: ApiAuthorizationPostureTests 5/5. Frontend: admin-audit-page.test.tsx 2/2.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh normal403/admin200 route/read and named error/retry UI/authorization-posture cases pass. Successful native AuditUndo/job restore remains NOT VERIFIED; no false attribution of38 auth/system tests. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Complete successful native undo/job restore browser acceptance remains open; role posture is not undo behavior proof.<br>Admin/API owner; H — audit persisted successful undo/job restore, unsupported actions and non-admin denial. | **PARTIAL** | **PARTIAL** |
| **PRES-A03** — Separate system health/build/database/AI/email status, SMTP settings/test, AI probe, CV corpus benchmark and maintenance run controls<br>Original contract: `AdminSystemPage`; sensitive config values/logs must not move into personal dashboard | `GET /api/admin/system, email-settings, cv-benchmark, maintenance-jobs`;<br>`PUT email-settings`;<br>`POST ai/probe, maintenance-jobs/{jobId}/runs`;<br>`POST /api/users/send-test-email`;<br>`AdminSystemController` | Admin System /admin/system status/build/database/AI/mail; SMTP Settings/Test, probe, benchmark/maintenance control | Admin-only sensitive reads/writes; secret redaction and allowlisted dispatch; actual production SMTP/model/probe/maintenance external operations not performed | [F:admin-system-page](../../../../../job-tracker-ui/src/admin-system-page.test.tsx); [B:AuthAndSystemController](../../../../../JobTrackerApi.Tests/AuthAndSystemControllerTests.cs); [B:MaintenanceJobDispatcher](../../../../../JobTrackerApi.Tests/MaintenanceJobDispatcherTests.cs)<br>Representative tests with inspected assertions: `Login_locks_account_after_five_failed_attempts_and_rejects_sixth_even_with_correct_password`; `loads and saves smtp settings from the settings tab`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.<br>**Fresh execution:** Backend: AuthAndSystemControllerTests 38/38, MaintenanceJobDispatcherTests 3/3. Frontend: admin-system-page.test.tsx 4/4.<br>All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Fresh normal403/admin200 system route/read and named SMTP/allowlisted dispatcher tests pass. No live SMTP/probe/model/maintenance run or production sensitive-output qualification. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Actual production SMTP/model/probes/benchmark/maintenance and sensitive-output qualification remain unverified; no live jobs launched.<br>Admin/operations owner; H — audit metadata/diagnostic sensitive outputs and guarded controls; production SMTP/model/maintenance proof separately authorized. | **PARTIAL** | **PARTIAL** |
## Discrepancies and separate exceptions
- **S03 draft-loss blind spot:** `SettingsView.tsx:43–44` returns `null` for inactive tab panels; `RulesSettingsCard` keeps an unsaved draft in mounted component state. Changing tabs therefore destroys that draft. The existing native preservation test at `redesign-preservation.spec.ts:209` resizes with the draft mounted, saves rules, then changes tabs; it does not protect unsaved tab traversal. The separate native diagnostic now fails that exact unsaved tab traversal:14→5→14, no writes. S03 is FAIL under SETTINGS-01; this is a freshly confirmed previously recorded risk, not a newly introduced audit regression.
- **Preference reliability:** P4-04-O02 notification SQLite lock/500 and P5-06-O01 language-save 500 during overlapping reads are distinct inherited failures. Sequential successful saves, local flag reload, or a non-recurrence do not establish concurrency safety or erase those records. Fresh repetition/API exception/DB-provider evidence belongs to the functional audit; bounded remediation belongs to an explicit owning checkpoint.
- **Approved `followMode` exception:** `jobWorkspaceRoute.ts` produces it and `ApplicationWorkspacePage` clones current query parameters before changing `section/sub`. No consumer of it is present in the workspace or inbox compose owner. Metadata preservation is testable; mode-specific compose UI remains the approved mail deferral and is not accepted by URL assertions. This affects W10/W11/M04 reach meaning, without inventing missing behavior as a new implementation request.
- **P5-05 separate:** a new active quick-preview host remains reserved/deferred. W01 still protects actual full-workspace and reusable overlay contracts. An unused host is not an executed journey, and P5-05 is not C11 or a failure inferred from absence.
- **C11 explicitly DEFERRED:** P5-13 qualification has zero configured-model calls/human reviews and its new review UI remains unfinished. Current Production optional-service absence yields `503 cv_ai_unavailable` before generation/Apply writes. Passing deterministic guards and unrelated-AI availability prove controlled withholding only; they do not fulfill original AI generation/review.
- **Superseded historical failures:** original Phase 2 P2-D01 expected failure, stale-CV revision failures and repaired P5-10/P5-14 drag/geometry cases retain their historical records but have newer bounded native/revision evidence. Do not reinstate expected failures or claim their supersession satisfies all provider/manual/render combinations.
- **Ownership test precision:** authorization posture tests assert endpoint attributes; controller/service tests assert scoped resources; browser account-isolation and crafted API denials test transport behavior. None alone proves every route's successful control traversal, mounted-role revocation, real OAuth, BFCache variation, mailbox binary or successful Admin undo.
- **GET is not database-pure:** `ApplicationWorkspaceService:111–112` obtains checklist state through `ApplicationChecklistService.GetAsync`. First reads seed missing owned deterministic checklist rows; recomputation can save system completion state. These behaviors are covered by the retained checklist tests. Browser zero mutation-request counts establish no frontend-triggered unintended mutation/AI generation; they cannot establish zero server persistence on every GET. The matrix preserves the existing seed/recompute contract explicitly rather than proposing a behavioral repair during this audit.
- **Inherited mail/audit mappings corrected:** `EmailOwnershipIntegrationTests` contains exactly three real Identity confirmation/change-email token cases, no Gmail/mailbox tenant assertions; inherited M02/M03 anchors therefore contribute zero mail behavioral cases here. They are relevant E02/E06 identity evidence. `AuthAndSystemControllerTests` contains no AdminAudit/Undo assertions; its 38 passing cases are excluded from A02, while AdminSystem/auth evidence remains valid. A02’s frontend error/retry/localization and API authorization reflection assertions do not prove successful undo/job restore. Both are documentary coverage discrepancies, not evidence of an application security failure.
## Reconciliation
Exact census: **57 unique rows = E9 + J10 + W12 + C12 + M6 + S5 + A3**. Before: **56 PARTIAL, 1 DEFERRED (C11)**. After: **53 PARTIAL, 3 FAIL (E02/J02/S03), 1 DEFERRED (C11)**. Whole-group statuses are deliberately conservative: no full group is promoted solely from a representative test, source review, route header or axe scan. A PARTIAL row states which finite behavior passes and what remains NOT VERIFIED/BLOCKED; absence of human/provider evidence is not a functional FAIL.
| Status | P5-15-00 before | P5-15-01 verified after |
|---|---:|---:|
| PASS | 0 | 0 |
| PARTIAL | 56 | 53 |
| FAIL | 0 | 3 |
| DEFERRED | 1 | 1 |
| BLOCKED | 0 | 0 |
| NOT VERIFIED | 0 | 0 |
| **Total** | **57** | **57** |
Zero whole-group BLOCKED/NOT VERIFIED does not erase blocked or unverified sub-workflows: every PARTIAL group has fresh representative executable evidence, with its remaining gaps listed. This matrix cannot declare exhaustive behavioral acceptance. Confirmed failures are one P1 saved-search availability defect and two P2 recoverable context/draft failures; E07 also references AUTH-01 but is not double-counted as a second defect.
Original full Phase 5 acceptance remains unavailable with C11/P5-13 and mandatory human/device/provider obligations outstanding. Production remains **NO-GO**; no production, provider, model, destructive account/DB or deployment operation occurred in this matrix task.