docs: qualify RD21 remediation and retain provider gates

This commit is contained in:
cesnimda
2026-10-23 18:36:58 +02:00
parent 1b89a779d0
commit 0d16a691e0
31 changed files with 38501 additions and 5 deletions
@@ -0,0 +1,143 @@
# RD21 acceptance addendum — 23 October 2026
**The reproduced SQLite stale-write and partial-commit defects are repaired and locally verified.
Formal RD21 remains UNRESOLVED because the unchanged issue requires supported MariaDB runtime
evidence. Phase 9, Phase 10 readiness and production remain NO-GO.**
This supplements the original [Phase 9 acceptance](../p9-07/FINAL_ACCEPTANCE.md); it does not
rewrite its historical findings or approval boundaries. The remediation uses the requested
`fix/rd21-acknowledged-edit-loss` branch from final Phase 9
`8e7e3f6387544e24082ebe2c107c0b868897959e`. Qualified product checkpoint: `1b89a77`.
## Separate acceptance decisions
| Decision | Disposition and evidence boundary |
| --- | --- |
| A. RD21 | **UNRESOLVED (qualification).** SQLite implementation repair passes. The [original required closure evidence](../p9-04/RD21_CONCURRENCY_ISSUE.md) explicitly includes MariaDB runtime constraints, held readers/writers and partial failure. That qualification remains absent. |
| B. Phase 9 functional QA | **NO-GO.** Local remediation assessment and complete automated regression are finished, but formal RD21 and original output/provider/manual conditions remain open. |
| C. Human accessibility/device acceptance | **Outstanding.** Fresh automated route/accessibility diagnostics do not replace NVDA/VoiceOver, physical touch/drag/software keyboard, forced colours, human zoom/reflow or professional Bokmål review. Original manual rows remain. |
| D. Provider/database qualification | **SQLite verified locally; MariaDB NOT TESTED.** No inference from SQLite or SQL generation to MariaDB runtime. External providers, enabled-worker recovery and model semantics remain separate. |
| E. Phase 10 readiness | **NO-GO.** Preserve all routes, compatibility paths, canonical/CV/frozen boundaries and remaining criteria. This handoff authorizes no cleanup/deletion or Phase 10 implementation. |
| F. Production | **NO-GO.** Storage faults, backup/restore/rollback, live advisories, deployment identity, ingress and provider/manual gates remain. No production database, migration, service restart, filesystem repair, deployment or model action occurred. |
## Reproduction and exact root cause
The unchanged original characterization ran at the exact baseline using two independent
authenticated clients and synthetic SQLite data. Both clients read one record. A successfully
saves a changed summary/title; B submits its older complete snapshot with a different field
changed. Career accepts B with 200; jobs accepts B with 204. Fresh reads restore A's field to its
old value: both `lostFirstEdit=true`. Its one passing characterization is evidence of unsafe
behavior, not a safety pass. [Captured observations](original-reproduction.json).
Both domains lacked the editor's source precondition on replacement writes. Career incremented
an internal version without comparing the source revision or enforcing it as an EF concurrency
token. Jobs had no equivalent revision token. A new request could therefore load the current row
and replace it with arbitrarily old client fields. The optional awaited job summary also left a
read/write interval that a controller-only comparison could not protect.
Career had a second proven failure: the canonical aggregate transaction committed before the
controller's Identity projection update. Injecting an Identity failure left canonical content
changed despite a failure response. Parse and reviewed import acceptance shared that split
boundary. Native SQLite RED tests capture persisted loss and partial commits; see
[before-regressions.json](before-regressions.json) and [root-cause analysis](ROOT_CAUSE.md).
## Implemented correction
Career source snapshots expose a coherent revision. Manual save, history restore, parse and
reviewed import acceptance require that revision. EF compares the original version at the
eventual database write, and competing first saves use the existing unique owner constraint.
Canonical children/history, raw text, Identity projection and applied-import metadata commit in
one transaction. Failure rolls back and clears failed tracked changes. GET no longer backfills
unversioned canonical data. The obsolete identity-only CV projection bypass fails closed.
Jobs have an application-managed EF concurrency token, advanced by every tracked job mutation.
Generic replacement and directly related cover-letter, application-answer and legacy tailored-CV
snapshot writers require their source revision. Related persisted text loss was reproduced
before extending the correction. Opportunity/timeline changes remain in the same SaveChanges
transaction; rejected requests append no success history or side effects. Generic Notes editing
preserves the separately embedded application answer and validates company ownership.
Clients keep source revision and draft together. They acknowledge saves after successful server
responses, retain rejected/network-failed drafts, exclude overlapping edits and late modal/read
responses, and require deliberate review/reload after conflict. They never fetch a newer revision
to authorize an older body. Whole-branch review found two integration defects: the committed job
header was hidden by CORS, and Answers could mount from a stale overview after a sibling write.
Both received deterministic RED evidence, one fix wave and a clean scoped re-review. Actual
cross-origin JavaScript and native successive saves prove the repaired integration.
[SAVE_CONTRACT.md](SAVE_CONTRACT.md) specifies endpoint/status/revision compatibility. Older
unversioned replacement clients intentionally fail closed: missing Career preconditions return
400, stale Career returns 409, and missing/invalid/stale job revisions return 409. Existing 204
job writes return the committed `X-Job-Version`, exposed by the allowlisted credentialed CORS
policy. No automatic stale retry, silent merge, arbitrary delay or new dependency was added.
## Completed verification
| Lane | Actual final result |
| --- | --- |
| Backend Release | **1,109 passed**, zero failed/skipped, exit 0; actual SQLite persisted-state, overlap, rollback, tenant, first-save, stale restore/import and populated migration upgrade/rollback/reapply coverage. |
| Frontend Jest | **934 passed / 105 suites**, zero failed/pending/todo, exit 0 on final source. |
| Ordinary browser | **362 passed**: serial shards 98 + 87 + 88 + 89; exact unique discovery membership, four exit 0 outcomes, no run errors/retries/skips/flakiness. |
| Separate browser contracts | **23 passed**: AI withholding 2, auth recovery 2, rate limits 9, ingress 6, PDF admission 1, preferences 3; no retries/skips/flakiness. |
| Sidecar | **56 passed**, zero failed/skipped, exit 0; `SKIP_MODEL_LOAD=1`, no model semantics claim. |
| New remediation browser | **6 passed**, no retries/skips: original A/B ordering, independent immediate SQLite reads, navigation/refresh/new authenticated session, missing revisions, native draft retention/recovery, actual cross-origin header, successive Answers saves and fresh source entry after letter save; includes conforming bounded sustained workload. |
| Conforming volume companion | **3 passed**: 100 CV revisions/additive restore, 100 exact timeline messages and 100 cancellation notifications/ownership/counts. Only Career seed revision supplied; original assertions retained. |
| Unchanged historical diagnostics | **16 passed / 2 failed**, exit 1: old Career seeds in `data.spec.ts` and `sustained.spec.ts` expect 200 without a revision and receive 400. Actual failures retained; zero skipped/retried. |
| Unchanged historical volume | **2 passed / 1 failed**, exit 1: old CV-volume Career seed also expects unversioned 200 and receives 400. Actual failure retained. |
| Types/lint/build | Final full TypeScript and ESLint exit 0; API Release and UI static export builds pass. New companion diagnostics receive separate TypeScript checking. No deployment. |
| Offline security | Supply-chain 3, evaluator 5, browser-runtime 6, ingress 3, Node dependency/SMTP 15 and extension 3 pass; tracked-secret scan passes and SBOM generated. No live advisory refresh. |
| Native PDF oracle | **16/16 standard fixtures, 36 pages; 8/8 Settings fixtures, 24 pages**. Unchanged oracle/tolerances, exact membership/page counts, inputs hashed before/after verification against final shard-produced bytes. Automated fidelity evidence; no new human/print/device acceptance. |
[validation.json](validation.json) retains exact cases, process timestamps/exits and report hashes.
The final source manifest binds **878 inputs**, SHA256
`7487f343786928e90a3c8a740571c29e5c934c80fa822abb80c7a39483e1353b`, including source,
active fixtures, historical diagnostics, static export and API/test assemblies. Source checks
before ordinary shards and after final diagnostics found no drift. The later conforming volume
copy has separate original/copy hashes in its [fixture provenance](volume/fixture-provenance.json).
The unchanged original reproduction was rerun and intentionally retained its actual post-fix
failure at the now-invalid unversioned seed. The conforming companion preserves the same A/B
read/write ordering with each source revision and stronger assertions: A's commit is read directly
from SQLite immediately after acknowledgement; B receives 409; A's values/history/projection
remain after rejection, navigation, reload and a new authenticated session. This is an explicit
contract adaptation, not a changed historical test or an assertion that the old fixture passed.
Counts are separate lanes, never summed into a blanket all-green total. Focused tests overlap full
suites; initial remediation 4 and focused integration 2 overlap final 6. Pre-review Jest 930 is
superseded by final 934. One earlier ordinary run was interrupted after 22 passes for confirmed
review findings and is not a completed suite. Baseline unsafe characterization and native RED
records remain. The initial job RED runner overwrote its first raw TRX; that provenance limitation
is disclosed in before-regressions.json rather than replaced with fabricated raw evidence.
The finite sustained run shared its host with frontend/static qualification work; it is a bounded
correctness workload and cannot establish an uncontended performance baseline or SLA.
## Provider, preservation and remaining risks
Docker `default`, `desktop-linux` and `desktop-windows` read-only probes failed because engine
named pipes were absent. No native MariaDB/MySQL executable or common Program Files installation
was found. No service installation, restart, download or production access was attempted.
MariaDB concurrency/first-save constraints/held-reader-writer/partial rollback must be exercised on
an isolated disposable supported instance before formal closure. Do not infer deployment safety
from a generated SQL script or the local SQLite migration test.
All **57 groups and 33 routes** remain; **56 PARTIAL / C11 DEFERRED**, zero upgrades to PASS.
Original remaining criteria and historical observations are retained in the
[reconciliation](PRESERVATION.md). Canonical versus CV-specific null-as-inherit overrides,
append-only revisions and submitted/frozen archives retain their passing native contracts.
The [related review](RELATED_REVIEW.md) distinguishes already-guarded Dashboard/CV/email drafts,
narrow job lifecycle commands and independent settings/company/contact records. This is not
complete multi-session acceptance of every independent editor.
Historical overwritten edits are not proven recoverable. Existing history may help a specific
record, but no live records were inspected and no recovery is claimed. Creation-intent idempotency
remains separate and unimplemented. Extraction discard-versus-accept lifecycle concurrency was
considered but not reproduced; it is not certified by these replacement-write tests. Unknown
network outcomes still require deliberate current-data review before retry. Mixed old/new clients
and servers, real MariaDB and production rollback remain unqualified; schema downgrade does not
preserve revision identity. Original duplicate reminder GET and raw `Created` terminology findings
remain separate low-priority observations.
Next qualification: run the same persisted-state, transaction/tenant and migration contracts on
disposable MariaDB; complete the original manual/provider/output/release gates; then reassess
RD21 and Phase 9. Phase 10 receives this blocked handoff only. No main merge, production action,
model activation, new integration or Phase 10 implementation is authorized by this addendum.
@@ -0,0 +1,102 @@
# Commands and evidence accounting
Run from repository root unless stated. Every shell invocation uses `rtk`; PowerShell setup is
executed in script files or literal single-quoted `-Command` text to avoid outer-shell expansion.
Use installed dependencies and the pinned SDK; no package installation is required for this record.
The machine-readable [validation](validation.json) contains actual process records, report hashes
and case identities. These commands describe completed local runs, not production instructions.
```powershell
$env:DOTNET_ROOT='C:/Users/Connor/.dotnet'
$env:DOTNET_HOST_PATH='C:/Users/Connor/.dotnet/dotnet.exe'
rtk proxy C:/Users/Connor/.dotnet/dotnet.exe test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore --logger 'trx;LogFileName=backend-final.trx' --results-directory .artifacts/rd21/backend-final
rtk proxy C:/Users/Connor/.dotnet/dotnet.exe build JobTrackerApi/JobTrackerApi.csproj --configuration Release --no-restore
```
From `job-tracker-ui`, final frontend/static/build:
```powershell
rtk proxy node node_modules/jest/bin/jest.js --runInBand --json --outputFile=../.artifacts/rd21/frontend-final.json
rtk proxy npm run typecheck
rtk proxy npm run lint
$env:NEXT_PUBLIC_API_BASE_URL='http://localhost:5302/api'
rtk proxy npm run build
```
Final browser runs use the existing Release API and final static export. Set
`DOTNET_ROOT`/`DOTNET_HOST_PATH` as above, `PLAYWRIGHT_STATIC_EXPORT=true`,
`PLAYWRIGHT_PREBUILT_EXPORT=true`, `CV_FIDELITY_OUTPUT=<repo>/.artifacts/rd21/fidelity`,
`CV_SETTINGS_FIDELITY_OUTPUT=<repo>/.artifacts/rd21/settings-fidelity` and a distinct
`PLAYWRIGHT_JSON_OUTPUT_NAME=<repo>/.artifacts/rd21/<lane>.json` for each run. No server reuse.
From `job-tracker-ui`:
```powershell
rtk proxy node node_modules/@playwright/test/cli.js test --list --reporter=json
# Four serial runs, substitute 1/4, 2/4, 3/4, 4/4 and distinct output names.
rtk proxy node node_modules/@playwright/test/cli.js test --shard=1/4 --retries=0 --reporter=list,json --output=../.artifacts/rd21/final-ordinary-shard-1-results
# Each additional config is its own serial run with --retries=0 --reporter=list,json and distinct --output.
rtk proxy node node_modules/@playwright/test/cli.js test --config=../docs/redesign/phase-9/rd21-remediation/diagnostics/playwright.config.ts --retries=0 --reporter=list,json --output=../.artifacts/rd21/final-remediation-results
```
| Lane | Config passed to the same browser command |
| --- | --- |
| AI withholding | `playwright.cv-ai.config.ts` |
| Auth recovery | `playwright.auth-recovery.config.ts` |
| Rate limits | `playwright.rate-limits.config.ts` |
| Ingress | `playwright.ingress.config.ts` |
| PDF admission | `playwright.pdf.config.ts` |
| Preferences | `../docs/redesign/phase-5/p5-15/p5-15-01/diagnostics/playwright.config.ts` |
| Historical diagnostic | `../docs/redesign/phase-9/p9-05/diagnostics/playwright.config.ts` |
| Historical volume | `../docs/redesign/phase-9/p9-05/volume/playwright.config.ts` |
| Conforming volume copy | `../docs/redesign/phase-9/rd21-remediation/volume/playwright.config.ts` |
The two historical commands exit 1 because their original unversioned Career seeds expect 200
but now receive 400. They remain unchanged; no skips or retries hide those failures. Conforming
companions supply the source precondition and preserve original assertions/ordering, with stronger
independent persisted-state checks. Original baseline reproduction ran `data.spec.ts` using the
historical config at the baseline commit; `original-reproduction.json` stores its unsafe values.
New diagnostic/volume TypeScript files are checked separately with the installed `tsc`, using
`--noEmit --skipLibCheck --target es2022 --module commonjs --moduleResolution node --esModuleInterop --typeRoots job-tracker-ui/node_modules/@types --types node`
and explicit config/spec filenames from the repository root. An initial root invocation without
the explicit installed Node type root failed type resolution; the corrected command exits 0.
No package or source change was needed. This does not build or alter the static export.
From repository root, sidecar and offline security:
```powershell
# Run the following pytest from tools/summarizer with SKIP_MODEL_LOAD=1.
rtk proxy .venv/Scripts/python.exe -m pytest -q tests --junitxml=<repo>/.artifacts/rd21/sidecar.xml
rtk proxy python scripts/test-supply-chain.py
rtk proxy python scripts/test-ollama-evaluation.py
rtk proxy python scripts/test-browser-runtime-retry.py
rtk proxy python scripts/test-ingress.py
rtk proxy python scripts/supply-chain.py scan-secrets
rtk proxy python scripts/supply-chain.py generate-sbom --output .artifacts/rd21/sbom.json
rtk proxy node --test job-tracker-ui/scripts/audit-dependencies.test.mjs job-tracker-ui/scripts/localSMTPfixture.test.mjs
rtk proxy node --test browser-extension/tests/capture-url.test.mjs
```
Final shard 1 produces the native PDFs/previews. Merge the four Settings measurement files into
`settings-fidelity/measurements.json` preserving all eight fixtures; validate both corpora with
the unchanged oracle using bundled Python with PDF dependencies:
```powershell
rtk proxy C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe scripts/verify-cv-fidelity.py .artifacts/rd21/fidelity
rtk proxy C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe scripts/verify-cv-fidelity.py .artifacts/rd21/settings-fidelity
```
The actual provenance includes full expanded argv, producer/exit hashes and all PDF/preview input
hashes stable before/after oracle runs. Oracle tolerances and historical source files were unchanged.
The new volume config/spec are separately bound to original source hashes; one fixture precondition
is the only semantic delta. Discovery is list-only and not counted as executed or skipped cases.
Read-only provider probes: `rtk proxy docker info --format '{{json .ServerVersion}}'`, equivalent
`--context default`/`desktop-windows` info probes, executable lookup for
`mariadbd,mysqld,mariadb,mysql`, and Program Files directory checks. All were unavailable; no
service restart, download or connection to a production instance was attempted.
Final hygiene uses `rtk git diff --check`, tracked-secret scan, local Markdown link existence,
878-input SHA256 comparison, exact discovery/case reconciliation and a diff against the Phase 9
baseline to reject any modified historical Phase 9 file. Normal Git push is restricted to the fix
branch; direct `ls-remote` equality and unchanged main are verified after the reporting commit.
@@ -0,0 +1,30 @@
# Preservation reconciliation
The original [matrix](../preservation.json), [57-group report](../PRESERVATION.md),
[33-route inventory](../p9-00/inventory.json) and historical acceptance remain unchanged.
[preservation.json](preservation.json) copies each original group, its remaining criteria and
historical delta, with a separate current observation. It records all route names and owners.
**57 groups: 56 PARTIAL, PRES-C11 DEFERRED; zero PASS upgrades. All 33 routes retained.**
Final ordinary discovery matches all 362 executed unique cases exactly, with no skips/retries.
The six separate remediation cases strengthen Career/jobs persistence and client recovery evidence;
they do not close independent manual/provider/output criteria. The full backend/frontend and
separate contract lanes cover existing Dashboard, CV revision/override, frozen document, timeline,
association, tenant/auth/session and lifecycle contracts. Native PDF oracle results retain exact
fixture membership/page counts and existing physical tolerances.
| Boundary | New evidence / retained obligation |
| --- | --- |
| Canonical Career and Identity projection | Guarded coherent source and single commit; stale/failed/import/restore cases query SQLite persisted state. Formal supported-provider qualification remains open. |
| Job editor, cover letter, Answers and tailored drafts | Source revision at eventual write; history/opportunity/timeline atomicity; native failure recovery and cross-origin acknowledgement. Independent creation idempotency remains unimplemented. |
| CV variants and frozen packages | Existing revision, null-as-inherit, immutable archive and native document regressions remain passing. Canonical repair does not authorize changing historical submitted bytes. |
| Dashboard and other record owners | Existing dedicated contracts retained. No inferred defect or blanket multi-session acceptance for independent editors. |
| Public/authentication/settings/localisation | Complete ordinary/contract regression and unchanged route/accessibility diagnostics provide finite local evidence. Human accessibility, professional Bokmål, actual devices/providers remain open. |
| C11 / P5-13 | DEFERRED/withheld; no live model activation or inference qualification. |
| Phase 10 and production | NO-GO. No route/alias/schema cleanup approval; no deployment, storage repair, production migration, backup/restore or release acceptance. |
Historical `delta` text describing RD21 safety failure is retained as an original observation.
The dated addendum separately records the locally repaired behavior and the still-missing MariaDB
qualification; it does not silently rewrite the historical matrix. The original low duplicate
reminder request and raw `Created` terminology observations remain.
@@ -0,0 +1,28 @@
# RD21 remediation and requalification
**SQLite repair implemented; formal RD21 UNRESOLVED, Phase 9 NO-GO, Phase 10 NO-GO,
production NO-GO.** Required MariaDB runtime qualification is unavailable on this host.
The [dated acceptance addendum](ACCEPTANCE_ADDENDUM_2026-10-23.md) is the current assessment.
The original [Phase 9 decision](../p9-07/FINAL_ACCEPTANCE.md) and all original evidence remain
unchanged historical records.
- [Request](REQUEST.md), [implementation plan](PLAN.md), [root cause](ROOT_CAUSE.md).
- [Save/conflict contract and compatibility](SAVE_CONTRACT.md), [related surface review](RELATED_REVIEW.md).
- [Original reproduction](original-reproduction.json), [native RED evidence](before-regressions.json).
- [Exact final validation](validation.json), [browser database observations](browser-observations.json).
- [Commands and evidence accounting](COMMANDS.md), [review rulings](REVIEW_RULINGS.md).
- [Preservation reconciliation](PRESERVATION.md), [all 57 groups and 33 routes](preservation.json).
- [Frozen source/export/assemblies](source-manifest.json), [PDF input provenance](native-document-provenance.json).
- [Standard PDF oracle](fidelity-results.json), [Settings PDF oracle](settings-fidelity-results.json).
- [Conforming volume fixture provenance](volume/fixture-provenance.json).
Product qualification ends at commit `1b89a77` on `fix/rd21-acknowledged-edit-loss`, based on
`8e7e3f6387544e24082ebe2c107c0b868897959e`. Later reporting commits do not change qualified
product inputs. The final delivery message supplies the reporting commit and direct remote
comparison, avoiding a self-referential commit hash in this document.
Machine-readable results retain case identities, process outcomes and original raw hashes. Raw
test outputs, traces, synthetic databases and generated PDFs remain in ignored `.artifacts/rd21/`;
portable observations and oracle results are committed here. This does not make raw artifacts
available from a fresh clone or claim independent human/device/provider verification.
@@ -0,0 +1,31 @@
# Related save-pattern review
This is a scoped source/caller review. It does not certify every editable record or turn a missing
revision property alone into a newly reproduced defect.
| Surface | Finding and disposition |
| --- | --- |
| Career manual editor / history restore | Exact RD21 stale replacement reproduced; all canonical writes now require the editor's source revision and participate in atomic canonical/projection persistence. |
| Career parse / reviewed imports | Same replacement service and split projection boundary. Included in the correction, with reviewed-source revision and rollback tests for application metadata. Upload/rebuild/improve processing produces pending-review runs rather than independently applying canonical data. |
| Generic job edit | Exact RD21 stale snapshot reproduced. The shared dialog reaches Table and workspace edit/notes entry points. The generic endpoint now compares source revision and atomically guards final commit. |
| Cover letter / application drafts / structured tailored CV | Additional SQLite tests reproduce actual acknowledged-text loss. Included in the correction; guards cover both current fields and append-only history/related draft rows. Legacy tailored text replacement fails closed too. |
| Job lifecycle, rules, reminders, enrichment and attachment-derived flags | Narrow server commands/background transformations, rather than generic client snapshots. They share the JobApplication EF token/version advancement so overlapping database writes cannot silently commit stale tracked values. This does not claim every possible field-command ordering is a full-editor merge contract. |
| Dashboard preferences | Already uses the submitted layout revision and an owner/revision-conditioned ExecuteUpdate. Existing dashboard conflict/persistence contracts remain applicable; this is a separate owner from Career/jobs. |
| CV Builder variants | Already requires expected version with an EF concurrency token and append-only settings history. Existing stale save/restore and null-as-inherit override/frozen contracts remain. Canonical changes do not rewrite variant settings/history. |
| Email drafts | Existing owner/revision-conditioned updates and send-attempt reservation remain separate. They are not silently redirected through the new job snapshot contract. |
| Submitted documents/packages | Existing immutable snapshot/binary archive remains separate from current Career/job/cover-letter edits. No new mutation of captured packages or archived binaries is introduced. Native archive and document regressions are required independently. |
| Identity and Settings | Identity uses its existing Identity concurrency stamp. The obsolete identity endpoint's CV-projection bypass is explicitly closed. Individual language/privacy/rules/notification settings retain their existing contracts; no new RD21 runtime failure in these separate records was established here. Their broader multi-session/human/provider criteria are not accepted by this repair. |
| Company/contact and other independent editable records | Source patterns were inspected for shared infrastructure. They do not use the defective Career aggregate service or generic job snapshot mapping. No new cross-record stale-loss reproduction is claimed; complete multi-session acceptance of every separate editor remains outside this bounded repair. |
The browser extension/bookmarklet remains a create/capture consumer rather than a generic job
replacement client. Local extension contracts pass separately; this is not an installed-device test.
Generic job PUT continues to preserve ordinary notes versus the embedded application answer, tenant
company associations, existing salary normalization and lifecycle semantics. Rejection must leave
opportunity and timeline state unchanged. These are tested through actual SQLite rows, not inferred
from HTTP success alone.
Remaining distinct concerns include job creation-intent idempotency, actual MariaDB behavior,
historical recovery, provider journeys, storage/backup/rollback, human accessibility/device/output
acceptance, and the original low duplicate-reminder-GET/raw-Created terminology observations. No
Phase 10 deletion, new integration, model activation or production action is authorized by this review.
@@ -0,0 +1,31 @@
# Review and scope rulings
These are implementation/review decisions, not approval to merge or release. Original review
documents are copied in `reviews/`; they are chronological, so earlier pending results are
superseded only by the final validation and scoped re-review.
| Decision | Rationale / disposition |
| --- | --- |
| Requested fix branch in existing checkout | Exact user-requested branch, based on final Phase 9 rather than main; extra checkout and routine approval pauses unnecessary under explicit autonomous authorization. |
| Shared persistence correction | Reproduced full-snapshot loss requires source revisions plus database predicates. Client-only guards and controller-entry checks cannot protect the eventual commit. |
| Atomic Career boundary | Injected Identity failure proved partial persistence. Include children/history/projection/import metadata in the same transaction and clear failed tracking. |
| Related text writers included | Cover-letter, application-drafts and structured tailored-CV SQLite regressions actually lost approved content before repair. Their source guards are directly related scope, not speculative blanket versioning. |
| Legacy identity CV bypass closed | Projection-only writes could sidestep canonical ownership/revision. Explicit 400 with canonical-route guidance; identity-only fields retain their route. |
| Narrow lifecycle commands | Job token advances for tracked partial/background mutations, protecting overlapping database changes. Do not invent a full-editor merge contract for field commands or independently owned Settings/company/contact records. |
| Old callers fail closed | Missing revision cannot safely authorize old snapshots. Update active callers/fixtures explicitly; no blind-save overload, latest-version fetch to bless old bodies, silent merge or automatic retry. |
| Historical diagnostic files preserved | The old unversioned seed now fails. Retain actual failures and use separately hashed conforming companions with unchanged A/B ordering/volume assertions. No historical assertion is weakened. |
| Formal RD21 disposition | Original issue requires SQLite AND supported MariaDB runtime proof. Local repair passes, but missing provider qualification means formal UNRESOLVED, not an invented closure exception. |
| Preservation status | Keep 56 PARTIAL/C11 DEFERRED, all 57 groups/33 routes and manual/provider/output/release obligations. Automated passes do not upgrade their acceptance status. |
| Distinct remaining work | Creation idempotency and historical recovery unimplemented. Discard-versus-accept extraction lifecycle concurrency considered but unproven; separate evidence needed before a new repair. No new integration or Phase 10 scope. |
| Tool fallback | WSL Bash unavailable; installed Git Bash ran required skill helpers. Pinned local .NET SDK used rather than the incompatible system SDK. No dependency installation or production workaround. |
Early caller review and two backend reviews identified no remaining material issue in their
bounded scopes. Whole-branch [final review](reviews/final-review.md) found two material integration
issues: missing CORS response-header exposure and stale Answers entry after sibling writes.
Both were reproduced with failing assertions, repaired in one wave at `1b89a77` and covered by
actual browser JavaScript plus native database reads. The
[scoped re-review](reviews/final-re-review.md) marks both **ADDRESSED**, with no new material
finding. Reviewers inspected code/evidence; their review is not a second independent execution
of the coordinator's full suites. Focused 55 Jest/2 browser results overlap final full evidence.
The review does not certify every editor, MariaDB, live providers, devices, production or recovery.
@@ -1,6 +1,7 @@
# RD21 investigation (23 October 2026)
Status: repair and qualification in progress; this is not acceptance.
Status: SQLite repair implemented and locally qualified. Formal supported-provider closure remains
UNRESOLVED; see the [dated acceptance addendum](ACCEPTANCE_ADDENDUM_2026-10-23.md).
## Original failure
@@ -50,16 +51,37 @@ Career has an existing synchronous mutation guard and disables its editor while
paths retain drafts, but it cannot detect another session's change without server revision data.
The shared job dialog does not guard older GET responses, and remains editable/closable during
PUT; a successful submitted snapshot can close a dialog containing later unsent edits. The
frontend correction will preserve the revision belonging to each draft, block conflicting
in-flight actions, reject old responses, and display recoverable conflicts without blind retry.
frontend correction preserves the revision belonging to each draft, blocks conflicting
in-flight actions, rejects old responses, and displays recoverable conflicts without blind retry.
## Provider limitation
The read-only `rtk proxy docker info --format '{{json .ServerVersion}}'` probe on 23 October
failed: `dockerDesktopLinuxEngine` named pipe does not exist. No daemon installation/restart was
attempted. MariaDB runtime qualification is outstanding; SQLite and provider script generation
failed: `dockerDesktopLinuxEngine` named pipe does not exist. Additional `default` and
`desktop-windows` context info probes also failed with their named pipes absent. Command lookup
found no mariadbd/mysqld/mariadb/mysql executable, and neither Program Files installation root
contained a MariaDB/MySQL directory. No daemon installation/restart was attempted. MariaDB runtime
qualification is outstanding; SQLite and provider script generation
cannot substitute for a MariaDB persistence/concurrency run.
## Integration review findings during repair
The first repair passed its backend and component suites, but whole-branch connected review found
two integration gaps before final qualification. Neither is hidden by those passing totals:
- The application-drafts client consumes `X-Job-Version` after 204, while the existing cross-origin
CORS policy does not expose that response header. APIRequest tests can read it, but browser Axios
cannot. The database can therefore commit while the browser reports a missing committed revision.
Actual cross-origin browser proof is required in addition to raw HTTP assertions.
- Cover-letter saves advance the shared job version. Answers initially consumes a cached overview
snapshot; switching from a successful letter save to Answers can therefore submit an older source
revision and receive an avoidable 409. A new Answers editor needs a coherent fresh source before
editing. Updating only its revision would incorrectly authorize stale body fields; dirty drafts
must retain their original source through later parent refreshes.
The broad browser run was stopped after 22 passing cases while these findings were addressed. It
is an interrupted attempt, not a full-suite pass. Final results must qualify the corrected source.
## Historical recovery
No evidence establishes recovery of edits already overwritten before this repair. Canonical
@@ -0,0 +1,89 @@
# Save and conflict contract
Implemented contract; final qualification is recorded separately in the dated acceptance addendum.
## Canonical Career Profile
`GET /api/career/profile` returns `{ profile, completeness, cvText, revision }`.
The profile comes from canonical relational children/LongTail with the existing legacy blob
fallback. A short read transaction keeps source, revision and raw CV text coherent. Reads do not
backfill/write unversioned children. The public owner-specific load remains read-only.
`revision` is `CareerProfile.Version`; 0 means there is no canonical row. It is independent of
the structured document's schema string `profile.version` and extraction metadata profileVersion.
| Writer | Required source precondition | Commit boundary |
| --- | --- | --- |
| PUT `/career/profile` | Body `expectedVersion` from the draft's GET | Canonical row, replace-all children, append-only history, Identity projection and optional raw text |
| POST `/career/profile/versions/{version}/restore` | Body `expectedVersion` for current canonical source, independent of selected historic version | Restored snapshot appended as a new guarded revision and projection |
| POST `/profile-cv/parse` | Body `expectedVersion` and source text | Applied extraction run, canonical aggregate, projection and import pointers |
| POST `/profile-cv/runs/{id}/accept` | Body `expectedVersion` from the actual reviewed diff | Reviewed merge, canonical aggregate, applied-run metadata and projection |
Missing or negative Career preconditions return 400. A valid stale revision returns 409 with
`code: revision_conflict`. Competing first saves use the existing unique owner constraint;
specific owner-duplicate errors become conflicts. There is no blind-save service overload or
automatic stale retry. Existing-row writes also compare the original version in EF's database
UPDATE predicate, protecting the interval after controller validation.
Controller transactions include Identity updates. A failed Identity result throws before commit;
canonical rows/children/history and import pointers roll back together. Failed tracked changes
are cleared, so a later SaveChanges cannot publish a rejected operation. Successful responses
are constructed within this boundary and returned only after commit. Post-commit parse-artifact
pruning is logged best-effort maintenance and cannot turn the committed save into an error.
Null/omitted `cvText` preserves imported raw text; whitespace explicitly clears it. Identity fields
remain owned by the identity endpoint. The obsolete `/auth/profile` CV projection fields now fail
closed with 400 and guidance to use `/career/profile`; identity-only updates remain supported.
## Job snapshots and related text
Job reads expose integer `version`. Workspace overview and cover-letter reads expose `revision`
for that same job row. Tailored CV draft GET/generation also returns its job revision.
| Writer | Required body field | Success |
| --- | --- | --- |
| PUT `/jobapplications/{id}` | `expectedVersion` from the full editor snapshot | Existing 204 status, `X-Job-Version` committed revision |
| PUT `/jobapplications/{id}/application-drafts` | `expectedVersion` with the answer/recruiter/notes draft source | 204 and `X-Job-Version` |
| PUT `/jobapplications/{id}/cover-letter` | `expectedVersion` with current text/history source | Cover-letter DTO including new revision |
| POST `/jobapplications/{id}/cover-letter/versions/{version}/restore` | `expectedVersion` for current job, independent of history version | Cover-letter DTO including new revision |
| PUT `/jobapplications/{id}/tailored-cv[-draft]` | `expectedVersion` with the legacy text/structured draft source | 204 and `X-Job-Version` |
Missing/invalid/stale job preconditions fail with 409. Every tracked JobApplication mutation,
including partial lifecycle and background writers, advances the application-managed version.
EF's original-version predicate guards the database write; full replacement/no-op saves force
that guard even if the submitted fields compare equal. An overlapping winner cannot be silently
replaced after a slow optional AI summary. Related opportunity fields and timeline events remain
inside the same SaveChanges transaction. No history/events are appended for a rejected write.
Generic job PUT still preserves the separately embedded application answer when editing ordinary
notes. It validates company ownership under tenant filters. Partial application-draft null fields
retain their prior semantics. Source guards do not alter CV-specific null-as-inherit overrides or
submitted/frozen documents.
## Client acknowledgement and recovery
Each draft retains the revision belonging to its actual source. A failed/409 save leaves user text
and choices available. The client never reads the latest revision just before PUT to authorize
an older body, never silently merges/retries a conflict, and never labels a rejected request saved.
The editor excludes overlapping mutations and late responses from older modal/read sessions.
Recovery requires deliberate reload/review. A network failure may leave commit outcome unknown;
the original revision cannot commit twice. Refresh and compare before resubmitting a retained
draft. This repair does not claim recovery of already overwritten historical edits.
## Compatibility and qualification
Older unversioned replacement clients intentionally fail closed. Active application callers and
test fixtures are updated; the extension/bookmarklet create flow does not perform these replacement
writes. An external client must read a source snapshot and carry its revision before replacing it.
No missing-revision compatibility fallback is accepted.
Migration `20261023090000_AddJobRevision` adds the job integer column with default 1. SQLite tests
upgrade populated synthetic storage and roll back/reapply while preserving job content. Career's
existing version column becomes an EF concurrency token without a new physical column. A schema
rollback does not preserve revision identity and is not a qualified production rollback procedure.
SQLite runtime tests and provider SQL generation do not prove MariaDB runtime behavior. The local
Docker Linux engine was unavailable. Mixed old/new server or client deployment, actual MariaDB,
production storage durability and release/rollback remain separate qualifications. No deployment
or production migration was performed.
@@ -0,0 +1,162 @@
{
"purpose": "Actual failing evidence; focused reruns are not added to final full-suite totals.",
"originalBrowser": {
"id": "RD21",
"career": {
"staleStatus": 200,
"expectedFirstSummary": [
"First editor committed summary"
],
"actualSummary": [
"Initial summary"
],
"lostFirstEdit": true
},
"job": {
"staleStatus": 204,
"expectedFirstTitle": "First editor committed title",
"actualTitle": "Original job title",
"lostFirstEdit": true
},
"safetyQualification": "FAIL: stale writes can overwrite acknowledged edits",
"limitation": "This passing characterization records observed behavior; it does not accept unsafe stale writes or provide a new revision contract. Creation-intent idempotency remains separate."
},
"native": [
{
"stage": "Baseline Career stale success and rejected-operation partial commit",
"artifact": ".artifacts/rd21-career-red/rd21-career-red.trx",
"sha256": "8bab2511c7fff78ea365444680d00511a2894f6913d447f037f2cf2a0b4ece30",
"counters": {
"total": "2",
"executed": "2",
"passed": "0",
"failed": "2",
"error": "0",
"timeout": "0",
"aborted": "0",
"inconclusive": "0",
"passedButRunAborted": "0",
"notRunnable": "0",
"notExecuted": "0",
"disconnected": "0",
"warning": "0",
"completed": "0",
"inProgress": "0",
"pending": "0"
},
"failures": [
{
"name": "JobTrackerApi.Tests.Rd21CareerPersistenceTests.Identity_failure_rolls_back_canonical_children_history_and_projection",
"message": "Assert.Empty() Failure: Collection was not empty\r\nCollection: [CareerProfile { Certifications = [], CreatedAtUtc = 2026-10-23T05:48:16.1454440+00:00, Education = [], Experiences = [], Id = 1, \u00b7\u00b7\u00b7 }]"
},
{
"name": "JobTrackerApi.Tests.Rd21CareerPersistenceTests.Independent_stale_snapshot_cannot_replace_acknowledged_career_edit",
"message": "Assert.IsType() Failure: Value is not the exact type\r\nExpected: typeof(Microsoft.AspNetCore.Mvc.ConflictObjectResult)\r\nActual: typeof(Microsoft.AspNetCore.Mvc.OkObjectResult)"
}
]
},
{
"stage": "Generic guard already present; related cover/application draft writers still overwrite persisted approved text",
"artifact": ".artifacts/rd21/native-red/rd21-job-red.trx",
"sha256": "57b7aef48c879b53ec57080a133ddbad04ac7f174efbcea85bbc49426a02edc7",
"counters": {
"total": "4",
"executed": "4",
"passed": "2",
"failed": "2",
"error": "0",
"timeout": "0",
"aborted": "0",
"inconclusive": "0",
"passedButRunAborted": "0",
"notRunnable": "0",
"notExecuted": "0",
"disconnected": "0",
"warning": "0",
"completed": "0",
"inProgress": "0",
"pending": "0"
},
"failures": [
{
"name": "JobTrackerApi.Tests.Rd21JobPersistenceTests.Related_text_save_cannot_silently_replace_a_newer_acknowledged_draft(coverLetter: False)",
"message": "Assert.Equal() Failure: Strings differ\r\n \u2193 (pos 0)\r\nExpected: \"First approved text\"\r\nActual: \"Stale snapshot text\"\r\n \u2191 (pos 0)"
},
{
"name": "JobTrackerApi.Tests.Rd21JobPersistenceTests.Related_text_save_cannot_silently_replace_a_newer_acknowledged_draft(coverLetter: True)",
"message": "Assert.Equal() Failure: Strings differ\r\n \u2193 (pos 0)\r\nExpected: \"First approved text\"\r\nActual: \"Stale snapshot text\"\r\n \u2191 (pos 0)"
}
]
},
{
"stage": "Legacy Identity endpoint still bypasses canonical save boundary",
"artifact": ".artifacts/rd21/legacy-cv-red/legacy-cv-red.trx",
"sha256": "f59b27ddf3718bb2a9f2a7a2fee96179b2f4dd3af0e25e7b4c0ba0c8276837a1",
"counters": {
"total": "3",
"executed": "3",
"passed": "0",
"failed": "3",
"error": "0",
"timeout": "0",
"aborted": "0",
"inconclusive": "0",
"passedButRunAborted": "0",
"notRunnable": "0",
"notExecuted": "0",
"disconnected": "0",
"warning": "0",
"completed": "0",
"inProgress": "0",
"pending": "0"
},
"failures": [
{
"name": "JobTrackerApi.Tests.AuthAndSystemControllerTests.Legacy_profile_endpoint_cannot_bypass_canonical_revision_guards(text: \"stale text\", structured: null)",
"message": "Assert.IsType() Failure: Value is not the exact type\r\nExpected: typeof(Microsoft.AspNetCore.Mvc.BadRequestObjectResult)\r\nActual: typeof(Microsoft.AspNetCore.Mvc.NoContentResult)"
},
{
"name": "JobTrackerApi.Tests.AuthAndSystemControllerTests.Legacy_profile_endpoint_cannot_bypass_canonical_revision_guards(text: \"\", structured: \"\")",
"message": "Assert.IsType() Failure: Value is not the exact type\r\nExpected: typeof(Microsoft.AspNetCore.Mvc.BadRequestObjectResult)\r\nActual: typeof(Microsoft.AspNetCore.Mvc.NoContentResult)"
},
{
"name": "JobTrackerApi.Tests.AuthAndSystemControllerTests.Legacy_profile_endpoint_cannot_bypass_canonical_revision_guards(text: null, structured: \"{\\\"summary\\\":[\\\"stale\\\"]}\")",
"message": "Assert.IsType() Failure: Value is not the exact type\r\nExpected: typeof(Microsoft.AspNetCore.Mvc.BadRequestObjectResult)\r\nActual: typeof(Microsoft.AspNetCore.Mvc.NoContentResult)"
}
]
},
{
"stage": "Structured tailored CV replacement still overwrites approved text",
"artifact": ".artifacts/rd21/structured-cv-red/structured-cv-red.trx",
"sha256": "b297f11fa8a98de808470b630ef25ad49d32c4aa66a3e55ac9bfa12027997638",
"counters": {
"total": "1",
"executed": "1",
"passed": "0",
"failed": "1",
"error": "0",
"timeout": "0",
"aborted": "0",
"inconclusive": "0",
"passedButRunAborted": "0",
"notRunnable": "0",
"notExecuted": "0",
"disconnected": "0",
"warning": "0",
"completed": "0",
"inProgress": "0",
"pending": "0"
},
"failures": [
{
"name": "JobTrackerApi.Tests.Rd21JobPersistenceTests.Structured_tailored_cv_snapshot_cannot_replace_a_newer_approved_document",
"message": "Assert.Contains() Failure: Sub-string not found\r\nString: \"Professional Summary\\n- Stale CV evidence\"\r\nNot found: \"Approved CV evidence\""
}
]
}
],
"initialJobRed": {
"observed": "Both stale and unversioned job snapshot tests returned NoContentResult instead of conflict after immediate SQLite acknowledgement check.",
"limitation": "The initial runner reused its raw file path; that first two-case log was superseded. The retained later file is explicitly labeled as related-writer RED, not baseline job RED."
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,124 @@
{
"finishedUtc": "2026-10-23T16:27:04.275390+00:00",
"inputs": {
".artifacts/rd21/fidelity/compact-8mm-letter/export.pdf": "5fb5cbae3f197589a0a081f977a3f9e0c83372adf3fe682ecb15f0b5856f11d1",
".artifacts/rd21/fidelity/compact-8mm-letter/preview-1.png": "4526b6f7f24cb0927dd93f845f629d566a24ead24a02154a604b4e353469197f",
".artifacts/rd21/fidelity/compact-8mm-letter/preview-2.png": "e865e133b17470eb85d19ef2fc76f472a07dd4d335ae0f8bdd2b6d6a65df648a",
".artifacts/rd21/fidelity/compact-8mm-letter/preview-3.png": "0bdebad4180919a3b32f554446c4e790dae6412e48edc4325435aa6a733b15e6",
".artifacts/rd21/fidelity/compact-8mm-letter/preview-4.png": "bcfc29f4911b1b0f4515cbc5eaeb7e67aa2d969d586280a2771b458f3940929b",
".artifacts/rd21/fidelity/default-ats-classic/export.pdf": "69d2c6f21dbd3883d9c297d114800c14e42b3edf1880a009bce0c2868d25f756",
".artifacts/rd21/fidelity/default-ats-classic/preview-1.png": "9f6778b86e5e1db00caa55ecdc83e7f4bcc91a52643e7a9b45f4ff890d56d2c8",
".artifacts/rd21/fidelity/default-code/export.pdf": "957e494c4bff419bae7ff6c006cda401c5c3dc4bb59b7ca67a9306c7cc8572e8",
".artifacts/rd21/fidelity/default-code/preview-1.png": "f9b9462be97a1a77e981234801a1dd415df28084d66b5b6d81288a923b15186e",
".artifacts/rd21/fidelity/default-creative/export.pdf": "e80aa7e97108fb08ade13ff1f3412151a17c48f7616b4abb5078ca9048e1b7cc",
".artifacts/rd21/fidelity/default-creative/preview-1.png": "c34ed3549434fd2d3f1f5f98a1109ee19a10f6d3cd6833437b204a98659e92d8",
".artifacts/rd21/fidelity/default-elegant/export.pdf": "38c3655f689513c6ea77e51acfb1f8ca4c9f952718112efc9c9c3bf034951944",
".artifacts/rd21/fidelity/default-elegant/preview-1.png": "ce10ae9f14e864208e755e59ed190c6dbd906d60e5d260f31e49be652c937365",
".artifacts/rd21/fidelity/default-executive/export.pdf": "8e9872d6ddc6b6204b7122f8daec7d6cbaef6ac79e5ba9eae17a3ea1d33d268c",
".artifacts/rd21/fidelity/default-executive/preview-1.png": "82601391cb873bdd385ed8c0ecb3fc4c5e472b5a2825f25c42a7619ff3476055",
".artifacts/rd21/fidelity/default-minimal/export.pdf": "b2b24e86628be7a833feedbc4d6a5432babf903dd3b3b77be4d8ab5a0a3674dc",
".artifacts/rd21/fidelity/default-minimal/preview-1.png": "f53d2da2c35edb1d0ef8650bf2469acfb945e7df1da86aa9fb3736bb6f6fd913",
".artifacts/rd21/fidelity/default-modern/export.pdf": "19889c90d33d79a737e447d1fdeb05dfc95aaa09e828342094cd7bbb6226ff94",
".artifacts/rd21/fidelity/default-modern/preview-1.png": "9544d0ca85773be277afa35bd9d61de31614975999a667904e162d7ed9829043",
".artifacts/rd21/fidelity/default-nordic/export.pdf": "520cf4b20b40e988e9a83e7718e187307102ce4618fb8cb68fc34182e6961939",
".artifacts/rd21/fidelity/default-nordic/preview-1.png": "fe04a7ee9161b705a23077f9aa986b715ad6faa22c564fda222780f26edbf87c",
".artifacts/rd21/fidelity/default-technical/export.pdf": "cc127427e5eb7e32b78a4878fa6bfa063c7f164ce657adec52a542da1dd84fd0",
".artifacts/rd21/fidelity/default-technical/preview-1.png": "c0f71784ebab7303636c33f01a96dfd308ac49a0095054162ece1d67e8fd636a",
".artifacts/rd21/fidelity/grid-and-bubbles/export.pdf": "7da63d051333dfa30a950d51a046e2b5c45ec5f928a82f39ff7315201c48cf3a",
".artifacts/rd21/fidelity/grid-and-bubbles/preview-1.png": "4e8df81ce5afcd8a8e71898bbf4c5badc3b8a97a8474bfcfd3baa344ea3a7914",
".artifacts/rd21/fidelity/long-en-minimal/export.pdf": "e657392db9a7125772e8905b6e3a4c37db63ee9345da78ab554d28b07412ac11",
".artifacts/rd21/fidelity/long-en-minimal/preview-1.png": "b8e29a06b18a7de4476c906f84de8c2bb4067b4a7454d670a03b88074226aa46",
".artifacts/rd21/fidelity/long-en-minimal/preview-2.png": "fd034cc3aaa8da8ce229f80cc9755cd06341d0db05ab5859f005b73628a64e2d",
".artifacts/rd21/fidelity/long-en-minimal/preview-3.png": "0ccae375bbd5434492f05ee90ab1e8c2446d7ba8f5d940695d51368790607cb1",
".artifacts/rd21/fidelity/long-en-minimal/preview-4.png": "27563b5f2517618c942ecdf79d9474b87abc431e3ecbc6303160424f89e93330",
".artifacts/rd21/fidelity/long-nb-code/export.pdf": "d3afd30923d6162cd86d9ca091628260030cefee2796545256080924f6b508ec",
".artifacts/rd21/fidelity/long-nb-code/preview-1.png": "ac3297137d46dc624400c9e937b0a89d291a148de1fcedc31029a60f734abcf3",
".artifacts/rd21/fidelity/long-nb-code/preview-2.png": "723645731d2056dfd3fa1e7ec50017d8ceadf501b83f30d7768f48479ba643be",
".artifacts/rd21/fidelity/long-nb-code/preview-3.png": "109ff8fc9ab61e7e6bf2149e1f7bc5c96b41674004bb107ed0192906696cb677",
".artifacts/rd21/fidelity/long-nb-code/preview-4.png": "ddc8aa95c196c1cab571f950dc524be1bd5f189621116609c3cb5a26bb2dc4f9",
".artifacts/rd21/fidelity/long-sidebar-nb/export.pdf": "96d6311206026b11513ad053186bcf4db248a77d7d021ed27bec173c1043a1a8",
".artifacts/rd21/fidelity/long-sidebar-nb/preview-1.png": "f74562d6bbf67c7f56636e379d8baf475bbda2e2a02f10528ab10db9d0b175a7",
".artifacts/rd21/fidelity/long-sidebar-nb/preview-2.png": "a41ad5a61c45164aaa64c16f35c2692f8830121280adbad02a12420356eeaef6",
".artifacts/rd21/fidelity/long-sidebar-nb/preview-3.png": "c3a7da98ae5a81f5cf5e199b8f04ce87afa7d0dad45387941989c43972333c77",
".artifacts/rd21/fidelity/long-sidebar-nb/preview-4.png": "78bf331f6b61755906a8441cbe4dcb01cc122cd7c8054e024d836e4319e5924c",
".artifacts/rd21/fidelity/long-sidebar-nb/preview-5.png": "1ed22b2b5d115a75c9bd0dd4afe6064d54d6a8848b091edacdc1014e0bd0a8d0",
".artifacts/rd21/fidelity/measurements.json": "f910a56faea328a692ff7c2324e79aba509bcdbd4421364fd90e1cb3861ce32d",
".artifacts/rd21/fidelity/roomy-28mm-nb/export.pdf": "2a59c44ae2f1a58fee6239164c5dc9df32a5cfc3c8096dcfbdaa7a7eebf60c0c",
".artifacts/rd21/fidelity/roomy-28mm-nb/preview-1.png": "1bec40fd7a5f4d65105772cab3c33a8387890c99adc477f228db4ec1bf5c07a7",
".artifacts/rd21/fidelity/roomy-28mm-nb/preview-2.png": "75f9177577851a90993429231bed94061b8a18d406bf1ebfc0231a0f0d814aa4",
".artifacts/rd21/fidelity/roomy-28mm-nb/preview-3.png": "94bba146ad3794d202e1e590f55ef881523ee37f704c29aaa36d24bdfbaa7902",
".artifacts/rd21/fidelity/roomy-28mm-nb/preview-4.png": "a4cb07e5f5964e8f356cf71314111c5e478535505dff8451dddcafabf2dd1de2",
".artifacts/rd21/fidelity/roomy-28mm-nb/preview-5.png": "308685d178725e49b4be78acf7cfd5ed02f33e689dd0a0316e5ecc40fc7ebff5",
".artifacts/rd21/fidelity/unbreakable-and-boundary/export.pdf": "13ac5d2b7e6e7764fa4ea15bb231068dc5418d749ef300e7bac0d70608a9824b",
".artifacts/rd21/fidelity/unbreakable-and-boundary/preview-1.png": "161cd02aaf92943dbff14930f35de26ccc983569b24d87b264761cb9ad3a6c21",
".artifacts/rd21/fidelity/unbreakable-and-boundary/preview-2.png": "c55281f95c5f039b30e232b146ed67254a60d35e6dce864a51533effe132b619",
".artifacts/rd21/fidelity/unbreakable-and-boundary/preview-3.png": "f483f4f87cb811d84345f871c745efe598603b2543dde80633e7c7d298436d4d",
".artifacts/rd21/fidelity/unbreakable-and-boundary/preview-4.png": "7509f2c3cbc459f1d98be5210a63c1c83adb8ca9098df7a3869eefdee08d33bf",
".artifacts/rd21/final-ordinary-shard-1-exit.json": "5b5a739c5fd1acf247d5011dabea1b776200d783825cbff90811d08776c0962b",
".artifacts/rd21/final-ordinary-shard-1.json": "a6fa08735c22a13362fda3a196faee5b902e839621f3da62db37f373d0463813",
".artifacts/rd21/settings-fidelity/dark-en-after/export.pdf": "c5057855035907829b10b30a51d1c56861a4c400a2e54a78baa43f2d407ba392",
".artifacts/rd21/settings-fidelity/dark-en-after/preview-1.png": "dfa55cc028f07b9e459947df43339eb5f175b4c539caf543fc3a91a1b7fa0340",
".artifacts/rd21/settings-fidelity/dark-en-after/preview-2.png": "b31ea6ac52444446643bb4fe8cc79d13df62495d731f3036db65028c62eb7dda",
".artifacts/rd21/settings-fidelity/dark-en-after/preview-3.png": "9ae93f15c84a78b6d02e7b55b95072a02c614219d2f53c88c38411657d370933",
".artifacts/rd21/settings-fidelity/dark-en-before/export.pdf": "899983dddad507df35960608ce9be366f851a238bd13282e473d93214a0ac79e",
".artifacts/rd21/settings-fidelity/dark-en-before/preview-1.png": "64e5f6f5c0f974682fae0345e5db154638e00f492dfbac842bf9cdef811881e2",
".artifacts/rd21/settings-fidelity/dark-en-before/preview-2.png": "c600a25b013ab109ed922951f7d0a3cfd76473320e7cca66e91c21cd20fd33b5",
".artifacts/rd21/settings-fidelity/dark-en-before/preview-3.png": "f95618f08261a7a9a2b606c0ee0fa2300ab3d1a008fc69afe03fcda9f590c70f",
".artifacts/rd21/settings-fidelity/dark-en-measurements.json": "b5324257dbbdc42a10ebcbcd1451def142e3c74526e82248fd488f3cffc16ab6",
".artifacts/rd21/settings-fidelity/dark-nb-after/export.pdf": "2fd21fb272ccfd830db56da00be5d7e62af6e920b604338b921238333c9082cd",
".artifacts/rd21/settings-fidelity/dark-nb-after/preview-1.png": "a67350056d41344ea0d5af214f153a8114f5c1f9877d3a1e11ff3c68c299be50",
".artifacts/rd21/settings-fidelity/dark-nb-after/preview-2.png": "f83f366b422966b88b4d77e61db71af1cf80539026b89df07a08708b48fe9212",
".artifacts/rd21/settings-fidelity/dark-nb-after/preview-3.png": "273feb28374258ef33fd63b90968b4888f405a8e73513b3bf8360414b436c09a",
".artifacts/rd21/settings-fidelity/dark-nb-before/export.pdf": "cbf383bff4f41df0aa0e1d0548eb975046f41f29b3a185ff43dd158e64d0023b",
".artifacts/rd21/settings-fidelity/dark-nb-before/preview-1.png": "ec9d3f8434bbda759faba9203e6ba53c443f555c98d16a8f6a92b84eaa900cb2",
".artifacts/rd21/settings-fidelity/dark-nb-before/preview-2.png": "5a2435578d25852ec24da607a2c85ed7c3233d30cfc3f5f7e035753b64252797",
".artifacts/rd21/settings-fidelity/dark-nb-before/preview-3.png": "512420e7a00329c7fdc871ffa63f46acb4f0c3399bae2a0ea3ce28f5a707f36e",
".artifacts/rd21/settings-fidelity/dark-nb-measurements.json": "070eee626916758bd82eb44452bb749fbf9351994aa86e756f4d38e5dd5efc31",
".artifacts/rd21/settings-fidelity/light-en-after/export.pdf": "d470c3f1c3a3603bbe6f9bb6998c87f7e3f49855da30dd383a41c2463d5d932b",
".artifacts/rd21/settings-fidelity/light-en-after/preview-1.png": "dfa55cc028f07b9e459947df43339eb5f175b4c539caf543fc3a91a1b7fa0340",
".artifacts/rd21/settings-fidelity/light-en-after/preview-2.png": "b31ea6ac52444446643bb4fe8cc79d13df62495d731f3036db65028c62eb7dda",
".artifacts/rd21/settings-fidelity/light-en-after/preview-3.png": "9ae93f15c84a78b6d02e7b55b95072a02c614219d2f53c88c38411657d370933",
".artifacts/rd21/settings-fidelity/light-en-before/export.pdf": "71eb4903f1daf6f60b807499304143336c193edbdc6524b6e4aaec57a7091d90",
".artifacts/rd21/settings-fidelity/light-en-before/preview-1.png": "64e5f6f5c0f974682fae0345e5db154638e00f492dfbac842bf9cdef811881e2",
".artifacts/rd21/settings-fidelity/light-en-before/preview-2.png": "c600a25b013ab109ed922951f7d0a3cfd76473320e7cca66e91c21cd20fd33b5",
".artifacts/rd21/settings-fidelity/light-en-before/preview-3.png": "f95618f08261a7a9a2b606c0ee0fa2300ab3d1a008fc69afe03fcda9f590c70f",
".artifacts/rd21/settings-fidelity/light-en-measurements.json": "1a4946edeb463f9b2b0db48aafb38f3d606daedc0e60ccde7d0f4f16b9ae3059",
".artifacts/rd21/settings-fidelity/light-nb-after/export.pdf": "0b2796d1bd5cc21f651ef9eb9b61d4aa237c83b51ccf44f1f86e374cf064571b",
".artifacts/rd21/settings-fidelity/light-nb-after/preview-1.png": "a67350056d41344ea0d5af214f153a8114f5c1f9877d3a1e11ff3c68c299be50",
".artifacts/rd21/settings-fidelity/light-nb-after/preview-2.png": "f83f366b422966b88b4d77e61db71af1cf80539026b89df07a08708b48fe9212",
".artifacts/rd21/settings-fidelity/light-nb-after/preview-3.png": "273feb28374258ef33fd63b90968b4888f405a8e73513b3bf8360414b436c09a",
".artifacts/rd21/settings-fidelity/light-nb-before/export.pdf": "1309647bc5f05d401a59666c764c4707e660d7c2db18803550552a8924292667",
".artifacts/rd21/settings-fidelity/light-nb-before/preview-1.png": "ec9d3f8434bbda759faba9203e6ba53c443f555c98d16a8f6a92b84eaa900cb2",
".artifacts/rd21/settings-fidelity/light-nb-before/preview-2.png": "5a2435578d25852ec24da607a2c85ed7c3233d30cfc3f5f7e035753b64252797",
".artifacts/rd21/settings-fidelity/light-nb-before/preview-3.png": "512420e7a00329c7fdc871ffa63f46acb4f0c3399bae2a0ea3ce28f5a707f36e",
".artifacts/rd21/settings-fidelity/light-nb-measurements.json": "820037a4593188cabd83304d802adf3d4ae8afa3fafa1bd64f8d500e1d414390",
".artifacts/rd21/settings-fidelity/measurements.json": "4991b0e5f9dfc9df4009290047e4b72dd4120bce2f91f152cb3a31d8158f4d8e",
"scripts/verify-cv-fidelity.py": "64f82e622cc11483c33307d987e969f6cf27f82ab6bdbd72c2aeb1bfbceade87"
},
"outputs": {
"docs/redesign/phase-9/rd21-remediation/fidelity-results.json": "98abd84d63708f1c632e29c8b8d37e1083811979365162ffea2e4e1bf48ea373",
"docs/redesign/phase-9/rd21-remediation/settings-fidelity-results.json": "baf25ba3f32119734b6aacf541648df6d74474274346b7f8d5db256cd0bdbcd9"
},
"commands": [
{
"command": [
"rtk",
"proxy",
"C:\\Users\\Connor\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\python\\python.exe",
"scripts/verify-cv-fidelity.py",
"E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\rd21\\fidelity"
],
"exitCode": 0
},
{
"command": [
"rtk",
"proxy",
"C:\\Users\\Connor\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\python\\python.exe",
"scripts/verify-cv-fidelity.py",
"E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\rd21\\settings-fidelity"
],
"exitCode": 0
}
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,42 @@
# RD21 early frontend review
Read-only source review against the Phase 9 frontend at `8e7e3f6387544e24082ebe2c107c0b868897959e`. Product changes are owned by other agents. No tests, servers, network calls or product edits were performed by this reviewer. This report records source findings, not runtime qualification.
## Actionable findings
1. **High — Generic job edit can acknowledge one snapshot and discard later typing.** `job-tracker-ui/src/components/EditJobDialog.tsx:147` submits the full form, but fields at 196–237 and Cancel at 255 remain active while the request is pending. Success at 172–174 closes the dialog regardless of edits made after submission. `save` at 143 has no synchronous pending ref. Retain the original job version, send `expectedVersion`, prevent duplicate submissions, and either freeze fields/close during save or explicitly preserve newer edits. A failure/conflict must keep the dialog draft and show a persistent recoverable error rather than automatically adopting a newer version.
2. **High — Job loading lacks a request identity guard.** `EditJobDialog.tsx:105–139` neither cancels nor rejects an earlier GET when `jobId`/open changes. A delayed response for A can seed the form after B is selected; subsequent PUT uses the current `jobId`. Keep a generation/job identity check on reads and save completion, clear prior loaded identity while loading, and never enable saving a form whose snapshot belongs to another job. `finally` must also belong to the current request.
3. **High — Keep each expected version paired with the draft it qualifies.** `ApplicationAssets.tsx:525–528` deliberately retains a cover-letter draft while `useAsset.reload` replaces `data` at 63. `ApplicationPackageDraftsSection` similarly retains draft across parent refresh at 855–859. When adding concurrency fields, do not simply attach the newest `data.revision`/prop version to an older draft: that would authorize the stale content after a reload. Retain the base version with the first edited snapshot; advance it on successful acknowledgement or explicit discard/reload/review. A conflict must not trigger automatic stale-content resubmission.
4. **Required contract wiring — Career has local serialization but no cross-session token.** `CareerProfilePage.tsx:149` lacks revision in its response type, `loadProfile` at 337–345 does not retain one, PUT at 999 submits the whole structured profile plus raw text, restore at 234 supplies no current version, accept at 414 submits only low-confidence choices, and parse at 906 submits only text. Add response `revision` and request `expectedVersion` to each canonical writer. The reviewed import diff must retain the revision of the comparison the person approved, not silently substitute a subsequently refreshed version. Existing `profileMutationPending` (177, 229, 405, 902, 991) and `editorDisabled` (456) already serialize/block editor mutations locally. Save/restore/review catches retain the draft or choices; preserve this behavior. Success toast is after the mutation promise (1005/240/421), not before persistence acknowledgement.
## Production caller census
| Write surface | API owner | Production caller / entry point |
|---|---|---|
| Generic job PUT | `EditJobDialog.tsx:147` | Shared dialog mounted in `JobTable.tsx:904` and `ApplicationWorkspacePage.tsx:292–296`; workspace header, overview and notes edit actions all open it. No production `updateJob` wrapper was found. |
| Career PUT | `CareerProfilePage.tsx:999` | Explicit Save of canonical fields and raw CV text. Extracted `career/CareerProfileSections.tsx` sections only update parent state. |
| Career restore | `CareerProfilePage.tsx:234` | History restore; dirty editor blocks it at 229. |
| Import accept | `CareerProfilePage.tsx:414` | Reviewed extraction diff and accepted low-confidence IDs. Dirty editor blocks accept at 405/874. Discard at 415 does not write canonical content. |
| Legacy canonical parse | `CareerProfilePage.tsx:906` | Advanced raw-text parse; must use current canonical version and consume returned revision. It also calls `editStructuredCv` and marks the editor dirty at 907. |
| Extraction queue | `CareerProfilePage.tsx:321,709,727,745` | Upload/rebuild/improve/reprocess enqueue extraction; the explicit accept action is the canonical approval boundary. Do not present queued completion as profile-save acknowledgement. |
| Cover-letter save | `applicationWorkspace.ts:298–299` | `ApplicationAssets.tsx:541`, manual/template/accepted AI text through the shared save function. Retain `CoverLetter.revision`; send it as `expectedVersion`. |
| Cover-letter restore | `applicationWorkspace.ts:300–301` | `ApplicationAssets.tsx:571`; existing dirty-discard confirmation at 559–566 and busy guard remain. |
| Answer/recruiter drafts | `applicationWorkspace.ts:310–311` | `ApplicationAssets.tsx:879`; only mounted by `ApplicationWorkspacePage.tsx:264–270`. Parent overview must expose the job version and pass it with the initial content; consume acknowledged `X-Job-Version` for a subsequent save. |
`types.ts:83` (`JobApplication`) and the overview/CoverLetter types in `applicationWorkspace.ts` must expose the backend token. Preserve existing request wrappers' real completion semantics; no success-on-rejection conversion. `ApplicationAssets.tsx:535–551,555–583,873–890` already has synchronous busy refs, disabled fields and catch paths retaining drafts. Its workspace route uses `key={jobId}` at `ApplicationWorkspacePage.tsx:263,265`, so those mutations are remounted on job change; do not expand a generic shared-hook redesign based only on its boolean `isCurrent` helper.
## Related versus separate boundaries
- **Directly related and now runtime-proven by root:** generic job PUT, cover-letter save/restore, answer/recruiter draft replacement all replace user-owned job snapshot fields. One job-version contract must reach all these callers; generic job PUT includes both `notes` (162) and `coverLetterText` (168), so separate editors cannot be treated as independent aggregates without proof.
- **Career compatibility:** legacy `PUT /auth/profile` still accepts `ProfileCvText` and `ProfileCvStructureJson` (`AuthController.cs:535–536`). Current production `ProfilePage.tsx:320` deliberately submits identity fields only. Root/backend review must classify the legacy blob projection path and preserve that identity-only partial-update behavior; this source inspection alone does not prove it overwrites an existing relational canonical aggregate.
- **Dashboard has an established separate revision contract:** `useDashboardLayout.ts:105` sends revision, 108 only applies acknowledged state when request/owner generation is current, 112–113 keeps draft on conflict, and 95 blocks retry of an unresolved conflict. It is a useful existing pattern, not evidence that RD21 affects Dashboard.
- **CV Builder has its own established version contract:** `cvBuilder.ts:278,284,286`; `CvBuilderEditor.tsx:187–205` serializes saves, advances acknowledged version and stops on conflict; current local drafts can be exported at 344. Preserve canonical-versus-CV override and submitted/frozen boundaries. Do not flatten these into the job/Career token.
- **Settings rules are separate:** `SettingsView.tsx:125–147` waits for PUT, retains failed/newer in-flight edits (140–141), and uses a synchronous saving flag. No RD21 cross-session runtime result was established here; record separately rather than broadening this remediation without proof.
- **Documents/timeline:** submitted-package reads/capture in `applicationWorkspace.ts:302–309` are a separate frozen snapshot boundary. Timeline/checklist/interview mutations are item-scoped/additive APIs, not this generic PUT caller. This review does not assert universal concurrency safety for them.
## Regression obligations for the frontend owner
Cover missing/stale expectedVersion without success acknowledgement, retained editable conflict draft/choices, a delayed old-job GET, pending generic-save typing/close behavior, consecutive saves using the acknowledged token, parent refresh while a draft is dirty, and successful navigation/readback after acknowledgement. Preserve existing serialization, tenant/session interceptors (`api.ts:55–106`), canonical/CV override boundaries and frozen exports. Root owns persisted-state/backend and full regression qualification.
@@ -0,0 +1,49 @@
# RD21 final-review fix wave
Scope: exactly the two findings in final-review.md. Product changes are Program.cs and ApplicationWorkspacePage.tsx; existing ApplicationAssets dirty-draft/revision ownership stays intact. No commits or pushes by this worker. Coordinator documentation changes were preserved.
## Fixes
1. Existing AllowReact CORS policy exposes X-Job-Version. Origins, credentials, CSRF and client fail-closed revision validation are unchanged.
2. Each Answers entry has an identity tied to its job/entry lifetime. The existing aggregate overview loader accepts source fields and revision together, and Answers mounts only after that entry's successful read. Failed reads retain the existing Retry behavior. Late prior-entry/job requests cannot enable the editor. Existing post-save refresh keeps the same editor identity, so the dirty draft guard remains effective. Other workspace tab switches do not all trigger reads; leaving a loaded Answers section skips an unnecessary read, while leaving an unfinished initial read still loads the header.
## RED evidence
- `final-fix-jest-red.log`: 2 failed, 19 skipped. Both new entry tests found stale `42|Saved answer|Saved recruiter message|7` props before a fresh read, including a late-entry race.
- `final-fix-browser-red.log`: 2 failed against the unchanged API and pre-fix static export. Actual cross-origin browser JavaScript observed a 204 but a null X-Job-Version while independent SQLite already held Version 2 and the exact answer marker. The cover-save→Answers case exposed the editable answer textbox while the fresh read was held.
- Preliminary browser harness attempts were not behavioral evidence: one had incorrect environment quoting/default dotnet SDK selection; another used the wrong database column for answers and timed out waiting for the missing read. Corrected assertions use the established Notes answer marker and the final RED log above contains the intended failures.
## Commands and GREEN results
All terminal invocations were prefixed by `rtk`; PowerShell built-ins ran through `rtk proxy powershell -NoProfile -Command`. Paths below are relative to the repository, except the pinned SDK. UI commands ran in job-tracker-ui.
```powershell
# RED Jest
npm test -- --runInBand application-workspace-overlay.test.tsx --testNamePattern='entering Answers|late previous Answers-entry'
# GREEN Jest
npm test -- --runInBand application-workspace-overlay.test.tsx application-assets.test.tsx
# API build
& C:/Users/Connor/.dotnet/dotnet.exe build JobTrackerApi/JobTrackerApi.csproj --configuration Release --no-restore
# Frontend build
$env:NEXT_PUBLIC_API_BASE_URL='http://localhost:5302/api'
npm run build
# Focused lint
npx eslint src/views/ApplicationWorkspacePage.tsx src/application-workspace-overlay.test.tsx --max-warnings=0
# Browser RED and GREEN (GREEN additionally emitted JSON and retained proof attachments)
$env:PLAYWRIGHT_STATIC_EXPORT='true'
$env:PLAYWRIGHT_PREBUILT_EXPORT='true'
$env:DOTNET_ROOT='C:/Users/Connor/.dotnet'
$env:DOTNET_HOST_PATH='C:/Users/Connor/.dotnet/dotnet.exe'
npx playwright test --config=../docs/redesign/phase-9/rd21-remediation/diagnostics/playwright.config.ts persistence.spec.ts --grep 'cross-origin browser|cover-letter save then' --reporter=list,json --output=../.superpowers/sdd/PLAN/final-fix-browser-results
```
- Focused Jest: **55 passed, 2 suites**, final-fix-jest-green.log. Includes four new entry/failed-read/race/navigation tests and existing dirty parent-refresh regression. These are an overlapping subset of the coordinator's eventual broad suite, never additive to it.
- API Release build: **pass, 0 warnings/errors**, final-fix-api-build.log.
- UI static build including TypeScript: **pass**, final-fix-ui-build.log. Rebuilt after final source edits.
- Focused ESLint: **pass, zero warnings**, final-fix-lint.log. An initial unnecessary-dependency warning was fixed by making the entry identity contain its job/active values.
- Browser: **2 passed**, final-fix-browser-green.log/json. Actual JS fetch sees the committed revision; two native consecutive Answers saves acknowledge success and advance revisions with independently read SQLite answer markers. Native cover-letter save advances the shared job revision; subsequent held Answers-entry read exposes no answer textbox; released snapshot allows native answer save using the cover-letter revision and preserves both persisted fields. Attachments contain revision observations and SQLite rows.
- `rtk git diff --check`: pass.
The controlled browser servers use isolated synthetic SQLite data and localhost ports 3300/5302. Existing isolated migration/DataProtection and NO_COLOR/FORCE_COLOR startup warnings remain in logs. No external service calls, production operations or real user data were used.
Broad frontend/backend/browser lanes, MariaDB/provider/deployed/manual qualifications remain with the coordinator. This report is focused regression evidence, not production acceptance.
@@ -0,0 +1,21 @@
# RD21 scoped final re-review
Scope: one re-review of `05a7386..1b89a77`, using the supplied exact diff, final-review.md, final-fix-report.md, connected workspace/draft source, and focused execution log summaries. No new full-branch audit or test execution was performed.
## Finding verdicts
1. **Committed revision header hidden by CORS: ADDRESSED.** `JobTrackerApi/Program.cs:151` explicitly exposes `X-Job-Version` through the existing allowlisted, credentialed policy. The client still rejects missing/invalid committed revisions. The new browser test reads the header using actual page JavaScript and performs two consecutive native Answers saves with direct SQLite assertions, covering the original browser-specific failure rather than only APIRequestContext headers.
2. **Answers initialized from stale sibling-write snapshot: ADDRESSED.** `job-tracker-ui/src/views/ApplicationWorkspacePage.tsx:81-83,142-146,157-165,277` gives each Answers entry a new identity and mounts its editor only after a matching successful overview read. Text fields and revision are accepted together. Request invalidation excludes late prior-entry/job results. Failed initial reads stay closed until retry succeeds. Leaving Answers avoids a redundant read when a workspace snapshot has already been accepted; leaving an unfinished direct-entry read still obtains the header. Existing post-save refresh retains the editor identity, and the unchanged `ApplicationAssets.tsx:858-862` dirty-draft guard keeps a draft paired with its original revision when parent props refresh.
## New material breakage
None identified in this fix diff. No additional fixes requested by this scoped re-review.
## Evidence and assessment
Read log summaries confirm focused Jest **55 passed across 2 suites** and focused browser **2 passed**. The added tests cover delayed prior-entry responses, failed read/retry, leaving an unfinished initial entry, cross-origin header access, consecutive native saves, and cover-letter-to-Answers persistence. These are inspected execution artifacts, not independently rerun tests; the focused results overlap broader suites and must not be added to their totals. API/UI build and lint passes are reported in final-fix-report.md; this review did not independently execute them.
Both code-review findings are closed at `1b89a77`. Broader backend/frontend/browser qualification remains coordinator-owned. Required MariaDB runtime qualification remains unavailable: **formal RD21 closure remains UNRESOLVED** under the unchanged acceptance criteria, even where SQLite implementation evidence passes. This is not Phase 9, Phase 10, production or merge authorization.
No additional behaviors were set aside as new scope judgments in this fix-only review. The prior review's separately identified bounds remain in force. No product, test, database, Git-state, build, browser or external-network operations were performed; only this requested review report was written.
@@ -0,0 +1,34 @@
# RD21 final source review
Reviewed baseline `8e7e3f6387544e24082ebe2c107c0b868897959e` through `05a7386`, using the supplied exact diff, REQUEST.md, PLAN.md, progress ledger, earlier backend reviews, and connected production source. Verdict: **needs fixes** for the two findings below before final qualification.
The main repair is sound in the reviewed paths: source revisions accompany drafts, canonical/Identity/import writes share transactions, EF compares original revisions at the eventual update, and the UI retains rejected drafts. The package draft guard deliberately preserves its original revision when parent props change; keep that property during fixes.
## Findings
### 1. High: expose the committed revision header to browser clients
- Changed consumer: `job-tracker-ui/src/applicationWorkspace.ts:313-316`.
- Connected configuration: `JobTrackerApi/Program.cs:144-152`; default cross-origin client: `job-tracker-ui/src/api.ts:40-47`.
- The new application-drafts client requires `response.headers["x-job-version"]` after the 204 response. The CORS policy allows request headers but never exposes this response header. In the supported localhost UI/API setup, browsers therefore hide it from Axios. The database commits successfully, then the client throws `Missing committed job revision.` and leaves the draft dirty with the previous revision. Retrying that same draft then gets 409.
- This is a false failed-save acknowledgement in an ordinary development configuration, independent of an actual conflicting writer. Same-origin requests and Playwright APIRequestContext calls do not exercise the restriction.
- Suggested fix: expose `X-Job-Version` through the existing credentialed CORS policy. Retain the client's fail-closed validation. Add an actual cross-origin browser Answers save followed by another save, verifying acknowledgement, the advanced revision, and persisted text.
### 2. Medium: open Answers from a fresh coherent snapshot after other workspace writes
- Changed binding: `job-tracker-ui/src/views/ApplicationWorkspacePage.tsx:264-270`.
- Connected lifecycle: `ApplicationWorkspacePage.tsx:127-152,159-176,263`; `job-tracker-ui/src/components/ApplicationAssets.tsx:511-547,849-862,881`.
- The workspace fetches its overview on mount/job/locale changes and selected callbacks. A successful cover-letter save changes the shared job revision but only updates the cover-letter component; it does not refresh the overview. Changing the application subsection does not load the overview either. Opening Answers then initializes its source revision from that older overview. Example: overview revision 7, save letter to revision 8, open Answers, type an answer, save with expectedVersion 7: 409 despite no competing editor. Reopening Answers repeats the same stale initialization until a full workspace reload or another action happens to refresh its overview. CV attachment and other job mutations without an overview refresh can produce the same stale source.
- Suggested fix: fetch a coherent answer/recruiter-text/revision snapshot when entering Answers, or invalidate/refresh the shared overview after all relevant job mutations. Prevent editing before that initial fresh read is accepted; do not merely update a revision independently of its source text, and never replace the revision of an already dirty draft. A cover-letter-only callback fix would leave other shared-job writers unhandled.
- Add a connected workspace regression: load workspace, save a cover letter, switch to Answers, save an answer successfully; retain the existing test that parent refresh cannot authorize an older dirty draft.
## Review bounds and deferred judgments
- Inspected the Career, generic job, cover-letter, application-drafts and legacy tailored-CV replacement paths, revision mapping/migration, exception handling, related frontend consumers, session response interceptor, workspace mount/unmount behavior, and selected deterministic regression source. Earlier task-1/task-2 backend reviews remain complementary evidence, not new execution results.
- Test/build/browser results supplied by the coordinator were not rerun or independently certified here. The supplied full browser run was still pending; partial runs cannot establish full regression acceptance. MariaDB runtime qualification is unavailable and remains outstanding. No production or release-readiness claim is made.
- Existing extraction-run discard-versus-accept lifecycle concurrency was considered but not reproduced or expanded into this changed-contract review. The existing discard command has no canonical replacement payload; any separate lifecycle repair needs its own evidence and coordinator scope ruling.
- No product files, tests, database, Git state, build or browser lanes were changed. Only this requested review artifact was written. No external network calls were made.
## Assessment
**Ready for final acceptance: no, with the two bounded fixes above pending.** Neither finding demonstrates a bypass of the backend stale-write guard; both are user-visible save regressions caused by incomplete integration of the new shared revision contract. Requalify the repaired source, including browser-level acknowledgement and the connected workspace sequence, before reassessing RD21 and Phase 9.
@@ -0,0 +1,33 @@
# SDD ledger — plan: docs/redesign/phase-9/rd21-remediation/PLAN.md
Spec: REQUEST.md in the plan directory. Baseline 8e7e3f6387544e24082ebe2c107c0b868897959e.
Preflight table and rulings are recorded in PLAN.md. No implementation has started.
Original unchanged browser reproduction: exit 0, characterization passes, both lostFirstEdit=true.
This is a reproduced safety failure, not acceptance.
- Task 1: implemented and reviewed with no material findings; 14 dedicated SQLite cases included in full backend 1,109 passing. Report task-1-report.md, review task-1-review.md. Remaining MariaDB runtime lane explicit.
- Task 2: coordinator job infrastructure/related writers and tests implemented. Eight dedicated SQLite cases, three legacy bypass cases (replace one obsolete legacy success test), one migration upgrade/rollback case. Full Release backend 1,109 passed, zero failed/skipped. Backend review requested before commit.
- Task 3: frontend_fix implemented shared dialog/Career/assets revision retention, in-flight locks and late-read guards. Focused 76 passed; full Jest pending. Lint/typecheck pass. Source stable pending whole review.
- Task 4: browser_proof writing isolated direct-SQLite/navigation/session journey. Root full sidecar 56 passed (model load disabled), offline security/tooling checks all exit 0. Browser/build lanes pending frontend completion.
Checkpoint commit 8f2cad6: reproduction, root cause and plan pushed to exact dedicated branch.
Checkpoint commit 12f342c: reviewed Career/job backend repair and tests pushed; full backend 1,109 passed.
Checkpoint commit 05a7386: frontend contracts/draft retention and new browser proof committed locally; final qualification pending before its remote push.
Whole-branch final review found exactly two material integration findings: CORS fails to expose committed job revision header; Answers entry seeds stale cached overview after sibling mutation. One fix-wave implementer assigned both (review_fixes, model gpt-6-astra after original frontend worker hit usage quota).
Pre-wave process-recorded full Jest: 930 passed / 105 suites, zero failed/pending, exit 0; first remediation browser 4/4 exit 0. Ordinary shard 1 interrupted after 22 passes for confirmed review findings; no full-suite claim.
Current build/browser/native lanes reserved for review_fixes targeted RED/GREEN; coordinator owns docs only until released.
Fix wave complete at 1b89a77, committed and pushed. Scoped re-review final-re-review.md: both findings ADDRESSED, no new material finding. Focused actual55 Jest / 2 browser, API/UI build and lint pass. Four new Jest cases are in the existing overlay suite; two new browser cases are in the new remediation diagnostic suite.
Final source frozen: source-manifest.json 878 inputs, SHA256 7487f343786928e90a3c8a740571c29e5c934c80fa822abb80c7a39483e1353b. Final backend Release .artifacts/rd21/backend-final/backend-final.trx:1109 passed/0failed/0skipped, exit0. Final frontend still running via root session23912 (.artifacts/rd21/frontend-final.json+exit when done). Root static checks session93844 (.artifacts/rd21/final-static-checks.json when done).
Root serialized browser pipeline session29901: .artifacts/rd21/final-browser-all.ps1 -> final-remediation6cases -> final-ordinary-shard-1..4 -> final-ai/auth/rate/ingress/pdf/preferences/volume -> final-historical-postfix. Current first5remediation cases pass; sustained follows. All final raw results use final-* prefixes. Source-manifest checks run before each shard and at end. Do not start another build/browser process while this pipeline is active.
Original interrupted ordinary-shard-1.log moved to interrupted-ordinary-shard-1.log (22 actual passes, no full result). Preserve superseded full930Jest and initial4remediation outcomes separately; never add overlapping runs.
Ruling: formal RD21 closure remains UNRESOLVED because the authoritative issue explicitly requires SQLite AND supported MariaDB runtime evidence. Local SQLite implementation can be repaired/verified without falsely closing the full supported-provider requirement. All Docker contexts have absent pipes and no native MariaDB/MySQL command/common installation exists; no install/restart/network fetch attempted.
Pending: exact final results and failures, native PDF oracle (.artifacts/rd21/native-documents.py uses final-shard1 producers), preservation57/33 +56PARTIAL/C11DEFERRED, dated addendum/commands/rulings/review evidence, final doc commit/push/ref equality+clean worktree. No production/Phase10 work. Do not delete this ledger until necessary evidence is copied out.
Root full native evidence: .artifacts/rd21/backend-full/backend-full.trx, 1,109/0/0.
Ruling: related cover letter/application-drafts/structured tailored-CV losses were reproduced directly in SQLite before adding source guards; include them in this repair. Close obsolete /auth/profile projection-only bypass with an explicit 400 and canonical endpoint guidance.
Ruling: field-specific lifecycle commands and distinct settings/other-record writers are reviewed separately; absence of a full-snapshot precondition alone is not a newly reproduced defect.
Ruling: preserve historical diagnostics/data.spec.ts byte-for-byte. Its post-fix unversioned seed must fail closed; a conforming companion will preserve the original A/B ordering and assert rejection + durable state.
Ruling: WSL bash unavailable; installed Git Bash successfully runs skill workspace/brief scripts.
Ruling: exact requested branch already isolated from main, user authorizes autonomous pushes.
Task 1: complete (commits 8f2cad6..12f342c, review clean). Task 2: complete (commits 8f2cad6..12f342c, review clean). Task 3: complete (commits 12f342c..1b89a77, final review findings addressed). Task 4: safe local qualification complete; backend1109/frontend934/ordinary362/contracts23/sidecar56/remediation6/adaptedVolume3; historical16pass2fail+volume2pass1fail retained; formal MariaDB requirement remains open. All878 frozen inputs and PDF/volume hashes stable;57 groups/33 routes,56PARTIAL/C11DEFERRED. Final reporting/publication follows; no production/main/Phase10 action. Rulings copied to REVIEW_RULINGS.md; full ledger preserved in reviews/progress.md and raw archive.
@@ -0,0 +1,9 @@
# Task 1 independent source review
Reviewed the working Career backend patch against `8f2cad6`, REQUEST.md and PLAN Task 1. No actionable correctness/security finding identified in the reviewed change.
Scope: CareerProfileService, CareerProfileController, ProfileCvController parse/diff/accept and pipeline changes, CareerProfile.Version concurrency configuration in JobTrackerContext, Rd21CareerPersistenceTests and associated caller/fixture changes. No product edits or test/server/network runs performed for this review.
Checks included the eventual EF revision comparison, missing/stale preconditions, first-save owner-unique translation, controller-owned transaction scope across canonical row/children/history/Identity/import metadata, failure rollback and tracker clearing, read-only coherent relational snapshot/raw-text reads, restore behavior, unchanged tenant filters and public owner-specific read behavior. The four production canonical replacement callers use explicit expected revisions; no blind-save overload was introduced.
Evidence boundary: test source and the worker's report were inspected; their executions were not independently repeated. The first-save SQLite test starts competing requests after both editors read revision zero; it does not independently exercise the MySQL duplicate-index error branch. Actual MariaDB transaction/constraint qualification, full backend regression and frontend/browser acknowledgement/retention remain coordinator-owned. The worker report explicitly preserves these qualifications and marks its newest revision-zero raw-text case pending the next coordinator run.
@@ -0,0 +1,11 @@
# Task 2 independent source review
Reviewed the working backend change against `8f2cad6`, REQUEST.md and PLAN Task 2. No actionable material correctness/security finding identified in the reviewed change.
Scope: JobApplication.Version; DbContext synchronous/asynchronous SaveChanges revision advancement and concurrency mapping; AddJobRevision migration/model snapshot and migration test; generic job PUT ownership/precondition/event/opportunity handling; legacy tailored CV structured/text and application-draft replacements; cover-letter save/restore and returned revisions; workspace revisions; global concurrency exception handler; legacy AuthController CV-write rejection; dedicated RD21 persistence/authentication fixtures. Production frontend references to the changed job/asset contracts were also searched for compatibility; this is not full frontend lifecycle acceptance.
The caller precondition is checked against the loaded source and the eventual database update independently compares the EF original revision. Forced modification of Version covers otherwise unchanged snapshot saves. Generic PUT saves the opportunity projection and lifecycle events in the same SaveChanges transaction and clears its failed tracked state. Cover-letter history and text share one SaveChanges transaction. Related structured CV state and its job text/revision are likewise committed together. The read DTOs carry their source job revision; 204 endpoints expose the committed revision header. Company reassignment remains tenant filtered.
Writer census check: ordinary tracked partial/background JobApplication writers inherit the new EF token and revision advancement; no production bulk update of editable JobApplication text was found. The existing startup-only owner backfill uses raw SQL for owner assignment, rather than an editor text replacement. CV generation is a server-created replacement whose loaded JobApplication is now guarded at its eventual SaveChanges; existing variant/frozen-document ownership remains separate.
Evidence inspected: `.artifacts/rd21/backend-full/backend-full.trx` counters report 1109 executed/passed, zero failed, error, timeout, aborted or notExecuted. No tests, migrations, servers or network calls were run during this review. The migration regression source covers SQLite upgrade/rollback/content preservation. These checks do not qualify actual MariaDB behavior, browser/session draft retention, or production deployment.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,880 @@
{
"docs/redesign/phase-5/p5-15/p5-15-01/diagnostics/playwright.config.ts": "f05fcaee1d3e63b740677f6974b8be44b07678e9d0eda98e2c696290e39be85d",
"docs/redesign/phase-5/p5-15/p5-15-01/diagnostics/preferences.spec.ts": "697f9ec511d275cd86515c7d0963da152855c78a96edcc692a6a477e02c778f8",
"docs/redesign/phase-9/p9-05/diagnostics/accessibility.spec.ts": "d3f50d569eb46f9a7d7468d798770d481fc8c0819b13543f0dde9d23cb6f3e30",
"docs/redesign/phase-9/p9-05/diagnostics/data.spec.ts": "cb85a99f7af8094a341a2c44073e849924f0261ed63be3e643cb510c9f59c1e6",
"docs/redesign/phase-9/p9-05/diagnostics/matrix.spec.ts": "5ff904f619cc195fc3f8b8d5c74ff482d63a3048da38494b29fed349d4d0c699",
"docs/redesign/phase-9/p9-05/diagnostics/playwright.config.ts": "66918486833e0184cb1920b06186e3cd3a7d62041102162089821c05d12ee614",
"docs/redesign/phase-9/p9-05/diagnostics/sustained.spec.ts": "59a87155e46f27d919549efc402b534ede632aad01ede4194601da4fd6875270",
"docs/redesign/phase-9/p9-05/volume/playwright.config.ts": "0df97a9de76c0bbb9a0035fcec00bda0a665e0e6ba92ae5377bfc20869dac1c6",
"docs/redesign/phase-9/p9-05/volume/volume.spec.ts": "4510f29298f6391b36d27d2634b1f9355802eafcc310488231014fab799a4108",
"docs/redesign/phase-9/rd21-remediation/diagnostics/persistence.spec.ts": "3a41ff274fff9e29522698ce08c79e3b23a9b9c197f24e252b20e43d76d1497c",
"docs/redesign/phase-9/rd21-remediation/diagnostics/playwright.config.ts": "5b655b8d1d28b405893c3ee8fcad4d5c07ed7c1e8c1b20c4dad92ec1d67a813a",
"docs/redesign/phase-9/rd21-remediation/diagnostics/readonly-db-proof.py": "da08c21c5a1f39075a45d1ff92c863ec8fe8d401d0c90ec80b45898e65729d7c",
"docs/redesign/phase-9/rd21-remediation/diagnostics/sustained.spec.ts": "d7c03d76021f546031cb2a2645fc99f0db9eb43ee0ad861fdc91a77c207726cb",
"global.json": "0786ac717bead2cb2c414024d54ddb86b16564be459d6e2b2f9d8114dbb62a9d",
"job-tracker-ui/.dockerignore": "05b7a662f444717be2a279876b84e5d5ecc826a98fb996b6c159cd4b97032751",
"job-tracker-ui/.gitignore": "f077f4d057d2a4fdd8a8ab31b28efb22bbf0ea17c3c2fa01eb4dd3e9f60be4b6",
"job-tracker-ui/ai-tests/cv-ai-readiness.spec.ts": "01ba143cd9c00840e9b3284afeced7a3e64a5eda56c8fa9965a59d9ec8bb8408",
"job-tracker-ui/app/[[...slug]]/ClientShell.tsx": "5349891972b4b148afa7b71b7b3c2b0b50c4581022f7a59993c72235cfbc7a6b",
"job-tracker-ui/app/layout.tsx": "8e4f0cd2776d821c958480aec5c93943674acb0fe28cd60d0822df40009cb262",
"job-tracker-ui/app/page.tsx": "bf661f17c1c7c06ff8fda41b1afa44144bce694c815d52c3d5a927e32063b1b1",
"job-tracker-ui/auth-tests/auth-recovery.spec.ts": "48c09a5192b195c602b12f3b9099764236204f3602ecaf94f11022fdda2c4641",
"job-tracker-ui/configure-nginx-origin.sh": "142a4f5d2cb348b636eda7602d17d4a7313fa22644933008b7fee8b094110b20",
"job-tracker-ui/Dockerfile": "d60cbfa877823b724d3158f4ae06ee21f386f4a005d4817cff86c0d7403829ec",
"job-tracker-ui/e2e/accessibility.spec.ts": "8cd724183b6c1dd4e5b47f358afe9bd71e2ee1fac889a8c1ac01f93ab7e23f81",
"job-tracker-ui/e2e/account-isolation.spec.ts": "8005e2a5f5d6834b1b7e685d23f9cc044fdf25340b4af9b14014fce3dfc99178",
"job-tracker-ui/e2e/analytics-auth-repair.spec.ts": "03560be9bfff4d410866b5498f2a0b05ba1d9733a7ccbf8cde24f6d8e08cd4eb",
"job-tracker-ui/e2e/analytics-presentation.spec.ts": "3ff21176ee84f1dff818917f6e73cc2fad0c63d421f6d08fa3368058e54b765a",
"job-tracker-ui/e2e/board-presentation.spec.ts": "5f99a88d9d49a1749449390fa7380c04fbc972ac57086ebeffeb5ec5a9b738f0",
"job-tracker-ui/e2e/browser-zoom-audit.spec.ts": "558af8ff4cf42eead867d1bf0a2bde9327b2a092a591aa277ac11ecc6b4f0f31",
"job-tracker-ui/e2e/builder-preview-keyboard.spec.ts": "5b17b1d4e7b04fe4fbfc6147ad9bdf320ab248e8c45aa8c0300e296d4c3f5086",
"job-tracker-ui/e2e/csv-export.spec.ts": "8c02ff73f975b1073038b81f2b2d5dde187b8d25ed81b195f1006562c6b2b082",
"job-tracker-ui/e2e/cv-editor-frame.spec.ts": "aa235e5483f940bfc7ffd770c4080b5d83f64180db0bbc10282f771d386b6c27",
"job-tracker-ui/e2e/cv-pagination.spec.ts": "507829402816ea4d977f2b46d95f71c90c75fc5abd60cd6f3dddeefbfb83d6f8",
"job-tracker-ui/e2e/cv-preview-presentation.spec.ts": "534575f420ba21c6bd7c8e4d9fa883c51a5b29706b4f967e6ce7a4780e381b05",
"job-tracker-ui/e2e/cv-readiness.spec.ts": "ecfb325c3452289570859928115daafc7aa161992b23524c1aa951d7d9ff9765",
"job-tracker-ui/e2e/cv-responsive-workflow.spec.ts": "2fcbf4015466b2c7abf787a870da96a248a8766d0225329cf18c7f9c549f0907",
"job-tracker-ui/e2e/cv-section-scope.spec.ts": "646bd0835836f3e10a256645f5339c0a2d6a0512d911a599704bc3c7c3854e11",
"job-tracker-ui/e2e/cv-settings-presentation.spec.ts": "8372a47699436fc272637c11a26a25dcfb13d098d389b135c225665f3d20b66a",
"job-tracker-ui/e2e/dashboard-presentation.spec.ts": "b7b83f6d58a92195257abbda62564feb8124e2e2d8660c2ef5fda5a5480537a9",
"job-tracker-ui/e2e/functional-acceptance.spec.ts": "fbba35f4ccdae767e5a4d87623f190bb348ce3ecd1eb7a4248316d6822fa3dd0",
"job-tracker-ui/e2e/helpers/seed-career-review.py": "ffab6b9f8a31fdba30e1ab70a55807defed44951878d4a634ada82001ebe39fd",
"job-tracker-ui/e2e/helpers/seed-operation.py": "1a786c3b6794f15234426b0ae956ef300f0c55aee990ac2cb427b6191555af45",
"job-tracker-ui/e2e/job-discovery.spec.ts": "c6bb9fe3c5e11f732e5f0c9bbb7096268b02c2c7540f58d5ef84bc537b5a6142",
"job-tracker-ui/e2e/job-overview-presentation.spec.ts": "f17df8104db8bf202765939344ee7058c687c0a6e5b083936b5ee7bb7b02465b",
"job-tracker-ui/e2e/job-sections-presentation.spec.ts": "6e17bd68063dc01823a15af28958c07c30bb8e0e65585069fe90777d26bb82b3",
"job-tracker-ui/e2e/kanban-theme.spec.ts": "3df2d2e6e3d459492331ff429c7bfc19064563110df39ac53d40093a0d8f3225",
"job-tracker-ui/e2e/landing-presentation.spec.ts": "856a724ad98c87f5b6d18f8c64ed03a1ff8acdfe44268d167b1c04bcd2bbf10a",
"job-tracker-ui/e2e/named-controls-modal-state.spec.ts": "f3a14536fa029829ced37878dc8b9c12b8c203abeafc059626857c1760d81844",
"job-tracker-ui/e2e/phase7-account-security.spec.ts": "d4386954cf9e54066d84c4801ac6fe61a538d110c4c025b6255d2cf3aa74fdf5",
"job-tracker-ui/e2e/phase7-admin-audit.spec.ts": "3737f20446d56bc6e61ba249b2c13316314aa0bfde6e7ff2202a781d3f793d6f",
"job-tracker-ui/e2e/phase7-admin-system.spec.ts": "1e4dc4a33587adcc8f2f4cc23f83a2d7f47b589d0fa4b81977187d5849dbce37",
"job-tracker-ui/e2e/phase7-admin-users.spec.ts": "223455bb5db867053e340fce533ec024388f40413facb6041b8bce779d782e90",
"job-tracker-ui/e2e/phase7-application-forms.spec.ts": "ea1674524342e302f3209cb5378b7f387a3077aff896b1408488c4e70888c864",
"job-tracker-ui/e2e/phase7-authentication.spec.ts": "62aa7d5941d047a764d06653641e5dc714c5ce5b335b017b385622cc629a7f9f",
"job-tracker-ui/e2e/phase7-career-editor.spec.ts": "4cafb5dc0fc152a6cc6a99629229d2a2aa58d60c39f42ed9b01f5abb0edb8e7c",
"job-tracker-ui/e2e/phase7-career-import-review.spec.ts": "6da172373425ebe4a36238a676fef5273dfa852e98a336e1145cb0c46f0487e9",
"job-tracker-ui/e2e/phase7-career-overview.spec.ts": "ee8564c4b16ca01db96c8f23b9c2cf67881ae675c3203f95b5b1f57d00c040bc",
"job-tracker-ui/e2e/phase7-career-source-ids.spec.ts": "b481d21a616680ad6f926c000d9a161fa0dfbfff1ee2a4997a76d60b65637fb2",
"job-tracker-ui/e2e/phase7-companies.spec.ts": "44937bc1e0471e3ce76e947b3b462b818701a93ccfc8f746632c640dec4a0f6a",
"job-tracker-ui/e2e/phase7-correspondence-compose.spec.ts": "5cb7a8f67926eb8abaf87e740eef5192921a52d39d14cbdad556476d4e818f0d",
"job-tracker-ui/e2e/phase7-correspondence-read.spec.ts": "5bedf8e8d62b2482afe27883fb2b3d77981eaab0f3abfc3f265122b55c19938e",
"job-tracker-ui/e2e/phase7-cv-library.spec.ts": "1d05b458b9280d222baa9f0c8880ecffa6554c1a1dfc4a512c90a07494256aa2",
"job-tracker-ui/e2e/phase7-discovery.spec.ts": "8d18edaad34462517eca31cf334dfd894dc0f1ab0a9ffce3440bf9716bd1ab8d",
"job-tracker-ui/e2e/phase7-documents-contract.spec.ts": "aca359ec044332ed688bd108352c28d6f4c960c8201dd4a7853b6281d341f483",
"job-tracker-ui/e2e/phase7-documents.spec.ts": "d6a341cef3583bc5610727f21621f72bb08a6430cae4888f85bde1704f1d5ed4",
"job-tracker-ui/e2e/phase7-job-import.spec.ts": "c16a82463eeeeee52430fff4cf71139586225c150db8cee1f1c572c9e17635b2",
"job-tracker-ui/e2e/phase7-notifications.spec.ts": "7764aa91a390316459a6151ea7b59eeb284e0ee7d6e31d100ff4edc678bdcd82",
"job-tracker-ui/e2e/phase7-oauth-sender.spec.ts": "ae3600200122855ca7daf2bbf10c26f0eddc5600502b5d697fb6bdfd95b590c1",
"job-tracker-ui/e2e/phase7-offers.spec.ts": "b4a33fd4cccdc6cb50fc4667f430b82f3dd7fedc3c6f95453b0dde7719febcef",
"job-tracker-ui/e2e/phase7-onboarding.spec.ts": "4f6124194f97381b6ec389cd1d6b95c3ebb791133573693aa4f272e17101d729",
"job-tracker-ui/e2e/phase7-operations.spec.ts": "9a3ef4c0c6cd484349241b8ce1e378a2e456db152d2ab2cc2669a0b8fea29514",
"job-tracker-ui/e2e/phase7-public-cv.spec.ts": "7f4546a25845cdd2a85d5f1c7f942a0eea520d6df7ece45a93e87af31f998028",
"job-tracker-ui/e2e/phase7-reminders.spec.ts": "d44acacdab18749183000630001714f1aa603bddc89f2178437f5cc3e847c371",
"job-tracker-ui/e2e/phase7-settings-preferences.spec.ts": "6269a229d0caecc5b248490bfd7e1c820220494c278f204cca3085db2096f9cc",
"job-tracker-ui/e2e/phase8-dashboard-customisation.spec.ts": "a1638b7a1c92db68862dc1e7f0a2adf2cbfeecba5369b9b15e13a1840de5efa2",
"job-tracker-ui/e2e/redesign-preservation.spec.ts": "c0f1d4da11e4e2fec94115096351ca1c7d673aa298afe74511c24f0c30d0ced4",
"job-tracker-ui/e2e/responsive-accessibility-audit.spec.ts": "73694aefa8c04a01c294dde0cab399748c452f12d72d37f7b8a69c0d2ec99301",
"job-tracker-ui/e2e/rules-draft-repair.spec.ts": "62399159f0c2fc7a748eb1157d0fedda03d2d96f53787273539023f37be8b473",
"job-tracker-ui/e2e/saved-search-repair.spec.ts": "d18d064da6ebba4ba9096076c061addfdf103c9ed4cc504d07e3263a494d61f8",
"job-tracker-ui/e2e/semantic-foundations.spec.ts": "69e5985b6ddf84998ae094bbc26ca106a3b78d342b1173b25cba3ad5fb225676",
"job-tracker-ui/e2e/settings-page-layout.spec.ts": "2db9a988be4664539d78250c93cc2ca98b85379b6294e6762b8ffb9213396acd",
"job-tracker-ui/e2e/shell-readiness.spec.ts": "e19980657ab84e7f53163de32be180ed5f027f2d1d12d397a0d43dff9095e9b6",
"job-tracker-ui/e2e/smoke.spec.ts": "64f040a8484fe3c889ffcf04dc1e2917dd7cc0f9ded128c04d371c17f506e31d",
"job-tracker-ui/e2e/table-density.spec.ts": "73f2376c87d839c5579907e313e33d65bd87887d6c99bda17c6199589a53b3b5",
"job-tracker-ui/eslint.config.mjs": "8c3e8cbc26ab07004c12fe2d642954e837c9160480b92ae5f2e990e3b7cdb34b",
"job-tracker-ui/ingress-tests/production.spec.ts": "7a4096956f680deac7953f327ef08a2490fd751a0abeaf47b32c15a07debd08d",
"job-tracker-ui/jest.config.cjs": "de323cd3aa8693b11a028b2c026682f05ab988d182ed860861a051d66e53c286",
"job-tracker-ui/next.config.js": "1880fe670eac903f4512201f033df7eb685eb5f9e1cf274c81b848118a28285e",
"job-tracker-ui/nginx.conf.template": "fbf478ccf84d7abad36155f56b3c06b0428b9c255cbca3c57473312d391435cc",
"job-tracker-ui/out/404.html": "705b2d4e4a443b20ea99d6fedc7deea98e69e29dabe1ee9653cfc2288bf62491",
"job-tracker-ui/out/__next.__PAGE__.txt": "87e8e2feb869e7ecf54eb05e81e6fe7895d637ae40bda32559146ed740b3ec50",
"job-tracker-ui/out/__next._full.txt": "bb49a4d6184325ff82400dbf2978695e8effceb7253acebd75e98b5e747dbb07",
"job-tracker-ui/out/__next._tree.txt": "bd236c284d549c35141fa8b19372a9a2cd429e3a63fe2cf51b24b13f596d5ac1",
"job-tracker-ui/out/_next/static/chunks/00isz1t57y6zz.js": "a5abd7c3f7d9ade9df964c5f278fc3661f9118bdd97042298d47065f078358d2",
"job-tracker-ui/out/_next/static/chunks/01_zelzaw_93n.js": "7ef5d00f58f698e33e1e6e996d92a2fd9aa49a7521ee58de9296f25429f942d8",
"job-tracker-ui/out/_next/static/chunks/035759_jwo3d2.js": "d130d6ae20af93e585ff79b3c22443e790f69c3c0bdbd035b8505c9bd70bd8b7",
"job-tracker-ui/out/_next/static/chunks/05shv2d_zm3i3.js": "7482c56a86473bff770b6b12e0b898b2b00eb1735fa0c6cc0c7924e4528875c7",
"job-tracker-ui/out/_next/static/chunks/0690wjwt7bfbl.js": "4ac559d5a8eeb9b69ae8368c4451b105fc32a527aec05d0ce62aca7df399bd1a",
"job-tracker-ui/out/_next/static/chunks/069gggqf9ja_6.js": "8e8ead5ec17cf660d98fa33de335184d7baa59f6c434318a5f4e802067407e81",
"job-tracker-ui/out/_next/static/chunks/0_5_ijn4eu7en.js": "3598e5856880252529d722e786648d2ada0cf8f018d69019bbbd16bb40810e95",
"job-tracker-ui/out/_next/static/chunks/0cz1d0mv5g_q7.js": "0973c1d64c88adc8e3c950410cb58b288f72118d5965b78049438deb8f2f9683",
"job-tracker-ui/out/_next/static/chunks/0f20amr0-m-zl.js": "70b0fb6db2fa0749d01768823746641975bfc42a65e133a2b138e4aae0ba660b",
"job-tracker-ui/out/_next/static/chunks/0g8jdam99b7-z.js": "94264307de5eb80b0e87dfd263607fe24b5cb19d6008184ab6b107a4873b49ac",
"job-tracker-ui/out/_next/static/chunks/0j0knhby2z3dq.js": "e365e828e8c106199b7e7239a90a7741dba00cb223d923897b78cfc92c285baf",
"job-tracker-ui/out/_next/static/chunks/0lfuwd98rim9r.js": "db3216f3501d53c517031483d281466eb08c5054d83bb0d5009731e5fbaf3a1f",
"job-tracker-ui/out/_next/static/chunks/0m7vi4hs61md9.js": "b098d60b98930bfa895489a42ae534227e2e44e2c888aaa1a139fadbe700d119",
"job-tracker-ui/out/_next/static/chunks/0myaa6-57ckp2.js": "878352584a7287933b261fb99ab8f1e56543aa2fd3af56110e51557f269116c5",
"job-tracker-ui/out/_next/static/chunks/0swqvzc1gm8tm.js": "ace5778cc960bb904ab2b77085d6c6ee4b9efc9d95023d3100a8f850af6512b0",
"job-tracker-ui/out/_next/static/chunks/0uhbv1nac-e82.js": "c36111da5402603db32172c4cd5456207471df2892b17d1e31898d9942354537",
"job-tracker-ui/out/_next/static/chunks/0w3y5uv0hr947.js": "94b0774abaaa0aaf1f6f324d72982fcec39061a97602b8d27d7550e2076ab0c0",
"job-tracker-ui/out/_next/static/chunks/0wocm9tppr2sv.js": "ed5021ca2747cc00526751dbdd66a4d99c243dfd2556781a0ec0ea03032f5f10",
"job-tracker-ui/out/_next/static/chunks/0xtkescovpyfz.js": "67650f803110e67853412c9f48d70fb7120535d5c1706cde914e9297db357c78",
"job-tracker-ui/out/_next/static/chunks/0zwp_bvf6-sm5.js": "2285f236f115f36a48f71ec91993d967725f33f208fe5c0e02036f03ea8cb6f3",
"job-tracker-ui/out/_next/static/chunks/115kc7_5ymkx5.js": "10f46f281ab1e151b96d93b374fb311236ad9e090c492f26fd78b9201e2ebab9",
"job-tracker-ui/out/_next/static/chunks/16ofit5cz_ak3.js": "3f17e8f9df8783b47bed0a7632e9e75c144c0528dfc5c056c1df1cadec9505ea",
"job-tracker-ui/out/_next/static/chunks/1bo5vruln9ro7.js": "d3c3fd8cd9086e741993371e2a1c847f9262a11c5ff4ac15ca956143a8ad68e2",
"job-tracker-ui/out/_next/static/chunks/1gjjzemw1bkq9.js": "f21eb1091455a5a61e2b11c10d55aa51303ca50341bff82ce33dc17819f0a92f",
"job-tracker-ui/out/_next/static/chunks/1k_5axiqq7um2.js": "d4cc9b89e854d02a65428f540dbda1845849d96e994a56a20c5e441db99e2f23",
"job-tracker-ui/out/_next/static/chunks/1owxpom4r3xpr.js": "372368d3aba84cb4a23eca2694bc554d50575b341a8b73e2074c4fac820beb7b",
"job-tracker-ui/out/_next/static/chunks/1pqrh1ggibl7x.js": "23fed1e18eee99f5875f60a599c236fb527f046fff7fe0488aeb4b2441f54908",
"job-tracker-ui/out/_next/static/chunks/1qh6a3h1ymggl.js": "d978e1cedc7f1a23cdf6f4f26da473fc5815b700a01721bd74de2c40a6247871",
"job-tracker-ui/out/_next/static/chunks/1rllbyp7b_ttp.js": "9fecabb65fb48cc039c00aad586a0987f994b0f0e88c28185eb7a3a6e402eb65",
"job-tracker-ui/out/_next/static/chunks/1tux-ir357mtx.js": "85312ec82852d9cd4da5e4910d90cd862a776556f23c90bb180a45be5b659551",
"job-tracker-ui/out/_next/static/chunks/1vjm2fk23r5kh.js": "a5720dd1ceb2b511ce89f809366c8ce4b63318b52a90368f50fa1e17f2e14237",
"job-tracker-ui/out/_next/static/chunks/1xwc-b795syag.css": "f73c002233f931ca14d0ae58815c47ca9f2659f25b1547a6d1fdca12a2a00b3f",
"job-tracker-ui/out/_next/static/chunks/2aoqedway9mw0.js": "8931dbd823bb6b3bd3d74e2c1353c934c4b65307969e66450c1750943406ba7a",
"job-tracker-ui/out/_next/static/chunks/2bzb54mytl60n.js": "4a185dd7f705e463301cc6c3637eab4f16c66f12c4d74fe7fac9793ef6a945d5",
"job-tracker-ui/out/_next/static/chunks/2e2n0wy891_-d.js": "3436d9be1827de975577e7fcc84eaf322dcd2ab163c3534fd4b485814e7e831f",
"job-tracker-ui/out/_next/static/chunks/2kxux5nynitrn.js": "caf3877cfaa369a777710fed7120c04b9a8eecade88cf9cbecb1a15a7ef1df0e",
"job-tracker-ui/out/_next/static/chunks/2onuriq_1xzzc.js": "7b32cf09d736d33566e4bca97571ca38cbd66794b8008d6275495de6f2cafad4",
"job-tracker-ui/out/_next/static/chunks/2pbbh0hc6t9wu.js": "a7294ee04c85689d3030c037b85423c5606f7a00bff0e2df2136383f0f3beec2",
"job-tracker-ui/out/_next/static/chunks/2vlttipo05xfv.js": "a17d6235f5f3d618b8d0c03fcafe6ee624088571c8b29f1f6d8800f8f57bccf2",
"job-tracker-ui/out/_next/static/chunks/2ygcif9043xun.js": "5b2f31e6415195eab37a9362098b434bf0c1f41646a57e2f9e7715506bc04d5f",
"job-tracker-ui/out/_next/static/chunks/30u_w9im0zfmz.js": "56f17b0c9102fc1418a8adec566e878e34a8772ae1b7c808659560e17cd5ccc6",
"job-tracker-ui/out/_next/static/chunks/351q7ugo59r3m.js": "dffbb098e5ee3376f6215d986202915f17fbb4d7de1f00e01c9cc304ff57fd0f",
"job-tracker-ui/out/_next/static/chunks/36dfxkkrq5vbl.js": "fa8b95fb73cd8bba3b62bd51526043e70977513a1b8fe3ddfdd20c722bc854ab",
"job-tracker-ui/out/_next/static/chunks/3_am-fyclheic.js": "978e7e774695b20fb9591326ff3eedd3d060eb046f8fcf00d89efe20dc01ffb9",
"job-tracker-ui/out/_next/static/chunks/3_caw2ltz6rml.js": "8acbe66a92b7e4e09c7fd4d846d7947af78bfc96a82aa39fd95e51b4ea0b1952",
"job-tracker-ui/out/_next/static/chunks/3ax4vrz5w_gjt.js": "16dbe61792aa6fa70ec3cc4f5634a88ac4cbfbb943b80cae1087cfd64dc6c008",
"job-tracker-ui/out/_next/static/chunks/3ffc2l449srya.js": "b8385d6638c4c0f117e442ebec4ff39eec5187ea72f090885314b4ee06d66d33",
"job-tracker-ui/out/_next/static/chunks/3i298g3ipj6-h.js": "f6f1ce0c2cd1956fef9cbb9c7802d5a11cd5137357374175d60324d8f8fed496",
"job-tracker-ui/out/_next/static/chunks/3kk_px_uflpbr.js": "6308b118660dc7e1fae84ebb596c792528938d1133fd0c66c389b27a18041deb",
"job-tracker-ui/out/_next/static/chunks/3q9pcshluw1av.js": "d8acce18001ee0232c728d93c5f4a9f01021850455399b542e5317d715754cd6",
"job-tracker-ui/out/_next/static/chunks/3t4zlerpupcoq.js": "b1b1cc211c58922939677aaad111dd106a98ffd9e08a40dff208f8c4d9e7a95b",
"job-tracker-ui/out/_next/static/chunks/3wi4ei8dsihay.js": "56ff128469b14721092d27a5644f1eb532bd3d81430edccc854817ce0cfaedc5",
"job-tracker-ui/out/_next/static/chunks/3xrk4q-css54o.js": "b5357e142a83e4913f1f6f6f863da55319943938074b2e0d6fa7860106c8a48f",
"job-tracker-ui/out/_next/static/chunks/42p8__52-eg_x.js": "9951df23b044b5b1e4b68691f8e343ff5a6d2c9fc7c10f6f9a558dcee78381ce",
"job-tracker-ui/out/_next/static/chunks/turbopack-1oyia4ingkihb.js": "230baf90335e80ece7560ebc8326cbf8dc22c572b13ce7c96521afdacb4260c9",
"job-tracker-ui/out/_next/static/j4kAei3n646awmfgHgnUj/_buildManifest.js": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea",
"job-tracker-ui/out/_next/static/j4kAei3n646awmfgHgnUj/_clientMiddlewareManifest.js": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a",
"job-tracker-ui/out/_next/static/j4kAei3n646awmfgHgnUj/_ssgManifest.js": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00",
"job-tracker-ui/out/_not-found/__next._full.txt": "5071e53a6cb20e0c28deda1b78fbc4a69b26b0539053d075a6cf11f54a5c7ca9",
"job-tracker-ui/out/_not-found/__next._not-found/__PAGE__.txt": "ed56c9b86ca9a92d35a88227d2cbf6e498d162f16e1b63f639750ea9a2060bdf",
"job-tracker-ui/out/_not-found/__next._tree.txt": "5266991c2b671b8334f3b82ddbff66a3b550b9075bcb6b8b79c64c6c6bce1922",
"job-tracker-ui/out/_not-found.html": "705b2d4e4a443b20ea99d6fedc7deea98e69e29dabe1ee9653cfc2288bf62491",
"job-tracker-ui/out/_not-found.txt": "5071e53a6cb20e0c28deda1b78fbc4a69b26b0539053d075a6cf11f54a5c7ca9",
"job-tracker-ui/out/favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a",
"job-tracker-ui/out/favicon.svg": "f46bb75bd17edaa86713a92b40774be5055bc2bd5f49223b3891fbe9a5d068cb",
"job-tracker-ui/out/index.html": "ebb55cf86f1de8466c6465c79b9926c7b589e38e72e3dc25791fb931ca7b6e93",
"job-tracker-ui/out/index.txt": "bb49a4d6184325ff82400dbf2978695e8effceb7253acebd75e98b5e747dbb07",
"job-tracker-ui/out/logo192.png": "bc652031597fabd19b9f14e22a71f809490d218037521b3b64d013418c1390b4",
"job-tracker-ui/out/logo512.png": "5129e9bc1ba812b711fd9a646d3a38a906d365a26ee685df183b8752458944d4",
"job-tracker-ui/out/manifest.json": "2667ce63c2e0835b7007239816a5597639321d333da396a78638dfa9e8a7c935",
"job-tracker-ui/out/mockups/dashboard.svg": "318be3adb1324c26eb30f05572a29528a3e38331c6a604652eef75b54f8c29dc",
"job-tracker-ui/out/mockups/pipeline.svg": "db2ef41faabeb90e7ce85413e168581686c54535d970fc7d8deda3888a479de4",
"job-tracker-ui/out/mockups/workspace.svg": "9bbab22349147c7b01d6e18c93c622a6f8aed6dedaf23715189ab54d60e1ddbd",
"job-tracker-ui/out/robots.txt": "90d24bc3bf698ac1e173739502298ccca72adf1f564fab05f484b8c48d1cadd2",
"job-tracker-ui/package-lock.json": "d5207da6d5a12b246b3b7679d8261da19847fc67425c75e6ae61446dd57e9710",
"job-tracker-ui/package.json": "300c296ce733f60c0ca8204d81bb0b69bc8131759bcf77b8961e23bac2c7e41c",
"job-tracker-ui/pdf-tests/admission.spec.ts": "655638a32c2ac7defa4f80f8ba5faafc35197d4b3f24552c238189fe97d50818",
"job-tracker-ui/playwright.auth-recovery.config.ts": "e1398a2ca5da83ae4fcb5f7486025ad57972d1c8c9e59f5045cc0fc4771ffb46",
"job-tracker-ui/playwright.config.ts": "54b4e8bab68a6ce5335450bf664d4b6e0f81bb2cd79fbb198833a9db5f4ecbda",
"job-tracker-ui/playwright.cv-ai.config.ts": "656db4a7910adc37b907c68a0c6a92477b6d3a5295f2b11e5410efc2fae79661",
"job-tracker-ui/playwright.ingress.config.ts": "6d59e19cc3ae54b9e092cf93ef49af357f316d6bccf770f1a45cbe7627b506c6",
"job-tracker-ui/playwright.pdf.config.ts": "0c5aa20eeadcc078cd8589610cd3b21ff3d0a02b1158f6c499a2f6b83a832fe5",
"job-tracker-ui/playwright.rate-limits.config.ts": "a13a8376e4761fd110107c75617b7814c005e743c10234e6d378fd1ac817771b",
"job-tracker-ui/public/favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a",
"job-tracker-ui/public/favicon.svg": "f46bb75bd17edaa86713a92b40774be5055bc2bd5f49223b3891fbe9a5d068cb",
"job-tracker-ui/public/logo192.png": "bc652031597fabd19b9f14e22a71f809490d218037521b3b64d013418c1390b4",
"job-tracker-ui/public/logo512.png": "5129e9bc1ba812b711fd9a646d3a38a906d365a26ee685df183b8752458944d4",
"job-tracker-ui/public/manifest.json": "2667ce63c2e0835b7007239816a5597639321d333da396a78638dfa9e8a7c935",
"job-tracker-ui/public/mockups/dashboard.svg": "318be3adb1324c26eb30f05572a29528a3e38331c6a604652eef75b54f8c29dc",
"job-tracker-ui/public/mockups/pipeline.svg": "db2ef41faabeb90e7ce85413e168581686c54535d970fc7d8deda3888a479de4",
"job-tracker-ui/public/mockups/workspace.svg": "9bbab22349147c7b01d6e18c93c622a6f8aed6dedaf23715189ab54d60e1ddbd",
"job-tracker-ui/public/robots.txt": "90d24bc3bf698ac1e173739502298ccca72adf1f564fab05f484b8c48d1cadd2",
"job-tracker-ui/rate-limit-tests/isolation.spec.ts": "ef312e87a0278d9e05396f47d8381b0f98c98506edc81d9431564ddfe18de40f",
"job-tracker-ui/README.md": "f288ee8bd8632e719591263fdc6819ace371a92bd63f576a2810c7884eda6d4f",
"job-tracker-ui/scripts/audit-dependencies.mjs": "e21fac167cbd959931be662cccd6471113cb2a6d1372eed4ee1136bbe46f3a73",
"job-tracker-ui/scripts/audit-dependencies.test.mjs": "1b32ed07beaa72e8bc7d08fe322c5d545a4715911b2cdb2cf66c6ce5a972e3a2",
"job-tracker-ui/scripts/cv-ai-provider-fixture.mjs": "bbfb9679bc7be0e8bd519f82ad6523ccd3787767a38090881958744d9e106c88",
"job-tracker-ui/scripts/localSMTPfixture.mjs": "e3c40cff692e40ebd34f9b51213298306681255767435c1c05c789dd813e61da",
"job-tracker-ui/scripts/localSMTPfixture.test.mjs": "0e0e08ed79aa3547aee3230f453f9ffe4ada22f02e0221cf0d3acbf7bd2db30b",
"job-tracker-ui/scripts/run-e2e.mjs": "021aa5ec9c9a323be0cac947e23ff329b1b4f7af7381f65b7bf2b3aced6b38fa",
"job-tracker-ui/scripts/serve-export.mjs": "ba20dfdb2ff301a07918d4858942dfa9e4e78923c78dcfac4288de343bba6587",
"job-tracker-ui/src/account-data-export.test.tsx": "0494c6d384f18c6444986d912dd9de0cdf2715a9e38e436b19d525c6bd7af293",
"job-tracker-ui/src/account-providers.test.tsx": "fbb7748829fe01fa33e977a0c77bd8bc5b850a33fb43866a37c81962c090c664",
"job-tracker-ui/src/account-scoped-state.test.tsx": "498f2ba2078c74b483791e1f02f55c80cf7bd4f8311a3c3177784c99fabeb42c",
"job-tracker-ui/src/account-security-flows.test.tsx": "8ff99509f50342fbb8ada67ec5f646404ac60773f2d72c84b772aca063c7cc8b",
"job-tracker-ui/src/account-security-presentation.test.tsx": "12f8fc05eea372c6b1b7d60907f14845a23dcf79b7f44848ad04eb80ae5a0d35",
"job-tracker-ui/src/accountPlan.tsx": "f3efd0ecfdad4b1a5aff34203290b25b880fa9c57735ad3f2ed771a4e8b1f876",
"job-tracker-ui/src/admin-audit-page.test.tsx": "45f2a6274f465aa0c2b805d1ef163cee920b806827b2f3199ef7f89d76b1de3f",
"job-tracker-ui/src/admin-system-page.test.tsx": "0bca15c42206c31e2bdee9f81a362fa1c75045892b410f87688af3927530f216",
"job-tracker-ui/src/admin-users-page.test.tsx": "9f9a5512da38ff0e6b878cad1c429ebf8904ae33245ba523ee88c24a14100ba3",
"job-tracker-ui/src/ai-privacy-settings.test.tsx": "a53eda1c305cc9e3ab16a4f52603a8cb6d881aa58e88a22e112eb33103c5a404",
"job-tracker-ui/src/ai-section-assistant.test.tsx": "a883f25f2139b3104df84f86330e92684a19ad37be456a6291ed0fd921ef6631",
"job-tracker-ui/src/ai-usage-card.test.tsx": "922d3c18cce51df0ed0ba89bf1dd383bc8611f2323fbcb51677c3562808a87a9",
"job-tracker-ui/src/aiWorkspace.ts": "55312d91057b4299833874d331c1ce6bc99b3ee51123e20b488a35181bad5a4d",
"job-tracker-ui/src/analytics-presentation.test.tsx": "9f5d37200f780f972a80970f886957bb11e2f49e4d7b87b1b6dc05a066b3e049",
"job-tracker-ui/src/api-error-localisation.test.ts": "7d0ebc8a171c21506e0f941ec2b3e3e93daf1437c1dc67f987e56869c9106d46",
"job-tracker-ui/src/api.ts": "bec8dc665fef61f3c88938e9a61dda786a16008d6af9bc7688bdd615e7ba337c",
"job-tracker-ui/src/app-shell-navigation.test.tsx": "b2bd174c967176f246487386a4a7b1f267ef5f390bed3d53d9be3ce9d3fe8abc",
"job-tracker-ui/src/app-shell-notifications.test.tsx": "82182e0c4efbf888898d5571af8482cdfa42b4f53840cce1eef44e408f754136",
"job-tracker-ui/src/App.css": "c5ac42e56bf8c34eb741d752bc879144f186d7ca0a48fcbb73b967177f7a9240",
"job-tracker-ui/src/App.test.tsx": "f3b39f696867c1027df473821005be312205ff9a9d6a4183882227efa1190fa9",
"job-tracker-ui/src/App.tsx": "d82a01fa21d9153bc0a7dbd1be0acbf2182b801eaef570cd2191e0a0440e9138",
"job-tracker-ui/src/application-assets.test.tsx": "ef5243d859a889d96bfe95b54aebbac667423c3d652fba7c5431bea9f35807aa",
"job-tracker-ui/src/application-calendar.test.tsx": "1c309b19a69121d81e6007f185899c87394f4ddc756b92c05891d9d608a4b1bc",
"job-tracker-ui/src/application-checklist.test.tsx": "023d5a264ca2cb955c25955d576dfd98142c135eaa7c50190665a879fc081761",
"job-tracker-ui/src/application-drafts.test.ts": "e78dc7bc7c0ccbf8ca959796a57d0e4fad798a886e31af2e647e469848c7732c",
"job-tracker-ui/src/application-intelligence.test.tsx": "fb4e35e1e177807dbbdef35a94608e464484ccb3d2be4335436bb62677ae321a",
"job-tracker-ui/src/application-route-contracts.test.ts": "75602c769a9274a898c48e6238c729a6ab35557c8bb15d470fdb04cf5453289b",
"job-tracker-ui/src/application-workflow-assist.test.tsx": "d67868035189a11c00d195c0a6f47702744be1b7a0d91b89f8681085e870848d",
"job-tracker-ui/src/application-workspace-overlay.test.tsx": "bb013f724549b923a2f3e7406987aae24ccea6a5c87ecc246f4a65dd412b4712",
"job-tracker-ui/src/applicationDrafts.ts": "2a5578f58e2ca00d345a04db039d61c5af28c094ef0e976b1106173e137a6027",
"job-tracker-ui/src/applicationWorkspace.test.ts": "bd068a208d40f782f66f77e6196378f4fa2a5be6f0eacd71e4f6271276e89362",
"job-tracker-ui/src/applicationWorkspace.ts": "d08cb13ffebffc56115998d8194dacd4cba44bb3f6e89456421e51c83afa7cae",
"job-tracker-ui/src/assets/JobbjaktMark.tsx": "5a539514876a66eaf17ec68eb7ce3d28c558384bc24ab76b61f73be8df754473",
"job-tracker-ui/src/attachments.test.tsx": "1519f67d3e3015d4a2709fa5d5bbc7da3b8208214e28cf20096b84192fdcadc5",
"job-tracker-ui/src/auth.ts": "0282a19bf34a915d6c4cd3bb32c041103206b1741b737e8a5e7b3f083a839acb",
"job-tracker-ui/src/backup-lifetime.test.tsx": "e67d22d13a5edaedc29d57e3afc36614cdf4844d510d1ecd661d5254d39e2ca3",
"job-tracker-ui/src/captureUrl.test.ts": "abf0a68b3727e7f78a8de2bee8ad28c2a6187a2a4305ad2e092351183e63ea7b",
"job-tracker-ui/src/captureUrl.ts": "108d8260c90d97296f67f9bda87ff6e3c5ddb60d8641a57223eb15bcf4c44f6d",
"job-tracker-ui/src/career-editor.test.tsx": "1efb7f0e5de676bdbfe3a14cb98823d02309e4ed7c5101cc61d34c42b4c51084",
"job-tracker-ui/src/career-evidence.test.tsx": "511341eec5e6dcdad7d0f9f63e959b7fb8ac7fdf43aa2dfcfa32fcff33540985",
"job-tracker-ui/src/career-history-view.test.tsx": "dfed6b3ccce38aba1492bc39bd94b1427ed307ea3ef1221f34095d8441e2cb59",
"job-tracker-ui/src/career-import-review.test.tsx": "967a3601d2d20f88c03be78f0cd4eca9d3b91435141c0f8acf58b6cdf538a585",
"job-tracker-ui/src/career-workspace-page.test.tsx": "fbc4d81d418a4feb9514158355e668683a466e03a584d4bce64b5f9f349d2c8d",
"job-tracker-ui/src/ClientApp.tsx": "dc9f144d1d3614569829a39ac86421d779c37a5ddfe58dcdd7094bfd00a92a89",
"job-tracker-ui/src/companies-relationship.test.tsx": "0471d3def86afbabdd683ab98d99fe07fe59f1bdc23767b916e087716117202f",
"job-tracker-ui/src/components/AddJobModal.tsx": "a572ab197526a7b8263ba369b7230db7781176f3e820d255e89d7f71bab94c63",
"job-tracker-ui/src/components/AiPrivacySettingsCard.tsx": "7534422effa4b8720e27ee34e3ff1c9fb5c74e6d5d6db3fe3810028aff7d1e7e",
"job-tracker-ui/src/components/AiUsageCard.tsx": "0592eea7ea9c43f72a9685e03a2e9911f96dc760e8d60ba17ac754956f9d700e",
"job-tracker-ui/src/components/ApplicationAssets.tsx": "29690b03b18d880a7f446aff245672bf37c1839293ad8549c22f06d2e9dfb9b5",
"job-tracker-ui/src/components/ApplicationCalendarActions.tsx": "fd79d4bdc3fecd1431989e5c0f2e4e6ee6c7ae3d300f8162ca3082d67c67b0a1",
"job-tracker-ui/src/components/ApplicationChecklist.tsx": "2c58d440669a76ec1882326e1039ca604f5bf7e38fd71ac6800d22e260a1fcc2",
"job-tracker-ui/src/components/ApplicationIntelligence.tsx": "335bb76ae09ef5c119be360024d5bb99276e131f80ce02bd07bd813ade423db5",
"job-tracker-ui/src/components/ApplicationWorkflowAssist.tsx": "7a9cbb1f38879bb9e9156d19675e9db40c466d06008cc5495dfd99b6b4dc088b",
"job-tracker-ui/src/components/Attachment.tsx": "caa72cbe9038a60e19e94f2c6793c134a1bdefd33644940655532472bd66e962",
"job-tracker-ui/src/components/Attachments.tsx": "86f6c3d174d07e0d73f69af2bbde28124f8aae3625d32788d9f962d6a26e304b",
"job-tracker-ui/src/components/AuthStatusCard.tsx": "cf33dd501dc3d4b5db925d8d3eb445c86fb98dfbe65043b0af2ac2848fdefa9f",
"job-tracker-ui/src/components/BackupCard.tsx": "b356961a48d35a4631f145f3b34cf7997bba20f4a1d2bb25508b2305e7e7b111",
"job-tracker-ui/src/components/CompaniesTable.tsx": "fbff1c14f98472d5f6b208bd669dd0fb947807fc8dec1096b9850927f2a38c0c",
"job-tracker-ui/src/components/Correspondence.tsx": "f42e7e549c9060f9d4f84111fc5d430eac353832c9cd6f6a56fa14b20c013251",
"job-tracker-ui/src/components/CropImageDialog.tsx": "9c13b8f9d45fa3cf1875a8630f6694d0f9c31e58f8d4a7d091694b4745fd241a",
"job-tracker-ui/src/components/cv/AiSectionAssistant.tsx": "76eaf48df27b922699805398f2ab80f0fe27886dd796843295d0f7b1a0b2d7e1",
"job-tracker-ui/src/components/cv/CvCustomizeTab.tsx": "be5463aca9ecf68b7c38daaccf5c661882bc174a66cae5fe0368ca228d48ac1e",
"job-tracker-ui/src/components/CvTemplateGallery.tsx": "51d082fe381a1ad7dcd17ddc374c7252e7ed1b5ac807174da8e5ac6a65acd239",
"job-tracker-ui/src/components/CvTemplateThumbnail.tsx": "2aa5fd8da00d1002c331e3bf476c7047b2431ccafadc6f5ab96ce6921aa78b1b",
"job-tracker-ui/src/components/DashboardLayoutEditor.tsx": "c712616e190fa5335c685548aaedaedba89701b9a47cfaf4d67d5f5b3c827130",
"job-tracker-ui/src/components/DashboardView.tsx": "44aba2e2b78da5b43f5a2ee6b308220c6e98e39b57371d1ef7074ddfa2a2c67c",
"job-tracker-ui/src/components/EditJobDialog.tsx": "25eec23f6f05214f500444c2b64173195d683e7ca3741a3917e37145792882e0",
"job-tracker-ui/src/components/EmailProviderConnections.tsx": "1009d1d5ee514b67dcb66738d1a4fad256b2dee049f88d4c748766b7360357b2",
"job-tracker-ui/src/components/ErrorBoundary.tsx": "4dc26f26f60c349b2a13f63a6f06e685fb625dcf9755b7094761ffb175d7c4ca",
"job-tracker-ui/src/components/GoogleAuthCard.tsx": "5dc802fa3eb3618534d90c625a365d2a361c3ce1ab1b3877923b86f84efc4ab3",
"job-tracker-ui/src/components/GradientButton.tsx": "6b8725e284ac02127edbf93ee92c276918833f98d0a7a1cfd44cf7c61c59e8bc",
"job-tracker-ui/src/components/ImportExportJobs.tsx": "2a6ca96e38182b66dd9441c698371bbdb348aeb3747a4faafeab69bfe4581130",
"job-tracker-ui/src/components/InterviewPrep.tsx": "454c97a2cad3a4045fbc301c5da717db79fa41b53a231e9f3f3cc437eb5881d1",
"job-tracker-ui/src/components/job-workspace/useJobWorkspaceBaseData.ts": "fe6b0c0f1f0edc6db64fd7c57b66901d37fc1f75f880c42d441e38a387c82630",
"job-tracker-ui/src/components/job-workspace/useWorkspaceTabCache.ts": "07fc1ecda997d57c265030d05d0f917f2687c8d44b0e7343b1de83e50f70408d",
"job-tracker-ui/src/components/JobDetailsPanels.tsx": "d13b05a2c531df2722fdc3fbcab7c78dedee75581ac8fda994ec677cf643ea08",
"job-tracker-ui/src/components/JobFlowBar.tsx": "643053f6ac883f23ef74c66def7a42678cd7917ed11ca802b11be25ec6df0cb2",
"job-tracker-ui/src/components/JobTable.tsx": "055e3be009a816e19d2b66db4db8aeec801bb23a2d24b73475c3c895028bd8ed",
"job-tracker-ui/src/components/KanbanBoard.tsx": "21f518c4b91d5c37b73e2f544aebcc3a4a5d2b151384dc25eacbbb27b2933a4f",
"job-tracker-ui/src/components/Markdown.tsx": "d3288d410d3757d195180521b898af804fdb37634a6eaf8a380995452251dd3d",
"job-tracker-ui/src/components/MicrosoftAuthCard.tsx": "fcb84c79afca5a2c585f73336f2ce74f33f0059a9bcd257e1b452f8d4f67dcc4",
"job-tracker-ui/src/components/NotificationsPopover.tsx": "68de79aeafac5dba9e1688678ef92c3a8a77b03dfaf72cc51a4019762641d20e",
"job-tracker-ui/src/components/OnboardingChecklist.tsx": "b661e362a5d44ab48d5df5715d697bf2c8be54136429d4aecd0b43c98cd8e15b",
"job-tracker-ui/src/components/ProFeatureNotice.tsx": "fd1bbe72adf90893b12115ff6a693b7fc721b5550cd1be4917ad741046a6fea8",
"job-tracker-ui/src/components/QuickCaptureCard.tsx": "0b0da2d773a7323a3341f082a803e6cd3cef8079d7c2101100b706b64c305bbb",
"job-tracker-ui/src/components/QuickCommandDialog.tsx": "27cbbb8b8596fdf4e7474eccfdb6d9a8a219f4baff6a9b8013b825ce5fc2c411",
"job-tracker-ui/src/components/RemindersView.tsx": "1eedbc443761001e86be1f322691ab4058553033e764b0c6cf9c93ce4fab05c0",
"job-tracker-ui/src/components/RichTextField.tsx": "dcd2ae783722f870c2d2170015e0a2e35ac6d05421bab5dda7b59aab12c6f85a",
"job-tracker-ui/src/components/RulesSettingsCard.tsx": "15cb36d8ef43a0b74b263bf2adc95f8982761b3cb92f44df3b9caf67c309a0c9",
"job-tracker-ui/src/components/SavedViewsMenu.tsx": "333466a7d2e64ed464bcdd70d8e662db3014dabb9c6b7e9c6f8d0d3306f93b9e",
"job-tracker-ui/src/components/SessionsSettingsCard.tsx": "b3568ca9f71cfb623617f00c584e8851a813e7c72faf85dc852d0fa65668038e",
"job-tracker-ui/src/components/SettingsView.tsx": "dbd611dd58b18bd9b48683f08a6d4af973374107d678c93fa148925c94037ed7",
"job-tracker-ui/src/components/TagsInput.tsx": "e8ac4b3079b3bd2ad76c497aa169b378b4aa789b2a2279b9bc3d400aa7b5970a",
"job-tracker-ui/src/components/TurnstileWidget.tsx": "86fbfd0e52d13f467d6ab84ed352dc95cdd97ab9e46c4e5add11b113e655389f",
"job-tracker-ui/src/components/TwoFactorChallenge.tsx": "1a9505889651f4dd4764fb04cbd3f31722d3de69d7dbdc159b55dff545ec5d9e",
"job-tracker-ui/src/components/TwoFactorSettingsCard.tsx": "4977001fd64d50666668b2324cfc3712b6545406241d01c79087c9443da78568",
"job-tracker-ui/src/components/UserManagementCard.tsx": "0e5b59f95ea8cf49b30cd3f2d4d78fef0e678bc261ad3514748aac53a686eeb2",
"job-tracker-ui/src/components/ViewStateNotice.tsx": "fd4bb314346a1603d9e01a15fd02f01576b9fd959e83f8ff0b1dfe5ec94378e9",
"job-tracker-ui/src/confirm-flow.test.tsx": "79e61f0d98f81d273e48f89e2bdd4c669d0bf6ec15c7859b19fe354c3e19a3a3",
"job-tracker-ui/src/confirm.test.tsx": "e3f60e8253504865509cdbda62ffc82b65c17c4c87a1866b37cc7654c8150161",
"job-tracker-ui/src/confirm.tsx": "d52663d7a6f5822bb4dc8735260e21c0ee3f99649fc741e7239e1831cad5888e",
"job-tracker-ui/src/correspondence-gmail-import.test.tsx": "eb1a3172c528df0f9876785e4ef4ae25220227c0801d247f76a61bd779c54653",
"job-tracker-ui/src/correspondence-inbox-page.test.tsx": "6b0bb3714de97b208ae74838a3c7938f0b13b6e226d7e743698f4ae63831632f",
"job-tracker-ui/src/correspondence-search-context.test.ts": "91dfb843add49d1d68f083f22c5106dffa04b1322decb88f79de2ca140ac23ad",
"job-tracker-ui/src/csv-export.test.tsx": "a12080de3f1c571fa27874d72ffcfa2212aa4a4f4b7cb6abab277b4ce8d0a1e2",
"job-tracker-ui/src/cv-builder-deep-link.test.tsx": "7fa1a68280cf3fc47f43848eb5002e89afe9f5a952056b925d243ed9c15ebbd8",
"job-tracker-ui/src/cv-builder-page.test.tsx": "ef0b63ba95633cca81f1b391113a4ddbb27844574d4230c36e5f7de2e0218834",
"job-tracker-ui/src/cv-document-controls.test.tsx": "8dd279a6328c2fc57b0c35b3179ee53b8b6a90c819d31d981ae535fdc67ad284",
"job-tracker-ui/src/cv-template-gallery.test.tsx": "379baeb733fb9da8e7b3cc3ae6b89f745178e67be61ba2184055fb1632aa9402",
"job-tracker-ui/src/cv-template-thumbnail.test.tsx": "9eacec2285edb753ae337c3b06adde157ce95114b438ecee45e5cdd66f1f27fb",
"job-tracker-ui/src/cvBuilder.test.ts": "61c17e64ac6f1a1bb5fe99f66426d9eee9b5f65853fded451462470ab0732dd5",
"job-tracker-ui/src/cvBuilder.ts": "efff2eb126377ad6bc84a73d90c8a062be35789d1655ceba58aba359b2d82c36",
"job-tracker-ui/src/cvPreview.ts": "38d0aadb4a080c72a8c4f04b6972b4252593c5e2d07af95a421abc47dcacb88d",
"job-tracker-ui/src/daily-control-loop.test.tsx": "7e0c4b1b1ad90d510c1f163efcb5f7c8be1407fc41efac18a6712c70e52b7eac",
"job-tracker-ui/src/dashboard-customisation.test.tsx": "ba339988e780e769501b25785f237634e6e23a51237ce68f2ef8a801db263013",
"job-tracker-ui/src/dashboard-presentation.test.tsx": "d9451f86dc77b2689afac345ec752ad9946c0341777e9959df316abb53367286",
"job-tracker-ui/src/dashboardLayout.test.ts": "db9bfa701f9626c39316add3e3137390de3ae5f8962ef8aca6c757e92421112a",
"job-tracker-ui/src/dashboardLayout.ts": "8c9b99e227097a1d8371785938dc31e1cf88544aa5a5ea37b4c7b116d9f1b06d",
"job-tracker-ui/src/dialog-flow.test.tsx": "ca84737b9946a356be59b2de83077fcf9134535c1531d6db18775bb2065ff8dd",
"job-tracker-ui/src/dialogs.ts": "c817739a302e765709b747a4fed7cb28f229920b6720f4096000a997c02bd200",
"job-tracker-ui/src/documents-page.test.tsx": "ef5ce47720327112a239c699b36117da7990a91a1903830299e7631be71bde9a",
"job-tracker-ui/src/edit-job-revision.test.tsx": "c9d6e693990c839ddf9d267d95c51c1ba944a9a2f62787da568e0405a574a301",
"job-tracker-ui/src/email-provider-connections.test.tsx": "764315a88dd7becbcda26b647c5258915f8e380f0ff2f9c031f7fb322b339b87",
"job-tracker-ui/src/emailOAuth.ts": "dfd0f0ac46d295a2c5a0b9a6bb6bfffcceef6b6871cec7c92c429418cdbce8a9",
"job-tracker-ui/src/end-to-end-trust-loop.test.tsx": "facd14c80ed6e2e819727d666b53fceee738e7d78d0a29acc8a962f89cefa809",
"job-tracker-ui/src/file-picker-activation.test.tsx": "accb87f94a7b36373eec6583a391a17ede7e7779cf18d81d4a86b43e0bd6afbe",
"job-tracker-ui/src/gmail-review-page.test.tsx": "e67ca4f4f5bbd38043c4420159124dd98cad9789ebbfc380ebc1c2772a46b2a9",
"job-tracker-ui/src/hooks/useCompanies.ts": "4ff9d86615439caad2fae10cc5c64267fdc8084ecb3ccc2c359821609622aaaa",
"job-tracker-ui/src/hooks/useDashboardLayout.test.tsx": "e3dca373dd3558a5635e38e5ada3201e7eceda9023c43af7a2c1fa4053c3f3a4",
"job-tracker-ui/src/hooks/useDashboardLayout.ts": "09810a81952a63562bad5be778a982596696d4ffd022c528825e2bd4a3c4468c",
"job-tracker-ui/src/hooks/useDebouncedValue.ts": "b704d1c40387dd4d668dab0abb59927ba86a377095a6cba9583c3493512b3f25",
"job-tracker-ui/src/hooks/useDragReorder.ts": "367e064052df27171f34ed638f1542319fa223f3ecf419000811c92e809ccb5a",
"job-tracker-ui/src/hooks/useViewResource.ts": "8c73a2fd845b8bc4c4c10b7c69f8d12dae8e83c434c537558a78b74377511b27",
"job-tracker-ui/src/i18n/I18nProvider.tsx": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113",
"job-tracker-ui/src/i18n/translations.ts": "e6c50371eb7501298f1bc03aeff7441e74f9274bc31667997d25b408635e0c60",
"job-tracker-ui/src/i18n-provider.test.tsx": "6bf5e80e721383290aef3b73ddaa31026d562596cc05d31712a7f1aef23ae824",
"job-tracker-ui/src/index.css": "daf22c296c801d3d533083361cc59fbdc22e5bfe528aa4bad1973b54cc5448a4",
"job-tracker-ui/src/interview-prep.test.tsx": "16d91a606f361e158a75fbaf013e3e473ccc864abaea00f00dbf3f7b3cf97650",
"job-tracker-ui/src/job-discovery.test.tsx": "2a23fe6c082bbc7dc0fb3ba17a8b39b400ea6ce8606b899a80c778a972fb5e87",
"job-tracker-ui/src/job-import.test.tsx": "9c69000a6f8ca744fb425c2007ce48247be46ecad01a177c2f002ba2ac9a0d73",
"job-tracker-ui/src/job-table-density.test.tsx": "53780a07f47415b2b242e386356b11e7c7ccce1bc0e7b54e8d31515a3f6f472d",
"job-tracker-ui/src/jobs-view-integration.test.tsx": "ad7a5c84dcb7cda29f3d276201de794379f0552827116f88339dd172d47961c9",
"job-tracker-ui/src/jobsQuery.ts": "ef2b8e804162f9d059cc087f7f57b2c4ccb5760b59e2d3d586e753871b6a0490",
"job-tracker-ui/src/jobWorkflowSignals.ts": "98e4d5ec4d898e19383ce113a1ad51ce4696458b7e25a0785e28e4f38938c6d7",
"job-tracker-ui/src/jobWorkspaceRoute.ts": "ac1a8e850732942cbf32bc6aa3035b561da4cf285879c5ee4621e4fe9ad243d5",
"job-tracker-ui/src/kanban-grouped-board.test.tsx": "e9641bf43046e9ae75e8dc7083ab089c7e60d36286872e44d2b86b16e6cd31be",
"job-tracker-ui/src/landing-page.test.tsx": "88b990761d109eefb0041ae2975f32e0ca58e3f58162ed0f99603302bb570961",
"job-tracker-ui/src/LandingPage.authRedirect.test.tsx": "e687f34f1a0d33b696b168b441ca46689c55a27cdf6240bd5b9ac5ce568413ad",
"job-tracker-ui/src/layout/AppShell.tsx": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
"job-tracker-ui/src/layout/AuthPageFrame.tsx": "cdd4b0f238d1c5dffdb13fd0f0dd0ea08f89238ccd83858e10eed58a0a8911a7",
"job-tracker-ui/src/layout/PageLayout.tsx": "9d7d8b3df0f533cc608c8b44519e12f1c9a8547fe91401c45023c6d2c34e111d",
"job-tracker-ui/src/loaded-theme-states.test.tsx": "a54e28943c2219842fdb5066b95490c4663568b2adbfcb02cb1984c62e9fe6a3",
"job-tracker-ui/src/locale-fetch-stability.test.tsx": "e647fcd387c54ffd50f45f1f8ae3f4133a2858fd0594ec9c0df51ce328a95814",
"job-tracker-ui/src/login-page.test.tsx": "f0f50a39ce7428241dd306e602c12b0cb8cf4b06dd81d0412bf01ac7ac32f439",
"job-tracker-ui/src/logo.svg": "6000b0e9b0b05b3f112de04f0d039768a1db63588ff9b6ef7099dbd71632f383",
"job-tracker-ui/src/microsoft-legacy-relink-page.test.tsx": "ec89420a80db1e93ff622fa259b9ca71cb503706ce15b79d6f592b3fbb4fb3c3",
"job-tracker-ui/src/modal-state.test.tsx": "6f7f32cde109bad6df5d3fae40566a692aecb4739f97fa9d302b41a603b64258",
"job-tracker-ui/src/mui-theme.d.ts": "b9e96b260cec865afbdef2669a2d7741d772a282c7569dacb01d6cf23ac37bb4",
"job-tracker-ui/src/named-controls.test.tsx": "c8b519701685c434a729a50aeb5e0dfafbaf8a166fb223ab400b28554c5c445f",
"job-tracker-ui/src/nginx-config.test.ts": "195fcc1d96f4e886c569bcb4affb941d788c9f0d175a4bb3d656f4213ae8a2f6",
"job-tracker-ui/src/not-found-page.test.tsx": "24b2c53441f13dd6d9b9faeb36033ba625d14be101096cfa44b8fc4502f2628d",
"job-tracker-ui/src/notifications-popover.test.tsx": "c654a00f312a98c0a74cbe2058f9550e84621731cb018287bca2e9888ed471c7",
"job-tracker-ui/src/notifications.ts": "3a688a7ef6c394c4a810b6b0c2fc4d20be61ec8e7737b3b3a2c30ac54c882a22",
"job-tracker-ui/src/offer-comparison.test.tsx": "8515c955395ae26ea7380854365d90c4209ee555ec029c2f8b0bd431b7f965a0",
"job-tracker-ui/src/onboarding-checklist.test.tsx": "b19d3b4ba3f033e839fb49c008f798c90e1c195aecab5542ba6d3dc5f64e22ef",
"job-tracker-ui/src/operations-page.test.tsx": "eb4292aff41866206c97d39caf84d4247da4bd8aafba7c1c88b63c5cd717e22c",
"job-tracker-ui/src/page-layout.test.tsx": "a224a684f69c59043509c3cd7120783b76494ca50520110b9dee01ef89f92807",
"job-tracker-ui/src/pipeline.test.ts": "9f49b69ab2039abaa71629ba24f300273f8ff8c70ef0786b998ee6c547f59bdd",
"job-tracker-ui/src/pipeline.ts": "fa755ced07a90cef79ceff1622049adc7ed7df3794c942512d9675ef04af8843",
"job-tracker-ui/src/planCatalog.test.ts": "680e0c6c3cd5e760ffd752668284400857f7abb5e17fbc72b106e606ffbb6c00",
"job-tracker-ui/src/planCatalog.ts": "14eb6a27455289e7231cc1a67f2c8acd7fe89d038d8ac93ce1a774f2bbec9f12",
"job-tracker-ui/src/pro-feature-notice.test.tsx": "3b59ee9f52853a0bb6213cd9c886bbc638d1b689a89c27e77bac60aeede6833b",
"job-tracker-ui/src/profile-page.test.tsx": "2fdff01be0956e2dc232ca6381d82c129b2a3522c30c6b14441d893fc899dc7f",
"job-tracker-ui/src/profileCv.test.ts": "c1c482bed380429489f1757852811e0d1e7f48b71af2bd7899693d2e8475ac9d",
"job-tracker-ui/src/profileCv.ts": "190b3e15ab00741f1e6bea868a79c3ca221e059936406098b693d13f3ef3f1d7",
"job-tracker-ui/src/prompt.test.tsx": "dc499a145812564d2dd67d708052e5fe46e0bb77e33a098d1599cf033c97de95",
"job-tracker-ui/src/prompt.tsx": "eb42e7f400d65090301d681b22965dd30cc3701c7378ef28e7e8fa08cab98457",
"job-tracker-ui/src/public-auth-presentation.test.tsx": "2f40091b13a252a45f4bd2c86da542b5f4648e08c4fffa070946de7f5c4a9811",
"job-tracker-ui/src/public-cv-page.test.tsx": "34eea91b2d9c3222ab8c79bc9506361fb136ad81e578d73809e4afe19808b756",
"job-tracker-ui/src/quick-capture.test.tsx": "070aad6a939f314f8e4bd5d24bd4d78882b5f609ae7fb939a02fddf23f1c52fd",
"job-tracker-ui/src/quick-command-preservation.test.tsx": "86ef134be10b85bddd980d09672a07cb4ef43807ac740e9283364d784d709bca",
"job-tracker-ui/src/reminders-presentation.test.tsx": "7f28d03a700cf254bee2ca41e20842988025dcdcde07b0dac00d2024e41af3c9",
"job-tracker-ui/src/salary.ts": "931f29ef51c4812ad60252ef4ec61b3928a39c38a92dec050b3006561db7e7ed",
"job-tracker-ui/src/session-boundary.test.ts": "3c78849fc0966bcfeac81126b24d01adc592f66e51dc6a087ebd27bf3ab1b10e",
"job-tracker-ui/src/sessionBoundary.ts": "09edca77c98294818d2ad0c409ce595f1b6ca0c1f60419fc1078b70f96f5b7b9",
"job-tracker-ui/src/settings-import-lifetime.test.tsx": "24af2a5954533087ddbff40659ff9f8dcf70805435dca772314c2be7d8bf6133",
"job-tracker-ui/src/settings-view.test.tsx": "1b5dfa2e75554ea53c462ec21c041f9761884390aace42d4f3a02a218b90db17",
"job-tracker-ui/src/setupTests.ts": "659f6e3e98dd475bcec35cfc8c24f5685eed2b2b5de8cbd3fa06dbea8ca0d459",
"job-tracker-ui/src/shell-readiness.test.tsx": "7947c326ae1e97dc72a67c776df681824c36943388db50b10f1479bc87d05868",
"job-tracker-ui/src/sidebar-active-nav.test.ts": "300c19db2c9eac9e680ed9edd9e99aef4ceeb234814ac4fe7245a07b44fa36ce",
"job-tracker-ui/src/tailoredCvDraft.ts": "5add70d48242cb8692ec534b8c01278440d160d1a9697711e1656985e3df0a92",
"job-tracker-ui/src/theme-contrast.test.ts": "f17b594bb9fd64d9fcf0c8f84bc19551052d6ba2eae9d2c2c031376f35a6be66",
"job-tracker-ui/src/theme-state.test.tsx": "c63f66982db6cadc973dae4ce3339c32eaea8c8429048a8588528f69f0fffe88",
"job-tracker-ui/src/theme.ts": "bcfc98ee692fda1d03ed23b952d2b2de35b16a45388bc43ad9885b6882df0302",
"job-tracker-ui/src/themeBootstrap.ts": "d5e1667c2224f0e6f05ea92083a9705e9572c00f64930cde99a07234596593f5",
"job-tracker-ui/src/themePrefs.ts": "2c9edd17b6b17f112ef3a786a607ff6ffd5bdf5c3e2e3dda5e83d4fa5d1ab51b",
"job-tracker-ui/src/ThemeProvider.tsx": "77bbed5fc1cbbba13a3c613a28c4c6116cde3c09a921be1065a7baeb54c83cb3",
"job-tracker-ui/src/toast.tsx": "83ff8de595c459b9fc403ff1ff9cd91bbdfaad9b85df197418aedbb9b26f5770",
"job-tracker-ui/src/turnstile-widget.test.tsx": "1afed75d79a9e771936dcfd30738d3c5fc4c7f61119940c4594c332b05a94d69",
"job-tracker-ui/src/two-factor-settings.test.tsx": "646c0ff92371650a563ad7f3f4698655f254aae57f3a36552da5d7dead98502d",
"job-tracker-ui/src/types.ts": "90cace326eb9ac6dd20a9b4ee505b4a2a6dee32fc80f269562c74ae07f508da0",
"job-tracker-ui/src/use-drag-reorder.test.tsx": "7c6717759b4afbfd28737e6c5e4cbe74bb21825650262dbf70f17de3e47b0716",
"job-tracker-ui/src/use-view-resource.test.tsx": "e7509ee8a95e3174f4b0b1cc002c365f605c8b1aa6e791fe89cc559db4396541",
"job-tracker-ui/src/verify-email-page.test.tsx": "e3a1543725febe01d5a08ada70223e9255a8b22821de2f3270f576ba4535890b",
"job-tracker-ui/src/view-state-announcements.test.tsx": "680dddfb12de6b06c566c4e1c476758ce3a43f1365c9a947270ac96af720b24d",
"job-tracker-ui/src/views/AdminAuditPage.tsx": "1c7011fa935efe2e532f6ab8f917005e486aa6fb525ad3a28aa1f67f28e461c4",
"job-tracker-ui/src/views/AdminSystemPage.tsx": "8459906c2b2c98d5302d3f5ada287374fa0edbbd19e04afed92f22196143640b",
"job-tracker-ui/src/views/AdminUsersPage.tsx": "674290a26fc279a25e43176194716dea87f427d1885ecce70dea7c368ab0c6f8",
"job-tracker-ui/src/views/AnalyticsPage.tsx": "40100ef5cf7765221897a4bd0ceb18a964423e122965bee21d278d113fdb01dd",
"job-tracker-ui/src/views/ApplicationWorkspacePage.tsx": "62c79d59ce31dccddefd70991db5fc26fcc84f0c58ca6219d0d36980db2050d7",
"job-tracker-ui/src/views/career/careerCompletenessLabels.ts": "61386b97a184b8fb8e75c5e4c122950fe3fbc7e98420adc1f8107c510373c7c8",
"job-tracker-ui/src/views/career/CareerEvidenceBank.tsx": "fc85ccfc1addd48af3a29bc263b089858765b2ac3ec7db3b66dedc55ddfab625",
"job-tracker-ui/src/views/career/CareerProfileSections.tsx": "0c772feb6bde8324676b0884aaf343283465c5cd3b3318128363063df4ea22ab",
"job-tracker-ui/src/views/career/CareerWorkspaceOverview.tsx": "e7ff8bdd8e541cf972f448298cc22e435a741e60a85222a85aafc12cf6536f5e",
"job-tracker-ui/src/views/career/ProfileCompleteness.tsx": "7a6aeb6cfdd790ec67177620711711319642d9e283fb00902b343cf4fa8a1886",
"job-tracker-ui/src/views/CareerProfilePage.tsx": "c954f18faedcceb2a17420d845472bd3868967c9161bc1a02b8ed15bde9881d0",
"job-tracker-ui/src/views/CareerWorkspacePage.tsx": "a30ba8d9a8ea8dff40f71709b0cc8fa0b62a7080339461cd802c87d8d3ab0b05",
"job-tracker-ui/src/views/ConnectedAccountsPage.tsx": "1deb20b05c221c0749537f8cb02a4be26959e72f26bc447e838704be625ac3b6",
"job-tracker-ui/src/views/CorrespondenceInboxPage.tsx": "2d3a44b6e7ef665503a58506413fc9b67b6da797d31db97ef88d6c0d4a196a1e",
"job-tracker-ui/src/views/CvBuilderEditor.tsx": "2ce2ff220e65be23ae46ec68327380733ee4157884db6e6a10450840692d2942",
"job-tracker-ui/src/views/CvBuilderPage.tsx": "61feb76fa6bc425497cd05aefb1f7630106b1a9bdc2b44e744dce2bb242da831",
"job-tracker-ui/src/views/DocumentsPage.tsx": "a6158c4df802264df21a15747d235df57b7424222f6fd5fc59f4dc15b298aacf",
"job-tracker-ui/src/views/ForgotPasswordPage.tsx": "05e291f6f12dfaee611a0370a2dbb9a60e40c75f916834a3ae03ffd848297ab1",
"job-tracker-ui/src/views/GmailReviewPage.tsx": "b3674c1d5e0776a86af6996eecfe7ef9f707fe5e9d7f9ac94891ea93d3bd5d9e",
"job-tracker-ui/src/views/JobDiscoveryPage.tsx": "e15f5183fe6d41ecb7a53ec9806872a67f0d6ce683354d0abef53527bd397b94",
"job-tracker-ui/src/views/LandingPage.tsx": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
"job-tracker-ui/src/views/LoginPage.tsx": "8ed5366378500cd09fea41a7730ff2fd641412026246dae268fb091e687057d8",
"job-tracker-ui/src/views/MicrosoftLegacyRelinkPage.tsx": "a053aabccc08797bf19a39b41eba960fdea863ef82816365ad90999b678c2879",
"job-tracker-ui/src/views/NotFoundPage.tsx": "7564f69301e84de2b8c88e2099d4667b7d438e459ac5f02009a090b36118207a",
"job-tracker-ui/src/views/OfferComparisonPage.tsx": "e3c268cfb7427dac1056a4d36e4a091a68c9970daae8180cc493520c62dcd86c",
"job-tracker-ui/src/views/OperationsPage.tsx": "8cff1e08b2009ff683957849af71d6e76916a28ae218e647d9e3c04a12ad5f9b",
"job-tracker-ui/src/views/ProfilePage.tsx": "2b521c464331c10f0680b2b75c5e6065089cfcf6a40e5db3392c7a25b61b916f",
"job-tracker-ui/src/views/PublicCvPage.tsx": "ab48f5a8f59e9232ca0238c6c729449e18e83237cda34971d256a92e88a12e26",
"job-tracker-ui/src/views/ResetPasswordPage.tsx": "184674006da849322a49d64262569837d47667ef83b72056c9bf1394097dc2a7",
"job-tracker-ui/src/views/RouteErrorPage.tsx": "5c305728bdf18458cb16f481b68e3bf07fe76b66110aaf19c551ef5d7851578f",
"job-tracker-ui/src/views/VerifyEmailPage.tsx": "63b7d8ea8c0537ea093850306c7a09a17d49a585377deba99d0597384850c30a",
"job-tracker-ui/src/workflow-trust-signals.test.tsx": "fbe6c7e6ae48f62dd2ab1dfa06b060a0284c288b268e6e391a0dd49d032e19c7",
"job-tracker-ui/test/fileMock.js": "8bc4a42f32769be0684c6d94bb734c1c49a9d551a8e9ea39cd43f242814c4720",
"job-tracker-ui/tsconfig.json": "5e23cc44ec7b00a85de80b65d8c6bd21e9847bb30cf69b5771ea34dcd8ad64b6",
"JobTrackerApi/.dockerignore": "a8ebaa567f938e5d0f9d81d29a36c686aeabadbc37385344d8dfcbe04cecba8e",
"JobTrackerApi/appsettings.Development.json": "c5fceaa5113f8106146879005a8e00c13b3bc0438fb83e2c162e99cec1e166a8",
"JobTrackerApi/appsettings.json": "7c5696451094393edd60777d23363776575244508ff54cbd0e6942ab856ffd6d",
"JobTrackerApi/bin/Release/net9.0/JobTrackerApi.dll": "3f00ba9e44240cab6aa890232518613633f9113d246a2807f6a6852e573ea575",
"JobTrackerApi/Controllers/AccountLifecycleController.cs": "1356d72cc5c794ffead7df9db14b274d2dbc1c29e84a5c86cb3062f65d3583da",
"JobTrackerApi/Controllers/AdminAuditController.cs": "8e6a9d813869bcc44b221536e46fbd682b2e740511c03fc896b3529975d20c0b",
"JobTrackerApi/Controllers/AdminSystemController.cs": "7bcae45b3843ebcbcf0bfcedec0e4d8ec6d3f12660565b5cdb09770f0ed12eaa",
"JobTrackerApi/Controllers/AiSettingsController.cs": "26a21070484b35c9b447209177f9c22a3223005e8e74301ac9ae5144c2ebd13b",
"JobTrackerApi/Controllers/AiUsageController.cs": "ef49c0d935cfe8846c9c3d691dab196dfada32f473629ee9d027ad61e46b032c",
"JobTrackerApi/Controllers/AiWorkspaceController.cs": "8a0fc1c71d68a61e4f1143a97ffce13f5745d26c2e4c6bc07d8ca2f867029ead",
"JobTrackerApi/Controllers/ApplicationAssetsController.cs": "8d9c60d42a24fd34149d1b73b0f2f298f9b723c45d11177c71c51e7e9bdd692d",
"JobTrackerApi/Controllers/ApplicationCalendarController.cs": "05a607f33220d42ec099a1c1db16ac474c5382f101e83f863da89f3402d89fbe",
"JobTrackerApi/Controllers/ApplicationChecklistController.cs": "89728ccfecc7ed8ec7b88ef1c5e34886c1094b94e8884e28f5f4fa99aa65871a",
"JobTrackerApi/Controllers/ApplicationIntelligenceController.cs": "af5027572b1fc30a6ebf8fabe786b82f2e7837ea16fca6f10e25fd01fef4695f",
"JobTrackerApi/Controllers/ApplicationWorkspaceController.cs": "20ca35a0f33965b664dd3d34b2aa4e4f08d406f7868c08068efb1be2e9468ad9",
"JobTrackerApi/Controllers/AttachmentsController.cs": "ac5de30857d39bd9f03409d43e1bf2272af4d5a98bd6505c913405d2bde5b82f",
"JobTrackerApi/Controllers/AuthController.cs": "88576d6398ec233a65314056a2a276f43d071d21d7bbebc8500f41e0971531b3",
"JobTrackerApi/Controllers/BackupController.cs": "1e99eb05f1644755feceea76af2155543458f7a4a30d5269a49081ccd1baa8eb",
"JobTrackerApi/Controllers/BillingController.cs": "a7c46d83bd6e0e6d7d5983fd83ae8662b36fd65f1280765d6536fb476045e99c",
"JobTrackerApi/Controllers/CareerEvidenceController.cs": "46b9f9a78aa486d0870fe86a85156f87820798454d2e4f5e96c02208b47cd117",
"JobTrackerApi/Controllers/CareerProfileController.cs": "f62729650f81d5553a2f7783bcef556792a2457185f133560a32a48986510091",
"JobTrackerApi/Controllers/ClientErrorsController.cs": "26c8315205d8557700e3ee2fa001ee4ac77e66b0cfe9b2d979e693f81141ac1c",
"JobTrackerApi/Controllers/CompaniesController.cs": "a913bcd1e9993bc4f8fd88b5554b92eade263967c4027b2179244354ed96f7ec",
"JobTrackerApi/Controllers/CorrespondenceController.cs": "0c9c782ad91875df872d74a6f70edf8baa6b756b9c526f46346eedf6afd365fd",
"JobTrackerApi/Controllers/CvVariantController.cs": "21c71ae693bbe6dd541e40d48ae6939a9fd912a9e6f56d31b5b27a64546eee62",
"JobTrackerApi/Controllers/DocumentsController.cs": "44633b84fbd33116e7f79f0fcd77cc8c15aea86d752464c6940b7dcd5506548b",
"JobTrackerApi/Controllers/EmailController.cs": "75b01564daa046c51a28bf15688770c6f71d168cf17efe6ed52d5e7894d88929",
"JobTrackerApi/Controllers/EmailDraftsController.cs": "bcbb26145668bb82666d43e1721418864220a15149487282af40397cd86784a5",
"JobTrackerApi/Controllers/ExportController.cs": "0152e4735777870d61b6e8f580c12ce87eecfb339640756a892e1836bfe4cba0",
"JobTrackerApi/Controllers/GmailController.cs": "05df8fea68b8c1d3a6b4a17bcd7c4b281b01a86fabf4c853eb495820ee3f4d2a",
"JobTrackerApi/Controllers/GmailDtos.cs": "69ac68aa9d9a24d57984892cd46b94917420240d3421af45069c44bf83b4bbc9",
"JobTrackerApi/Controllers/ImapController.cs": "470db9b775f16945c1c9954a4cfdf8eacf2f67d1328c963c1c5b1072cb2d3139",
"JobTrackerApi/Controllers/InterviewPrepController.cs": "77c298a760959f0b782e3e4c6db3366df94db7157c3b8c45ac34e6c4c2392a53",
"JobTrackerApi/Controllers/JobApplicationAnalyticsController.cs": "81f183ece72c97e5af5e3e26f13803851ad12baaeddd98e4f7a05a2d7fc18f88",
"JobTrackerApi/Controllers/JobApplicationDtos.cs": "b0a3173260717104c88d0dc1a8315024f852e372554c8c82a3b175815ed2af39",
"JobTrackerApi/Controllers/JobApplicationLifecycleController.cs": "127a5cda45ea4813332a85e174d5451091437a2477db9102fa1944c80ab4b165",
"JobTrackerApi/Controllers/JobApplicationsController.cs": "5f6a91b2e4149f06ed709f539a3af7360147e85fe7b1af82a693538552c521a9",
"JobTrackerApi/Controllers/JobDiscoveryController.cs": "06dece853bf6a09662692058fa166dc748c3a86dc0aba0a73e7db583b5cc36b6",
"JobTrackerApi/Controllers/JobImportController.cs": "860c30251feb302a35e3ccb4dd7f4eff2183cda50877ae92a690c4809e024e61",
"JobTrackerApi/Controllers/MicrosoftGraphController.cs": "b386c2e7413fd78ec252b01480e9163acafac24474b48c797e64fc34f660b6f0",
"JobTrackerApi/Controllers/NotificationSettingsController.cs": "f668e19c344f506d577dc2b8ec6be19439cef2bea2ad098680e57075456f0299",
"JobTrackerApi/Controllers/OperationsController.cs": "a2a38aee1d23c36f3cec617f1537f73d35639542087d4c1e5e7fb65f227440e2",
"JobTrackerApi/Controllers/ProfileCvController.cs": "c9ac11354144233c57b5e91a6169be6e80af92249192643498c6b8fda1a7f9e2",
"JobTrackerApi/Controllers/ProfileCvController.Parsing.cs": "5def3865c98277cc0b4d891b80c8680a0ce38e9864d6dc35570ece902a657aac",
"JobTrackerApi/Controllers/ProfileCvController.Pipeline.cs": "f00e653ae63b10b8c0c26c2507f38f89b547163eb21f0b158124ba5c6eb098e0",
"JobTrackerApi/Controllers/ProfileCvDtos.cs": "d88e7ea01fbad6e466d2ad7a89f19c2c880ae3075f35cd78167fa122c70cb375",
"JobTrackerApi/Controllers/PublicCvController.cs": "bff6562d7f8cc0ac0396300fa31b73f66912c1cfb7b75b8bae458e37db7cd051",
"JobTrackerApi/Controllers/RulesController.cs": "526c5c7edfc2c226862067be1480d149728a8c0544eb9a3d00113a981145e3d0",
"JobTrackerApi/Controllers/SessionsController.cs": "f28da30c3010bfa9c132c5f5e3da5bcf6a888a706521d909ee335d91dadf93b8",
"JobTrackerApi/Controllers/StrategySnapshotController.cs": "c299dcb4c9dc3405ef7e30b40b0201356e62e51d835ed285f924c3835dbffeb2",
"JobTrackerApi/Controllers/TwoFactorController.cs": "a7e90676cb92d2c1dcaffe235886a57badd951b69e4fe70a20bb794d95be429a",
"JobTrackerApi/Controllers/UsersController.cs": "be96ac00554471985fec2879dd10c70adea099c431fb3c2668d585fa12109821",
"JobTrackerApi/Data/JobTrackerContext.cs": "2aa766bcb13846eb7e647b8d77c262a914f0e946501b38fd50a0dd920bfd9a11",
"JobTrackerApi/Dockerfile": "8f02fa5b257ee5ce6e19e2a21ad90b880db469969662388c952e579690bf8cec",
"JobTrackerApi/JobTrackerApi.csproj": "edb22eb35e08756722b4cb99f61012ee7df70d57fb19368a0d66b673bc261f7a",
"JobTrackerApi/JobTrackerApi.http": "85d899af072f1f5baf6c70e111d22347c750d764b33f4321f1e13899b83f1852",
"JobTrackerApi/Migrations/20260310174114_AddCorrespondence.cs": "11270f5b42eb49c74a8239324a13f507da4ee12e812240c060f89df2fbd5752b",
"JobTrackerApi/Migrations/20260310174114_AddCorrespondence.Designer.cs": "a29cc183485bf3e39a9e9db24b65080065559c69e81b064dc6fab4ebaba9cc5d",
"JobTrackerApi/Migrations/20260310195000_AddJobFieldsAndSoftDelete.cs": "a382342a25dd6b3881ccda15f69a01c9da2b7e43637715f76a8175a0cca6125c",
"JobTrackerApi/Migrations/20260310195000_AddJobFieldsAndSoftDelete.Designer.cs": "f775935d1336c9d1c6d86f74211f0fbbf359f2bb3946420dc08ac9cb569c78e2",
"JobTrackerApi/Migrations/20260311090000_AddAutomationRulesAndFields.cs": "00525354e9802ddd33886f7b6249eb351f646a7c5f117044e34a07fe005c9a0d",
"JobTrackerApi/Migrations/20260311090000_AddAutomationRulesAndFields.Designer.cs": "36a92d88a91a01881bd80208a18ba2b43f09c5937b9902c2e993a885bfe562a6",
"JobTrackerApi/Migrations/20260311093000_AddAttachmentsAndJobEvents.cs": "326fe813c82a372bf2078da35aced5d597687a82f5bead81d86c7fd2c8d9a883",
"JobTrackerApi/Migrations/20260311093000_AddAttachmentsAndJobEvents.Designer.cs": "d35247759e7fdd78a2b8b1841005da8976fa622f6815173f814944c0094f962f",
"JobTrackerApi/Migrations/20260311103000_AddCompanyCrmAndChecklistAndIndexes.cs": "82bbdbb451d35e2f83e54c7c887ae46879febd204c8872004489dd20b5d15471",
"JobTrackerApi/Migrations/20260311103000_AddCompanyCrmAndChecklistAndIndexes.Designer.cs": "e2bf69f1db0aa1bb8dd21161f93587fa6ba51032b536751634474aa13c960756",
"JobTrackerApi/Migrations/20260311121000_AddCorrespondenceEmailFields.cs": "aa472d198b4c0bc2ff7d1b1b119b3e4e24c4a5ac078824877b85f6152131b3cb",
"JobTrackerApi/Migrations/20260311140000_AddJobImportFields.cs": "7409c0336e73577e4cf268acc6af93bfaa4db35d5ec7e09165e9c771187d2976",
"JobTrackerApi/Migrations/20260311180000_AddShortSummary.cs": "ff8378e5a601083167901559318c4a577240d502008fd8a78ea39af64605759c",
"JobTrackerApi/Migrations/20260711181039_SyncModelSnapshot.cs": "5e275596a1c68ae5c83c6fe1dfca5d57e07ce7007d40b171cb597ddb7570a4e5",
"JobTrackerApi/Migrations/20260711181039_SyncModelSnapshot.Designer.cs": "e8ac97d481b3796c2e8aa10efd01b4ac5f3cce7a50baeef7a76ada89339e4044",
"JobTrackerApi/Migrations/20260717071417_AddJobEntityAndProspectStages.cs": "b68ec6035af8d6c849c3018d725461d2f8336c9a6c17b114516d48d540797bdd",
"JobTrackerApi/Migrations/20260717071417_AddJobEntityAndProspectStages.Designer.cs": "6ece69c3b06312388bd344ef4ace962c8b437d67b81591eb7f0f37fc3f5c0b7f",
"JobTrackerApi/Migrations/20260717222917_AddCareerProfileRelationalChildren.cs": "3e3ec75d08af69de950c2dfd5d080a1da8f966e4bf9312cbffd40caf5c56be0a",
"JobTrackerApi/Migrations/20260717222917_AddCareerProfileRelationalChildren.Designer.cs": "114362ec4f5dcde9b265d265db1e25833deaed5e8c9185ef3095856bd61daa72",
"JobTrackerApi/Migrations/20260718074509_AddCvVariants.cs": "2d459f231d9eba4f085f5cef5c4e4713b564c5863c4cc2606ac18f0a6a8c68ec",
"JobTrackerApi/Migrations/20260718074509_AddCvVariants.Designer.cs": "ede71f01ab9d60d4c7ec770666b26850ec848cf2b2875b2d9f548b309194d221",
"JobTrackerApi/Migrations/20260718131138_AddAiInteractions.cs": "e85df4557a729f09c3fad8e9ad4dd0b1688e399e1b38f3bcf333a38c9020c28b",
"JobTrackerApi/Migrations/20260718131138_AddAiInteractions.Designer.cs": "fe753ca170f13e5efa09cd9e0b0f763b5b3800f5cf830bcdf9ccb70c21238157",
"JobTrackerApi/Migrations/20260719085904_AddApplicationChecklistItems.cs": "434a610136f1618fce59a30d158d729e13d4906c1044b30e535665901d75a9ec",
"JobTrackerApi/Migrations/20260719085904_AddApplicationChecklistItems.Designer.cs": "cbfac5859220710890acd8eba6728eba0e79260d3f1d3c452c1a166790c2aec0",
"JobTrackerApi/Migrations/20260719094728_SyncCareerChildKeyLengths.cs": "eadffafde32d3779a0c2e0ae2849c43378121ce0b67b421a09df974acbb86500",
"JobTrackerApi/Migrations/20260719094728_SyncCareerChildKeyLengths.Designer.cs": "90af9b365f6e53a0f8a4a7e625a4e38db002ce55b2c68d8ce242f3f3983180d0",
"JobTrackerApi/Migrations/20260719120954_AddCoverLetterVersions.cs": "a7f7ab31aa4d1b1ba1b9b5588efade6c02936ef459aa5a453d59ad87ed2634ac",
"JobTrackerApi/Migrations/20260719120954_AddCoverLetterVersions.Designer.cs": "d803d4aa302ca78011df59cddba3feef2bd7640a9d7166bde129b4bc457a0e6e",
"JobTrackerApi/Migrations/20260719145044_AddInterviewPrepItems.cs": "97063333c7c98f4f3829f6dab3e1a1266c776e0652a4f75523952dc54b0b299f",
"JobTrackerApi/Migrations/20260719145044_AddInterviewPrepItems.Designer.cs": "deafd04870d562604b925a1830054d2f75bb0e1b3bca1e58ef629e901abd8ec7",
"JobTrackerApi/Migrations/20260730203422_AddAiUsageMetering.cs": "4e9915b5d0c55500b0117f9c9adf80ce667498b29980ece164b23f9d840758d3",
"JobTrackerApi/Migrations/20260730203422_AddAiUsageMetering.Designer.cs": "28b9c591eb9b68316b55e01e3ca680cac295c3b58ca7356349a6617a7a8925e3",
"JobTrackerApi/Migrations/20260731115022_AddStripeBillingState.cs": "520aad6d0a88afa734fab46d98a6eac59484911f05a156ef935f928394029f5e",
"JobTrackerApi/Migrations/20260731115022_AddStripeBillingState.Designer.cs": "3c135d557202db5e17eabbd42df19b8cf147b46bc27e38b46b014ae2b4ed0133",
"JobTrackerApi/Migrations/20260802205800_AddPendingEmailChange.cs": "9c96f54d41ec74d6473d613af10d9e71d72223491c16e16e6453390635ba7a56",
"JobTrackerApi/Migrations/20260802205800_AddPendingEmailChange.Designer.cs": "f69a87580d123371b8f0d20b889ba024f42b2cfc4fb9cf5c9140ff778347151f",
"JobTrackerApi/Migrations/20260802212509_AddCanonicalMicrosoftIdentity.cs": "09f7103bd80a1f8aeda0a94bbd3df9bac7e1a6d4008dd945a94a26d8584a3baa",
"JobTrackerApi/Migrations/20260802212509_AddCanonicalMicrosoftIdentity.Designer.cs": "63f83932f99cfdeb9afa74cc2e3ab82b3de459b883aea415fda10b97685f60c9",
"JobTrackerApi/Migrations/20260802224646_AddUserOperations.cs": "878199eaa343fda0e5452551867c070a2d8563afa7c36bd0ade80d5785b376af",
"JobTrackerApi/Migrations/20260802224646_AddUserOperations.Designer.cs": "706f6aee1c92140d544883ea1ee2b2761b2d8bbf2d4b5e66669660cadfd20b5d",
"JobTrackerApi/Migrations/20260802225941_AddUserNotifications.cs": "77902fa9ccfd0cfe68bb75415d08ced48196076a1f73228eb7fde505e3392977",
"JobTrackerApi/Migrations/20260802225941_AddUserNotifications.Designer.cs": "2d390033d15d8b1f34f6198add823a7e2c7b5dcff88dc3d3fd5d60715cf73641",
"JobTrackerApi/Migrations/20260803001138_AddAiPrivacyPreferences.cs": "412bdfa1f52596ac6444062c773dd3d7508c23b6ce4a374734725944d6dd1647",
"JobTrackerApi/Migrations/20260803001138_AddAiPrivacyPreferences.Designer.cs": "091e20bfe756a4e8c3c28bf1d90693e3aade3ec93fc0b7bb4dc3418eeba19793",
"JobTrackerApi/Migrations/20260809195014_AddEmailSendAttempts.cs": "e86d026456856a94e1327e7552dec743430d3b1016f656a731805a286f30e8ff",
"JobTrackerApi/Migrations/20260809195014_AddEmailSendAttempts.Designer.cs": "6684c4c9759f68a947b85f6ec8a001d7843061ed2cc886c6ade780e636ca4d0d",
"JobTrackerApi/Migrations/20260810075206_AddEmailDrafts.cs": "691616c54b95e2f3329533f422cdcad4f96772c9710194b5f92e1f0457ae5e54",
"JobTrackerApi/Migrations/20260810075206_AddEmailDrafts.Designer.cs": "e6223721a2f7fa480ea6e126af47d4e8fc2076b56d83cfaa1f33949d671b8347",
"JobTrackerApi/Migrations/20260810080858_AddEmailDraftClientRequestId.cs": "656bf59861847e8a1bb566527e4e9c217728023f145ca106e04f3366fc0ad02e",
"JobTrackerApi/Migrations/20260810080858_AddEmailDraftClientRequestId.Designer.cs": "4e3dc9df9884b2abbfb0c73521b999b2ed9f351ba3010d7de85f3a5f6560edd8",
"JobTrackerApi/Migrations/20260815164027_AddAccountDeletionLifecycle.cs": "abd71f97e27d9891a2921c889df069b8e7f1cdb419b4c87f11884fbd9f394277",
"JobTrackerApi/Migrations/20260815164027_AddAccountDeletionLifecycle.Designer.cs": "b20c9417dace582b6f632102c23c24314144c715110b4b397bc6a0bf8bcc9c7d",
"JobTrackerApi/Migrations/20260815175236_AddCrossFeatureAiUsage.cs": "40962a8fd323b06141032930aa27f5e994e97aa21d87054797ca1f6e9e7f16c4",
"JobTrackerApi/Migrations/20260815175236_AddCrossFeatureAiUsage.Designer.cs": "cbacda55423ce9c7601962d4225039cc05be4aa0498db8b07e6a386b1b7be917",
"JobTrackerApi/Migrations/20260824090000_AddNotificationPreferences.cs": "857268d18a617bd48830f873e8e29626c04fd7ff8f2f8a2993a0dfdb73d9e0eb",
"JobTrackerApi/Migrations/20260828090000_AddUiLanguagePreference.cs": "d1b88829c18c618ffa8b2e5a3c43dc7f12f1e93fb14483252eb5a1597f9aa5ec",
"JobTrackerApi/Migrations/20260830120000_AdoptSystemEmailSettingsSchema.cs": "7685fd48b96aaeee3563af08aad9e63b9688607abc51f48cc2074eaa4e7377ce",
"JobTrackerApi/Migrations/20260830121000_AdoptUserRuleSettingsSchema.cs": "a738fd35fd61b67e2b5a3da104768fd6d881262814a53284d09b21e801515c4b",
"JobTrackerApi/Migrations/20260830122000_AdoptGmailReviewDecisionsSchema.cs": "bbf8fd9cb3ddcfc350650f028089770bfa53ad4f25d441cc7b88e878434bace2",
"JobTrackerApi/Migrations/20260830123000_AdoptAuthenticationSupportSchema.cs": "703aaa7d95724c89ce2780c362232bb1946106b38349554b55c1bfe8d9a7da3e",
"JobTrackerApi/Migrations/20260830124000_AdoptEmailConnectionSchema.cs": "8ede53875c67da18d7da7b26f858c61c85c5740ae6d67f4bae66f3a6fe3c61bd",
"JobTrackerApi/Migrations/20260830125000_AdoptCvExtractionSchema.cs": "b1ef095506b3d052a421e49e19801543c6077b0a88204958a6de3f6feb043980",
"JobTrackerApi/Migrations/20260830126000_AdoptTailoredCvDraftSchema.cs": "f45b9de91775bfc180025b41bf2eaaa73d040d611e2fe7957562101564394cf7",
"JobTrackerApi/Migrations/20260830127000_AdoptJobWorkspaceNotesSchema.cs": "158f32ec9ae24d2ecdb910fc52ee0891a324274ae9e962657f3a44775eb9ae09",
"JobTrackerApi/Migrations/20260830128000_AdoptCvVariantSchema.cs": "4c833c1f30398b786b9a46d224a9ba6efb3e53b3e5275fe3dc80e69fabb76551",
"JobTrackerApi/Migrations/20260830129000_AdoptAiInteractionSchema.cs": "2663db99bb10634f4730c3ce03c9414faee2420bac7b7242d3c212755ea915f5",
"JobTrackerApi/Migrations/20260830130000_AdoptApplicationChecklistSchema.cs": "2f94dfcb6d067fb2b62db642f2f66d3c3cb60778c95add9fa24d6617adc044e1",
"JobTrackerApi/Migrations/20260830131000_AdoptCoverLetterVersionSchema.cs": "6da3c4dbf054e8d9dd3199267584908610fcde4125d420827d0c23164cc2de2a",
"JobTrackerApi/Migrations/20260830132000_AdoptInterviewPrepItemSchema.cs": "2efc9f5cba04d7d38f72e0528dc8a95fa14b9d579da2f83dc680941e541c24f9",
"JobTrackerApi/Migrations/20260830133000_AdoptCareerProfileSchema.cs": "4cc0c1def238cc918a5256b22bd364eb17112d27b84c2fd54666b8d7a1391792",
"JobTrackerApi/Migrations/20260830134000_AdoptIdentitySchema.cs": "c08bef42550ec91df6c476392392c2c487a6867cbb16924f0304bb5026ce9bda",
"JobTrackerApi/Migrations/20260830135000_AdoptSubmittedApplicationPackageSchema.cs": "408fc4de4cecfcb1556139ef548ef735d8383bd75853253528a3105621a2feaa",
"JobTrackerApi/Migrations/20260830136000_AdoptCareerEvidenceSchema.cs": "3a4e1b6e4daade3edb1be3452c66e144b675cc13977d4b64f660fb38ce68d7f6",
"JobTrackerApi/Migrations/20260830137000_AdoptSavedJobSearchSchema.cs": "cc200a1b55ad512eb823687a7479b2636b31148e2ce443414fc81926d6ecc808",
"JobTrackerApi/Migrations/20261021090000_AddDashboardLayoutPreference.cs": "16682ac34da761065918528571c253f3cafb7a9acc08860374885cb038686b33",
"JobTrackerApi/Migrations/20261023090000_AddJobRevision.cs": "8f3a635abdf56e0c6b0f92abd99c5c28ca11f10f4ac5a24fb29a9cec668d1ba3",
"JobTrackerApi/Migrations/JobTrackerContextModelSnapshot.cs": "9b20e442d419da5cf218813cbe23175af78d8d75d07b9600dd9691eb33376761",
"JobTrackerApi/Models/AccountDeletion.cs": "88e634a1dd1c360f0ab9621b3a28e3412408b4d682fc827b5871a397f8e8e28c",
"JobTrackerApi/Models/AccountPlans.cs": "c4db37f54d0c86ab3edb75718449efa00a435c3e7ad3fdcac4e8982b58e00db8",
"JobTrackerApi/Models/AiInteraction.cs": "39ccf03d81c690d9452fba0e73b11ba03b26b0f982b52ea70c0fe334109fb669",
"JobTrackerApi/Models/AiUsageRecord.cs": "43b40e521d9c469dd343ef74fdb92417345b83f8b9397158b9abf39eacc9ec0f",
"JobTrackerApi/Models/AiWorkspaceNote.cs": "3bef6b380950d09b666a41ba34aaefcb0cddc14d3a1f7210874507d6287b75d1",
"JobTrackerApi/Models/AnalyticsDtos.cs": "9f19e592c812f74d0087a3b3e1d84d584ebf521842711edec391f60ba2455dc4",
"JobTrackerApi/Models/ApplicationChecklistItem.cs": "c652fe5a7dbe264877189d0485b4b8d218c591634c5106e11b2c5e3407c65322",
"JobTrackerApi/Models/ApplicationUser.cs": "0369bfa87fe51547231c3f5287fe9989cb08b3ca498d6a0667cd59c3668e6837",
"JobTrackerApi/Models/Attachments.cs": "23dc6834f533b319fcdb7d908bdc67b2d77702a7b888aaed51f80e30ba6ca581",
"JobTrackerApi/Models/CareerEntities.cs": "aac8e4bbaf9323a8e3f9243d625efbb346b0f8abed295245496c2cfdeb357751",
"JobTrackerApi/Models/CareerEvidence.cs": "d016cebfb1097e3710742c6ac7aac79e2bed74bbe15f1607f79c086f82c46e53",
"JobTrackerApi/Models/CareerProfile.cs": "761bc284290e6af4f4d0e7a6344c02df8235b2dd94cac15b83bfc98b6d15fb17",
"JobTrackerApi/Models/Company.cs": "775619203c7b9dabbc52a7d96a837f11c8083c47075c63a037ea778bb1c34fcd",
"JobTrackerApi/Models/Correspondence.cs": "f15760d1566b7ad31bc8e6d81486a509b71d4f939875d79ec7218e5fe71d952a",
"JobTrackerApi/Models/CoverLetterVersion.cs": "96adb0b37a80533a65688ab28b0e9432616ef67d2b2eec0224a76fb3c6caf0bb",
"JobTrackerApi/Models/CvExtraction.cs": "b698183c7f6186e4dd67b5219bd5825bc0da5ad5521cb0295d141bb9e106d65a",
"JobTrackerApi/Models/CvTheme.cs": "03604a29432c5924e533db935ec3d48ca042a8704b5f3e9e4cfe7c2795c97ec8",
"JobTrackerApi/Models/CvVariant.cs": "9032bd64091d5162e8998b4d117cd0a653323b22ae9653edf0e33566c25807ba",
"JobTrackerApi/Models/CvVariantSettings.cs": "06cc5e1a969aea498d333d751b31fe54d0bc6e778e39d225a7f23c2ea2f8314f",
"JobTrackerApi/Models/DashboardLayout.cs": "11dc1b97347b726b903faee4edf4bdcbc16f7fe6c940ddc6d0df5024f64511a3",
"JobTrackerApi/Models/DiscoveredJob.cs": "d7e3c5ba67bd47a0a38c58608323c89e0e30ae13e6fc4eafedae5a97e2d05684",
"JobTrackerApi/Models/EmailDraft.cs": "546f51251d3743cae68149c656366c0ead74aa1ea22d35318508b5ec2ce17671",
"JobTrackerApi/Models/EmailSendAttempt.cs": "47c1f579fd72d37dd9e020b4dd11d8c10cbfa5741e04076fcbd9c73ef579e062",
"JobTrackerApi/Models/ExternalCalendarEvent.cs": "3a9c0b09314f32f1cf1e83c97236a63627b4885c06425cba8268e96ad7d0bc73",
"JobTrackerApi/Models/GmailConnection.cs": "f741b7192eedb4ecb93ad616a132e5909bf62e3c531caa1334fffd30ccb54cb4",
"JobTrackerApi/Models/GmailReviewDecision.cs": "9590c585e6de694520395752903ffcd686d90b8a4b4b1f826392335857c121f2",
"JobTrackerApi/Models/HumanLanguageCatalog.cs": "e0ec269511d6d1722a3a48e0c6f410b7559aed319f527a0619352720f48e4203",
"JobTrackerApi/Models/ImapConnection.cs": "6e03530f96df2d44eb5f161497dd39f6f3189023430248676c692eb7d05bf3bd",
"JobTrackerApi/Models/InterviewPrepItem.cs": "4775f98b76f517abd123820452aa0c7bad623c2e6798204c73c858d933d29635",
"JobTrackerApi/Models/InterviewPrepNote.cs": "afa02925af9eba8cd4ecc00119912015a67d10ea6c7c0b1d8d94d9728edfff0d",
"JobTrackerApi/Models/Job.cs": "074246e2af9e308009562bb6cf04bffb441f3f4e3c506f0a990ea593809484bf",
"JobTrackerApi/Models/JobApplication.cs": "93977b073a045e840466ea18a792b06f5e665f0bc50d5a913f7734f842944bf9",
"JobTrackerApi/Models/JobEvent.cs": "f1e925a840d206f33a616e73ecf7efb29a015ab2ccbc2bb2a7b820776c960974",
"JobTrackerApi/Models/MicrosoftGraphConnection.cs": "9b5d9c7e8ab99f70f7ea0b6bf298768fc169ea6fcd58e28e819120cb6963758e",
"JobTrackerApi/Models/RuleSettings.cs": "abe1b0d412d5a53614d5042e1e910f0daf7439a76357ce5fef80849359266d57",
"JobTrackerApi/Models/SavedJobSearch.cs": "7385b52232fc2434123b3e89045b5380f0a7185881c4a19fbbda8b4c410f2f9b",
"JobTrackerApi/Models/StructuredCvProfile.cs": "01447f53ef36b4ff308a1dfb563bdca8387cce19398300b1aa81f02341e54d9e",
"JobTrackerApi/Models/StructuredCvProfileJson.cs": "a86142c6a911156f19f18f0067f9db8d74da766aa8ac5c2d1bd4695a47dcb327",
"JobTrackerApi/Models/SubmittedApplicationPackage.cs": "5baac5a52cadda819ce10c818226f6debcf5c4c8845dc3418430c870ae3cbb0a",
"JobTrackerApi/Models/SystemEmailSettings.cs": "cdbac7482ee7c18439acfbc007f781b2d7192b9edfe2f3004d0336b5e2a94692",
"JobTrackerApi/Models/TailoredCvDraft.cs": "5d3427ce02cc5a5763b752c27b338eae6f561f6b00f6902e6bf8481d1f7f5e90",
"JobTrackerApi/Models/TailoredCvDraftJson.cs": "6929e1d071138429944ee883eae4e18e9ad2d4667c4e692c95ea1c4314bb9171",
"JobTrackerApi/Models/TailoredCvTemplate.cs": "7269bc96285b8e3411cfcda4609db13a9ddeb4d3a3d04f0158199ca52de7d5e6",
"JobTrackerApi/Models/TrustedDevice.cs": "60b98a6b6d95f361fbad93e68535ee0bc0d9a3f7ad1d5477f59b86a942f20737",
"JobTrackerApi/Models/TwoFactorRecoveryCode.cs": "d79d5070ba1ee0c4062e01b40807513abf64e37ac4377d04f4f4fa8a743e825d",
"JobTrackerApi/Models/UserNotification.cs": "e22f40794806f12d781566ce5426da9473ed9db7b532e6f3e0cbed252c2ef811",
"JobTrackerApi/Models/UserOperation.cs": "f6d4d36c47cfe9a5492e95af65a7dc5fd841b0b6a3f44b00b305450c0f4ddcb9",
"JobTrackerApi/Models/UserRuleSettings.cs": "bf4debf788108d828d63fc1ef4b0be2cc4c4f211a5b1fd99d335d1c1714ddfd3",
"JobTrackerApi/Models/UserSession.cs": "d67f2419308ff613ff47388a2dbb260b86b119627aec92d3d0efb98ed598f140",
"JobTrackerApi/packages.lock.json": "657de6a2093f849029f2aa60de7df3939b4e13057972f0637aba1fb4d143bfdd",
"JobTrackerApi/Program.cs": "491c5b3aafbb4349a0d9cd5b7224548a4de7a159e23f0927cabc998f542c3e77",
"JobTrackerApi/Properties/AssemblyInfo.cs": "31a4fe6953e334c82f5c541d4b396cd18572e64e0ab936c9cdfd3605f4e8877b",
"JobTrackerApi/Properties/launchSettings.json": "1eadb72e8554c03f90166961c90c33dddf3dabef6ae178667e9181c46ddee190",
"JobTrackerApi/Services/AccountDataExportService.cs": "e50907a073f2d4a2ffd46600e108de174b08eaae5c87b8e11dc80fb683345bdf",
"JobTrackerApi/Services/AccountDeletionService.cs": "f28914aa7a1a2b6894a5f9cf71490f66d50ddda97bc4591238920560ac97fa2a",
"JobTrackerApi/Services/AccountDeletionTombstoneStore.cs": "e32353f47f7fff972af0700cfd31a5115b82ed2397fc97fe05a6aa9df09fbe7f",
"JobTrackerApi/Services/AccountOwnedFileInventory.cs": "22cc112f4bce0d711de9d93a9cdc3b7119b069eec16a3b0f7c03b1598d46f717",
"JobTrackerApi/Services/AiOperationQueue.cs": "dc16f5cb057f5958f0b557d78168ec749b6d58a1659431422c6e0d880a24278f",
"JobTrackerApi/Services/AiPrivacyPolicy.cs": "d45642b00d65dba489cf27185fc7f17e9f4db95bf75bf56d90b4baa0ad0dc609",
"JobTrackerApi/Services/AiSidecarCachePurger.cs": "823e8ac47f9bb29b8caa08cc07bf417037cfee9c6ee0c1088e4263c88b785116",
"JobTrackerApi/Services/AiUsageExecutionScope.cs": "e91fad9300b206d2e8de57176dd9481d1e262fdcbb2f553f18eb4666089d7603",
"JobTrackerApi/Services/AiUsageLimitExceptionHandler.cs": "a2504f08ba0777aa788cc0a9779d9d821e9e12985e7dbaefce422d50064b12fa",
"JobTrackerApi/Services/AiUsageMeter.cs": "42cfcdc54aa49defb53a9a2350d07f6e0c3b4673cccdc7f5db74b8dda93b3196",
"JobTrackerApi/Services/AiWorkspaceService.cs": "4e4050544d31134370748381d8c60940460784ce387d8d57e4fd1cf55056ee94",
"JobTrackerApi/Services/AnalyticsService.cs": "3027295ac354d9ef0d9dfb40c204081e5f3f423b2d0218afe69ff7919969395d",
"JobTrackerApi/Services/ApplicationAssetsService.cs": "ee2a25327023a80031860383f86cac9668b06780bc17d144930f8078a860f338",
"JobTrackerApi/Services/ApplicationChecklistService.cs": "b9b0bf8c362f4cecf4586e221b9e003cf241bfcbcf3baea45519d3227aeb4c4c",
"JobTrackerApi/Services/ApplicationIntelligenceService.cs": "4ee426d66e325a03196d88e3a952b337fc0d93847e5b2c9c952997307fb69aee",
"JobTrackerApi/Services/ApplicationTimelineService.cs": "0a42d6e2dc2647c8f878a5c21b17f3635771a1fe79933d1a5adca216c04ea7a7",
"JobTrackerApi/Services/ApplicationWorkspaceService.cs": "3b0f5370fc6dce61042937408eb0642894f386dace2163840560cae4ca99faf8",
"JobTrackerApi/Services/AppPaths.cs": "307792a8a162ab3c1ff74d11b0c7989444510d6234f1b45edddef1eb3519d413",
"JobTrackerApi/Services/AppSessionIssuer.cs": "f73923248baf7116a590cb2ba79ad7fb43c6faf12913d967fe45d61e32f20ac9",
"JobTrackerApi/Services/AttachmentStorage.cs": "ef0645d23d53c09dbbb82b8c4d4e834aa66fdc0f2077f2ee0cfd295e9e4d97b0",
"JobTrackerApi/Services/AuthSessionOptions.cs": "d21939343cfeffdfdbc820d93d9031716566f8000087e2080b658fc78f35f592",
"JobTrackerApi/Services/AvatarStorage.cs": "3317bdbbee4b62b2f94b75cbe6e60ffadfd721d16512c2ca0154812094fc2487",
"JobTrackerApi/Services/BackgroundTenantRunner.cs": "e44b126f2035abfbfd8485b68f6667f7595ca8beb82c77d12a8384bb55571332",
"JobTrackerApi/Services/BuildMetadata.cs": "e8ed979017c48e65bd450feee3d61bd0bcf913d2aa5843369e9a3f24fbcf0e3f",
"JobTrackerApi/Services/CareerCompleteness.cs": "0f91cc50cacb87b240126a4c516efb508aee8e615930be6be02652790b83d785",
"JobTrackerApi/Services/CareerProfileMapper.cs": "d8677ca1f99a9b604521ad3f00c143337c23b8d7f00af45a529115e3ed379496",
"JobTrackerApi/Services/CareerProfileService.cs": "2bd74fad2983739f35d47725213b8414d29c860bde365f3ea7190eb0051a8869",
"JobTrackerApi/Services/CareerProfileValidator.cs": "b630c0e7fad24690003c4e4021b9ad6fea506bf4b91a5dbbf5bbbefcbe40d39b",
"JobTrackerApi/Services/CsvCellSafety.cs": "ba9d2d0d99d236dcd25d244135a864c4702f62f35a298f48a32ca5ecd95ac44b",
"JobTrackerApi/Services/CurrentUserService.cs": "81ce46e3b907a25a44ba7f9814b04eb00bb4aa97618a31c6c842bf296d50732a",
"JobTrackerApi/Services/CvAiClassifier.cs": "db300b23fd6b07d506b2f886e5162c78a5f841997f448d9f1fa88d5b75c7f58c",
"JobTrackerApi/Services/CvAiGrounding.cs": "cf4b5b66b8577918fb7b75012d9a0b5a8d33e47f362d23b3476712c10ef7b231",
"JobTrackerApi/Services/CvAiNormalizer.cs": "cd3190b2e895da3121322a564d7d1529881c77d0aa591b2d893a0c46bbcc7671",
"JobTrackerApi/Services/CvAiSuggestionService.cs": "73d6523feba27bfcde375cbc2541f21481fdec6bd1d92d5060a8e730637e9181",
"JobTrackerApi/Services/CvImportDiff.cs": "89ae084ab1ed685338e375b208b3e9377dd222990ec06b27ea659d9ec6b2b93a",
"JobTrackerApi/Services/CvProcessingQueue.cs": "fc84c9ca50cad59416980c3b4ce378cf2f172742309406d2096ee48e588773e6",
"JobTrackerApi/Services/CvRenderModel.cs": "8c18035e5bfba230d6fb0f4200103e3a4b9bf4170e0edcfcfcb4f9506d36b6cb",
"JobTrackerApi/Services/CvTemplateRenderer.cs": "688127435023ecca7f7abb867cf4ec8d6d34886442254307c2d3b6f543330448",
"JobTrackerApi/Services/CvVariantService.cs": "97f450fc3613c03de064816e6388a8cfab60d46db5d2739ed3e9ba5da7a71bc2",
"JobTrackerApi/Services/DailyExportHostedService.cs": "03a811acef1ef3af481d5ce91e8600089a009d5b339dedcc672aabee9e9e4a5a",
"JobTrackerApi/Services/DatabaseBackupHostedService.cs": "b1ca4cd26c692069fefc361a1b50d5bd63a19368cc2ce7c3c2cef23d05cd1bfd",
"JobTrackerApi/Services/DatabaseBackupRunner.cs": "31634059bb25a5e9a9d438f927e533c33acbdb860e1c933cfc40198eb15c3579",
"JobTrackerApi/Services/DocumentsIndexService.cs": "def370bd0dbe90260e42800fded99302e56f8ac6b7693e73dd0a60cf0a3f7fd1",
"JobTrackerApi/Services/EmailProviders/GmailProvider.cs": "a82da88e1427d38a7468f7edbc5d42e44369905abfebdd1fa0141ddfcba39087",
"JobTrackerApi/Services/EmailProviders/IEmailProvider.cs": "ec8c1ff4d4b2ef3dea6f3abb8c8be483bd47d7aa80c0b5f0ce75b14bb1ccd99e",
"JobTrackerApi/Services/EmailProviders/ImapProvider.cs": "e04fd5ef64e18c82aaf90712aaf50f4fef5d9009757f3483777f65283b30b7b0",
"JobTrackerApi/Services/EmailProviders/MicrosoftGraphProvider.cs": "2d2984d679ff0ead5411fc13cbd201fc0891f27df83be4dc1a9214a84efaf884",
"JobTrackerApi/Services/EmailSendAttemptRecoveryHostedService.cs": "6e096c7b2ee33d07f305bc7db3bfd05f693369498d2e82d620f6e4361c49def4",
"JobTrackerApi/Services/EmailSendAttemptStore.cs": "4fb3e7ad8a8534cfbc081c42114bbf2fce65b954d561f6cff96d3548bc346f13",
"JobTrackerApi/Services/EmailSettingsResolver.cs": "0fdc358f9de21fc48ca002711fb5d73613a5185c074c4ea0b408f802bc579460",
"JobTrackerApi/Services/EmailStatusClassifier.cs": "5f7e352c8e35989d899f954ef4915abc290499edfffcc003a214bc5babe31f6e",
"JobTrackerApi/Services/ExternalOrigin.cs": "c6ce5d12b0bd14828c1f17703cd23ac609f8cd71367d6fd3758df46d977538c2",
"JobTrackerApi/Services/FollowUpReminderHostedService.cs": "63671d11d41ad6339bf2499044502cea9a2260bdf101647438f16ef49454641f",
"JobTrackerApi/Services/ForwardedProxyConfiguration.cs": "7f514586a082b5004056ae4e02afbd083bce4ec4181dd516cc7fe5ef454eacf4",
"JobTrackerApi/Services/GmailCorrespondenceEnrichment.cs": "4e6cc0900f27d7c5be0d6b756b430124eb57a7169bcc685969384a132fde1e2d",
"JobTrackerApi/Services/GmailJobMatchingService.cs": "97c05ffbb5792dfa0dab3f1642666066e087acfb2ab1ae1760437481cb3f343c",
"JobTrackerApi/Services/GmailOAuthService.cs": "b15e05c17ef6b3578455a9344d7a688d19355246e741c1cc202d9aec4e6346a2",
"JobTrackerApi/Services/GmailParsing.cs": "c9da9f20b7fa2e64f4555eab103b073728d47be17c52b9be8149a55f6eebaad5",
"JobTrackerApi/Services/GoogleTokenValidator.cs": "56448c5faa0acbc3155ab3df1b3c71b73be969972c5f149e3992ab3e91a49518",
"JobTrackerApi/Services/ImapService.cs": "65e0aeead7cb36cb263acd0fe878ae87077be62e417ea4be143a8c1ae542e174",
"JobTrackerApi/Services/InterviewPrepService.cs": "b236f78bc8db4c2bea8fc796ec55b77890aac0151cbdcaa3ba368ec0ee1c649c",
"JobTrackerApi/Services/JobApplicationHelpers.cs": "61b04b3d3bd040129510eaef66eef6f14fd4455593ffbecb42f34319aff16d5d",
"JobTrackerApi/Services/JobCvMatchService.cs": "0b851d20374f3205b9abb37c755b3189c5bb6f47863a36f1dca45ab88aff9b8f",
"JobTrackerApi/Services/JobDiscoverySearchService.cs": "7c7295f33b16d4c3d1e04f8fe7ac0d7eb2318c9f1fc191cc2aeb7b88d33d4057",
"JobTrackerApi/Services/JobEnrichmentHostedService.cs": "e2dd67e8e84e11a510c29404b3ecf82371d6790f3481254426ce004cfd2df401",
"JobTrackerApi/Services/JobImport/IHostAddressResolver.cs": "c4b0799782988e983d3c350c5224dffaeae2d95d0f0d69f01d6cab52ffa9ccc8",
"JobTrackerApi/Services/JobImport/IJobSitePlugin.cs": "6d8d2389df570e79ab34f1ea83098dcbcb9097dbf662697359d0522872b399c9",
"JobTrackerApi/Services/JobImport/JobImportHttpTransport.cs": "db3f8fb8e97b1d721dfda9915bfb53945fbe0aa497d32593733adef0684d0243",
"JobTrackerApi/Services/JobImport/JobImportResult.cs": "2a5a8923a0cc361c2476b196e5c6fc3d86359b7529f21dede5950448498e98e2",
"JobTrackerApi/Services/JobImport/JobImportService.cs": "8995aa2ce62c163c2b2a950a8c335ec655a07db03246aac3d8ee415a5a841273",
"JobTrackerApi/Services/JobImport/LanguageDetector.cs": "b4547478d4926614a50b90f5ee69e42ef3c64580e38bc8e1969323e68ea904a3",
"JobTrackerApi/Services/JobImport/Plugins/FinnPlugin.cs": "332ecfbe910a6fa2843a7169b285ca15ebd280dd3c2651c178edc7b1a84aef2c",
"JobTrackerApi/Services/JobImport/Plugins/JobbnorgePlugin.cs": "7e57f0980e424e2248b295455e12e173b5e34feb6e89ecbf1b70219bd1cb4dd8",
"JobTrackerApi/Services/JobImport/Plugins/LinkedInPlugin.cs": "7494c50d43de306d94fd826c3477c146d7b40126eb85a132c5c0874c6fcaeab9",
"JobTrackerApi/Services/JobImport/Plugins/NavPlugin.cs": "5ddb894ce0351e9bdc8829eabbf5e2aa04634b7d18993c6b606d82069a10406a",
"JobTrackerApi/Services/JobImport/SkillTagger.cs": "02a8f2aa2dd302342aa8f6d929a2a1aa552f7e765a405c805876e1004e4fd51f",
"JobTrackerApi/Services/JobImport/Translation/ITranslationService.cs": "ac9589f6ae3df8704749cd7f9e8a58e7e7b18ac0ea071238652e20c791cfc8d4",
"JobTrackerApi/Services/JobImport/Translation/LibreTranslateService.cs": "dc586592aaa155bdf7ae4a94cbd5d7323ffbf28210ccbe340c5a94bf7b16142f",
"JobTrackerApi/Services/JobImport/Translation/NoOpTranslationService.cs": "3d02f424057c2ff4e036fccda12b5c68b7d9de1ad8ad238c06c5734e76d4ee24",
"JobTrackerApi/Services/JobImport/UniversalJobParser.cs": "d75b2b6180fe733d370c95710983fcd7f18a000405a469a2f25100be2cc9e62f",
"JobTrackerApi/Services/JobLifecycleEvents.cs": "6e8c4cfadd7bf6ec85a4e226a4b865b48c94293911875743d67936e32a4cb9a3",
"JobTrackerApi/Services/JobOpportunitySync.cs": "9d4d23155e039d4316d393bbdcdcfdb24f05707a1f81becaefdc40167541ae04",
"JobTrackerApi/Services/JobPipeline.cs": "8d6ac0e36abcc7aa54215001fd55c98dbdda6c8b6ff22d4e9e538c769aa5b58a",
"JobTrackerApi/Services/LocalAuthIdentity.cs": "b482eb62e6d2642da1e0e20a54f3251a1d8c5ddc7e349d01dd2f4e309b8809e0",
"JobTrackerApi/Services/LocalSessionValidator.cs": "b71f53ffbd52b577fbf7e8d29e111b11ae7ad1268fab923e64bd795e5625fe31",
"JobTrackerApi/Services/MaintenanceJobDispatcher.cs": "528a346bdc6431ec3a1670226a4da9f541c9905c43ead27d905aad8b0ed25a1c",
"JobTrackerApi/Services/MeteredSummarizerService.cs": "6b0af014fcf36fb054a2abd880eba7bff302054709ebb2c65a35628f2aab7a5c",
"JobTrackerApi/Services/MicrosoftGraphOAuthService.cs": "e104297ad40b9573b62ff638bbb99c20c8cea6b5a67f71d8ca8fd2c0c8915f42",
"JobTrackerApi/Services/MicrosoftTokenValidator.cs": "029b436cb88a64773fecaaa152a11a2290d5d43be4945edc6229175c97a32799",
"JobTrackerApi/Services/PdfRenderAdmission.cs": "8052d01f48b0eb4c3a32d8659842a15925c63df07435b85004b867b7991a0e82",
"JobTrackerApi/Services/PdfRenderExceptionHandler.cs": "caad50b2fea488661cfc5741f287f033c880529db8fdcc74a50f684fc8e931aa",
"JobTrackerApi/Services/PlaywrightCvPdfExporter.cs": "63ebc55787cd1f340205c52f94a79ae20f9b09cb964b57cd61c921a853edc9b3",
"JobTrackerApi/Services/ProEntitlementAuthorization.cs": "bfb888aedba08b46059d5306105fc67836c516208861f29146091d38e7edc823",
"JobTrackerApi/Services/RateLimitPartitionKeys.cs": "087feed0668e22927ee238933b4dba6807cb59819752756690947ae77f391f2e",
"JobTrackerApi/Services/RevisionConflictExceptionHandler.cs": "2feb75cccbb4d7201eccdaa52429f559b8bac225dd231f12733fe069d2b97a5a",
"JobTrackerApi/Services/RulesEngine.cs": "a65df7c9f1e359051c2a749e69aa0665f4a8fe2e57a4e95919d3ed737ab242cc",
"JobTrackerApi/Services/RulesHostedService.cs": "bca993c4993bee18707fdcf6b7a557360589a7209fc6ecdedc5dff93308c52f2",
"JobTrackerApi/Services/SavedJobSearchAlertHostedService.cs": "20b33c143c946ea36fa2009f31789d6b420a5fb13445999eb7910fb5b58fe4ba",
"JobTrackerApi/Services/SavedJobSearchRunner.cs": "2b6de59608d1d259629839aa391047b699148119344a0f716db6f5aca417cb9d",
"JobTrackerApi/Services/SessionContextMiddleware.cs": "16e26f6a38b5b5ca8ed054d1a93475f908ec2f0fa4c26efd125ee888a0fe9d8e",
"JobTrackerApi/Services/SessionRevocation.cs": "42d017c634970dfcba25b8dbff4e944d2afeefc6ecde879ea2cadf9e9810034c",
"JobTrackerApi/Services/SmtpEmailSender.cs": "dcba060eedf623cbb5ccb58abba9b3acb547b21c7f6ffed825d6f66086c51581",
"JobTrackerApi/Services/StageAnalytics.cs": "af3940979b7688755e14ce6d9aa47e99ff3874b1e109cd6c738114335f039ff9",
"JobTrackerApi/Services/StartupInitializationExtensions.cs": "f5c4f37b4f98aa15f1a666f985fc80901df2337ffe3a9c76258e126bad0477a0",
"JobTrackerApi/Services/StartupReadiness.cs": "0afb319c4f7bdc97d3b767f33e32ec1e6d1ddcb98e2778055e9da2cd7f0a8934",
"JobTrackerApi/Services/StartupSchemaOwnership.cs": "07b873ceb129756a4dc1aca92249a1d0e4d23ee11d7696f05ab93e8a982540a1",
"JobTrackerApi/Services/StrategySnapshotService.cs": "cff0853c571db0eb9537fee294e986b0dd0bf31f579c5395f4241ed7c6645d20",
"JobTrackerApi/Services/StripeBillingGateway.cs": "55af587ebb6a42a4add137d3f038a6629b906ad9492449ade5166a74f0697c77",
"JobTrackerApi/Services/SubmittedApplicationPackageService.cs": "4f1b6a8f1f72dfe1f3f77bcd1b68e326d2b9eed5cacd72e6b3e54263ff15da5c",
"JobTrackerApi/Services/SummarizerService.cs": "b3b2184ea7c3c7676a6059559ff602ec99be03d503302a4515127578f33d89f6",
"JobTrackerApi/Services/ThemedCvRenderer.cs": "67fc2220b25f1d3eacbe4d0ec6706220c428542a6b193d71c5725d97db093c7b",
"JobTrackerApi/Services/TokenService.cs": "efa967c93ec99704af30184c534d086151db0da32bbdc3bf630372168c9cbbce",
"JobTrackerApi/Services/TrustedDeviceService.cs": "9ea9c002066ff07ee6339720b2533da3b5bd66a48e26196dc8fa3e23e3b3d0a1",
"JobTrackerApi/Services/TwoFactorPendingTokenService.cs": "053ea80a6a9236d50e87e6864adabcdf8b1c3571fcfd5018f1bb225c87be2a07",
"JobTrackerApi/Services/UserNotificationStore.cs": "befd2179c46acd0d09d583d83afbc9288b43485a01e3292c3bef6aa798a2e984",
"JobTrackerApi/Services/UserOperationStore.cs": "83721ad7bc99d70b9d4b55e0381e51e7449ff1c08a0005a36341d31b52a42693",
"JobTrackerApi.Tests/AccountDataExportTests.cs": "ef9dcd76a2db04a47892ce9144f46b30af558fa69f1649ccdd44183cf3fc6373",
"JobTrackerApi.Tests/AccountDeletionTests.cs": "024c734584dd1796a0681be81acb5c58a025f275f8033aa9dca38e36259d4b27",
"JobTrackerApi.Tests/AccountPlansTests.cs": "8475e012432d761cc9cc2b4d4d54844c253a9cf296784d8fdf4869a904154de8",
"JobTrackerApi.Tests/AiEvaluationFixtureTests.cs": "b11da83541077f3a69cc92f4093e0e3ef18820bca261de44cf34d9abcf4bdf5c",
"JobTrackerApi.Tests/AiOperationQueueTests.cs": "7c6700f9a26283ff5d699c77361eaaca76af1a22b38106e3c3e6f051842a7ed1",
"JobTrackerApi.Tests/AiPrivacyPolicyTests.cs": "8ee05a94eb3cf944bf9b5196762cc81b255ed3cc8130c85b191fceda60d8ea9e",
"JobTrackerApi.Tests/AiUsageMeterTests.cs": "44124c031ced9f8e77c1f6dcb11f2cd73ad451062cbee589d30689d04d82b4d0",
"JobTrackerApi.Tests/AiWorkspaceNotePersistenceTests.cs": "ccff51e4e889ede01350e69a70bd2cccd4d2f857f4696c08ce51772badf224aa",
"JobTrackerApi.Tests/AiWorkspaceTests.cs": "01808f99f1d68a04c2c4ab6c63ba156df9dc51b245c69c82e76e70db95833d3b",
"JobTrackerApi.Tests/AnalyticsSalaryTests.cs": "c26e08f1cc058320a4ba8fec36330dbad9835b376600d4f021c880861085c041",
"JobTrackerApi.Tests/ApiAuthorizationPostureTests.cs": "b0bf533d3696c6de93bf669d2f907063a213539d6814abc81dc3cb7b4a9aa3af",
"JobTrackerApi.Tests/ApplicationAssetsTests.cs": "09e56bb0e81a16fa35196751285ddbf04247fdd0f68ed03661ac235b23d016f3",
"JobTrackerApi.Tests/ApplicationCalendarControllerTests.cs": "fda00d91e9207ebf3d0b6c878ea38cd5e0129697277b15386cdc4e1c76ad8700",
"JobTrackerApi.Tests/ApplicationChecklistTests.cs": "4038c49ac8ff22474defa9d3461ea7f201e3bb51995adb2742243a44bc6f8152",
"JobTrackerApi.Tests/ApplicationIntelligenceTests.cs": "561a5490f3621dea43e8ca895e3b2260bdb7191ca85c8ae95bc96a63a9bc42d8",
"JobTrackerApi.Tests/ApplicationWorkspaceTests.cs": "4fa7a20ff64ad595903f02da4f401566d54ba47d7bfd0a357a08b21fe590c898",
"JobTrackerApi.Tests/AttachmentConsistencyTests.cs": "8759c572771611c198574fbf12261a88e2e3732dbb84caa75cd0ec9544bb2f9d",
"JobTrackerApi.Tests/AttachmentFlagsRecomputeTests.cs": "13c5bce6ae5661df5eac7d8bae913b493db58c7d0b4bc2fcfe385064a325040d",
"JobTrackerApi.Tests/AttachmentsControllerTests.cs": "1779ae51b9173aeb686e86834b33a1a0f6f0f6daf58ddf03eeb47833b13d93af",
"JobTrackerApi.Tests/AuthAndSystemControllerTests.cs": "eedb7aa6e334cc3f5a49bc98e1d7a46fb29c4a6874d5e0ac575ea82d04002320",
"JobTrackerApi.Tests/AuthSessionRevocationTests.cs": "2944a2e560c7b6b264239db9eeaff667a45db53d3e8ba51b49dc8263f600b92f",
"JobTrackerApi.Tests/AvatarStorageTests.cs": "d4af7a068acceaa4fac28eb208686015dc56227491a6a5d1716f553b59208ff1",
"JobTrackerApi.Tests/BackgroundWorkerTenantTests.cs": "9858a042b9d83bf2b2f8809f17f7364a6a623c3f2ef7517b20e758f4a63a6f64",
"JobTrackerApi.Tests/BackupControllerTests.cs": "5744dd4a5a7f6191ef2cccf0122ae76869a9111a74b8ad56297948d7b77bb25b",
"JobTrackerApi.Tests/BillingControllerTests.cs": "46477255d90c2b8d6e3dfe461457534f81b6fa535aeb46bd34b93e6f338e1036",
"JobTrackerApi.Tests/bin/Release/net9.0/JobTrackerApi.Tests.dll": "fc27b1b320a9a629f059e207488d1dd4b208dfd69029466b58af9dbe862c2aa4",
"JobTrackerApi.Tests/BuildMetadataTests.cs": "ad3b09389071067500a58cdf2c9b0e0806e6225d0f41b1b691f439f6af1cdada",
"JobTrackerApi.Tests/CareerEvidenceControllerTests.cs": "2621168ce6e0a287d2415da3c22a2348977d2989206e7737ba7de7e7780c7aae",
"JobTrackerApi.Tests/CareerProfileControllerTests.cs": "9f2f9c8327278f323f365dd929bf7b65942ac0940af7d3393f36098d31fff4c1",
"JobTrackerApi.Tests/CareerProfileServiceTests.cs": "06d095d9e1413d2ee5b5193a937e1b4f1539a13bff4fe6c803e286f960ed6f50",
"JobTrackerApi.Tests/ClientErrorsControllerTests.cs": "c589de308dc454001f9f284f80f07128a4dd16e1ae0b274c41a1fea2294a7733",
"JobTrackerApi.Tests/CompanyCreateCompatibilityTests.cs": "b15bbe1b256cae2a5712a954d2f84470d5a9acc1b734143d5879690486b5227c",
"JobTrackerApi.Tests/CompanyRelationshipTests.cs": "62563ff2414a43cd106c69457285c9739e2858c2ab40d14655532aa30f5a5c8e",
"JobTrackerApi.Tests/ConcurrentInitializationTests.cs": "5cec247df455423c2a03a00d35746c2e9d6c6a28186f14ea931ef2025aab4a82",
"JobTrackerApi.Tests/CorrespondenceControllerTests.cs": "02f90e5933dc24cc300745e16d3e0d54375d6764ef0de4aa3e8b0ec866850edb",
"JobTrackerApi.Tests/CsvExportTests.cs": "bf928629ed1e973d62125b78bc0ddf0a36257563ce8f5aef38a6495de738f80e",
"JobTrackerApi.Tests/CurrentUserIdLiveEvaluationTests.cs": "b967941bb70c19dca3acff35d20ef9e7986ce025c00b3f385787095ac3a9fce8",
"JobTrackerApi.Tests/CvAiEvaluationTests.cs": "530d6d9b4a224bd95684b36b53ebc65bda7918bcee0a0f9022f51d1c14ff38f5",
"JobTrackerApi.Tests/CvAiGroundingTests.cs": "3804fb2dc4369360da50f9875feee5580603a067d4a276158592b8344d80e774",
"JobTrackerApi.Tests/CvAiReadinessTests.cs": "40065c73939bfe887774447d658cdfe3358ce1313aa5b06176607f8aca9d1d25",
"JobTrackerApi.Tests/CvBuilderTests.cs": "6c47911475eddc21cf177c0a3bf9fcc812e823904d42289d4415a295edd71a7d",
"JobTrackerApi.Tests/CvCorpusHarnessTests.cs": "31ae65607f964d78d4ea2520f6b0817b871cf9e4b9755d589cd1fb30f6b1c1d7",
"JobTrackerApi.Tests/CvExportRetentionTests.cs": "0b91d38b290a43e371390cbbe97b2b77a8b27e0ade065c45747d84b177bad8b6",
"JobTrackerApi.Tests/CvExtractionCoverageTests.cs": "b8c70aec81acd80871cf4104cad30a2467fee8722137b6367d8d82fd282f4643",
"JobTrackerApi.Tests/CvProcessingOperationTests.cs": "4f40aad7614759d5e17e41fc34230d74b618360aa8ea2caa8fc362ba46b02484",
"JobTrackerApi.Tests/CvProfileDiffServiceTests.cs": "e26a50aab44b0175078a4f23cb199dbd8efdede1fb5fed0d8cda406466ecbe20",
"JobTrackerApi.Tests/CvRevisionReadinessTests.cs": "22b1f6a2dbfffb88bf11c217c41f3eb84086471da1023023c034a7521a9a21aa",
"JobTrackerApi.Tests/DashboardPreferencesTests.cs": "745c457a6308aef4ca307cd38ec9d427d0d9c08738468cbab902ad7df1404096",
"JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs": "3107d265b272775eead9b26e0b56f8560db15f9102f0f421fe7fcfc63ec9bbc3",
"JobTrackerApi.Tests/DocumentsControllerTests.cs": "f16d3d78b072faaea87c376888803ecbf8daec6da62368d89ea78ecd8bc9bac2",
"JobTrackerApi.Tests/EmailControllerTests.cs": "662e460950162c2965cb27fc869107bfe5e347326ff8589f652b52b1f904e9e8",
"JobTrackerApi.Tests/EmailDraftPersistenceTests.cs": "b07366bc498231db84c40cde281ccd645a3836b2356358b6666d90d289aa1604",
"JobTrackerApi.Tests/EmailDraftsControllerTests.cs": "088c8b52ff90c44f91d1014966568fa4f5cf245cc6dff89b1cd6f19b56d4fdfd",
"JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs": "e5df2db6e7223de53d66e0b2c4e2bc08aaebeddd04075f794b7e8d6f82a3fe5b",
"JobTrackerApi.Tests/EmailProviderDeliveryTests.cs": "ad4997b2fcd821f163e9670328f866b84d5fb7a568b0454c2e4910f3e8969af4",
"JobTrackerApi.Tests/EmailSendAttemptStoreTests.cs": "97cabc2fc554a584723645a7c80eb1b7dd13967d90353facc701418140d5126a",
"JobTrackerApi.Tests/EmailSendControllerTests.cs": "f21032b2e1f8a663398ee834cea33cef4369f048039372997a041b5f2b56b179",
"JobTrackerApi.Tests/EmailStatusClassifierTests.cs": "cdf53f1a88d45ecdf79e3c6765bea30d60d219a1bd7139a3cfea24274c95cfca",
"JobTrackerApi.Tests/ExternalOriginTests.cs": "ff91757dd21da47708371ac7aa29bc6acc0ad4f9e1e0124a6ed5374c981be434",
"JobTrackerApi.Tests/Fixtures/AiEvaluation/cases.json": "3869e579f6704400762a08ceb6b721293f2cbd73a2d79b62f224215f76ee9707",
"JobTrackerApi.Tests/Fixtures/AiEvaluation/cv-rewrite-grounding.json": "424e09801f184e9e099212a8c9eef050bf197c8bba5a747dbb18d2d6823654d6",
"JobTrackerApi.Tests/Fixtures/CvCorpus/synthetic-developer-cv.txt": "056f1f0faa680c47e5b540b592678a6259ec4eb057f750d25af2fb65411a79b5",
"JobTrackerApi.Tests/ForwardedIngressTests.cs": "7be37035abdab064f17ae6adca041daa83d98d99a889093ff75409770f5d0f87",
"JobTrackerApi.Tests/GmailControllerTests.cs": "69ab904ad8f62cb57309d2038651ea1c5301070c5a6b76d2dda4150ca75e86e8",
"JobTrackerApi.Tests/GoogleTokenValidatorTests.cs": "7f37d568feea9e4f0c93199ce4fcae431cecc754eb437d86cfb4164a079d0c95",
"JobTrackerApi.Tests/HumanLanguageCatalogTests.cs": "25d3f8e629c6f91021bbe9fb2bf0647ba0ec77a94b9cfff71c01d40aae493634",
"JobTrackerApi.Tests/ImapControllerTests.cs": "ed9fc218df99b0f0b68802270fd8e5f69ef4d2bc1f328e1e667026b6bf584837",
"JobTrackerApi.Tests/ImapProviderTests.cs": "c1666157d28fbadadece5c99f0bd6f236ed0a47dec76701798224805c6838c16",
"JobTrackerApi.Tests/ImapServiceSsrfGuardTests.cs": "2357456278d59868d6a33e3c341fe55c3eb7cb952f39a4120bc8346a5265f8e4",
"JobTrackerApi.Tests/InterviewAiContextTests.cs": "3301a31c004119274753855c9714e91722ff39415f2ea49a6c933277613412e6",
"JobTrackerApi.Tests/InterviewPrepPersistenceTests.cs": "26ed6e1d4b04845e9bd61a6f281111d30807008a368835063e5e79df05889043",
"JobTrackerApi.Tests/InterviewPrepTests.cs": "77957a0fe01cc0960dbf3dfa18b782ff13fc6e63a72b4b3d04bce24bc931162c",
"JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs": "2ffe92fa4f96b6241d0fc487edf5ae87d73f87d1bc830e9a8445da298413752b",
"JobTrackerApi.Tests/JobApplicationsAppliedDateHistoryTests.cs": "a64865b38cc81ebcac9422f83540a3ae172d7ec6a9af2a6771e934f1ef22cf3b",
"JobTrackerApi.Tests/JobApplicationsAuthorizationTests.cs": "a1513153818a5485b0406791e599c46a1247dcc6e9157d9ae85d0d19f7a81c17",
"JobTrackerApi.Tests/JobApplicationsControllerTests.cs": "63fa161f4c5c410ace99dc1b48621812ff44bda3be95b3002eaf6bbcadecda17",
"JobTrackerApi.Tests/JobApplicationsEndpointBehaviorTests.cs": "099247e0953570938ea02437a82d9d41b2c39760306f9e3080965fea43499bc1",
"JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs": "72ebdca92d5e04c67f773171ee41988062c08da44088ba08dd2ec7ebcf7cb855",
"JobTrackerApi.Tests/JobApplicationsMariaDraftTests.cs": "32df13dcce2fac5f3e0e591c1f73d20a58037f56b80927a7e1b08c0a467f0cf0",
"JobTrackerApi.Tests/JobApplicationsWorkflowSignalsTests.cs": "fcf5a226a8c927ed153e5248a3d37cfd9ca6281e8dd5ba8223eb742da0a9cab6",
"JobTrackerApi.Tests/JobCvMatchServiceTests.cs": "30e74ac4da597d7ec7871d400464643e19bbe081179fce49ecb4406e71228704",
"JobTrackerApi.Tests/JobDiscoveryControllerTests.cs": "a37087613dc75584d986bd5d300e625c800f092b3aedf1754cf12530b7e9f6b7",
"JobTrackerApi.Tests/JobImportHttpTransportTests.cs": "4df5f04867aebf9cefcc52f55a84904d1aac5ab7492d78fe5f0447a54a92d054",
"JobTrackerApi.Tests/JobImportServiceTests.cs": "548690eab644c1c62717181d59005375182b91b63f2e81c0ac1cb6d54c2d8748",
"JobTrackerApi.Tests/JobLifecycleEventTests.cs": "1d4c2096b551ef9090cd03e807b98d5bc8bb0182d5f0b456e7cd0cd064902514",
"JobTrackerApi.Tests/JobOpportunitySyncTests.cs": "3b036116160e3ee1d0f9c32dbea19698d354ba591b240d5f3a60b3ac3d787f71",
"JobTrackerApi.Tests/JobPipelineTests.cs": "04e491468fd63fea81144860ba4382d3c059424d9264d2a13eca8810e8ffd36b",
"JobTrackerApi.Tests/JobQueryParityTests.cs": "fd5ff8a7ed9cea356e1778514572380e203ac3806aff11ca334f7e1502a26fcd",
"JobTrackerApi.Tests/JobTrackerApi.Tests.csproj": "d1bf4553a7235372c4594e81b8ad81597817e97eabe7c47ecc7f574daf4805e8",
"JobTrackerApi.Tests/LocalAuthIdentityTests.cs": "ddff1dac6bf03dd8f92185eafe5345bbf418b44861ede755f5ae1c4e80b8d3ed",
"JobTrackerApi.Tests/MaintenanceJobDispatcherTests.cs": "61b93390b123a307917143b56915546e60bbcacd59c9771a30e45bacac3753cf",
"JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs": "2d4d067470eba6f9063fcbd3660d2636ccf6bdd8b9c3546b1a6e26503eb16964",
"JobTrackerApi.Tests/MicrosoftGraphControllerTests.cs": "0847a7b630cc5cf52a9eb1196d8c5e7aeb7d7b37b7bf327131ef2e6f32ecde57",
"JobTrackerApi.Tests/MicrosoftGraphProviderTests.cs": "dd6cb7915be541927a61c4089cdc6c57fa187154c4631b7b61597901e9a683e9",
"JobTrackerApi.Tests/MicrosoftTokenValidatorTests.cs": "406fd947e208ffde5794dd94f696b5a594c205620cdd9a6750b1676f78dc6ac3",
"JobTrackerApi.Tests/MigrationChainTests.cs": "739346329b39973befa86fc461a69f83ad0276f91d8e230013372255be6810af",
"JobTrackerApi.Tests/NotificationSettingsControllerTests.cs": "d411cc091623e9ec55315e677bb78984f97369287cb167bed748054506e55a95",
"JobTrackerApi.Tests/OperationsControllerTests.cs": "06d6f91b70af4e1e98fe67246a76a9084d22a4050667295349a14c4d520c8e75",
"JobTrackerApi.Tests/OwnershipGuardTests.cs": "f2b17cf32e12a6c964f5fd44f321baf7042715901db6e7307d385ecb5e4a3179",
"JobTrackerApi.Tests/packages.lock.json": "87b844f0ea71a7f8351b1a04a2db5c7f8c2b9fb1685f8d3850b6743acd21b9e1",
"JobTrackerApi.Tests/PdfBrowserStub/PdfBrowserStub.csproj": "933bfd93fb4668ecf73c60797396a2f0e200a7b82512e75de5ba7bdd5be269de",
"JobTrackerApi.Tests/PdfBrowserStub/Program.cs": "941fc179de977fa0c1038e67770720b4a71552c7c758d93ad94bad746fa4f090",
"JobTrackerApi.Tests/PdfRenderAdmissionTests.cs": "902359cfee8ff1467c7980220626509cccf0f29a91f8a4915376e600d5e2f7c1",
"JobTrackerApi.Tests/ProductionConfigTests.cs": "c3be7df38debd6c8117205e912bd3a7a402c130c6f66c169e2beb964dd71137a",
"JobTrackerApi.Tests/ProEntitlementAuthorizationTests.cs": "86e0dc24c017bf7b141251787fce66bceb58e04d8ff4979446b7ded5a6212f87",
"JobTrackerApi.Tests/ProfileCvControllerTests.cs": "e7a5b41893c62243c74e11ca311c2a915fc8b04ac236158aa52c26f05d018609",
"JobTrackerApi.Tests/PublicCvControllerTests.cs": "94bbb54fcfce091db453ddb0584f71d9a3f5936232a5c9c460c2692d933c4374",
"JobTrackerApi.Tests/RateLimitPartitionKeysTests.cs": "578314976674bbba6f5fb28a46f42145fe497a53e9029af5d1308f8540907477",
"JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs": "ffd4b396d2a713f3c9ff681ee4566ff36d676d17c8b9d6611688261c183bd9db",
"JobTrackerApi.Tests/Rd21JobPersistenceTests.cs": "b78c3d1404f86cf21a444f5dc22b156f18efdd59c2b9c03211813ca043e87f1f",
"JobTrackerApi.Tests/RouteUniquenessTests.cs": "eaa70af418b1fe6316cffaf4490dd76e2fb8688f74f8e95ba623273555071189",
"JobTrackerApi.Tests/RulesEngineProspectTests.cs": "d92b4312f9937b4238a86150648958c531f5581a61f9ebaf0f8a4acc597614f2",
"JobTrackerApi.Tests/SavedJobSearchAlertTests.cs": "a1ea58ac16cfb504bb73d48bd214603587282d8b830a19ab9de7d89a8c728a70",
"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs": "cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50",
"JobTrackerApi.Tests/SessionContextMiddlewareTests.cs": "457ee0d37b50dea156d0dca80583fbda2721ccbc0d942af80714976131610e24",
"JobTrackerApi.Tests/SessionsControllerTests.cs": "5cbb946f4341528e535ba0ef44aca1e4c9500861b5266ac4777f53d4bc7bdef0",
"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs": "39bada1e50303e250b529efaea96a8a4c0738708a8ccf1bf8c9406d3728e6702",
"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs": "6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b",
"JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs": "536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a",
"JobTrackerApi.Tests/StageAnalyticsTests.cs": "231ada7b7e0766eacbe2c6753949cd667678f95c1163cc37be38ceb9cf24e2d0",
"JobTrackerApi.Tests/StartupSchemaOwnershipTests.cs": "6cb7829ce25a28a9c715a99fe3a1677b5679e576fbd94fcad3ce7c5c86ada2d1",
"JobTrackerApi.Tests/StrategySnapshotOperationTests.cs": "75d2a336a451356dfefdc0e0d210b7c10ae95ae6ed632a85238a66043bf9e74e",
"JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs": "1b3d71b32b3394cd855cd040afb5433da2ba64bd6ba4e96ab3fe4215b97a6b7d",
"JobTrackerApi.Tests/SummarizerServiceTests.cs": "2bd8b479ea653f2ec5f1c0d2e5a7aa0c216be58ac42e41ba0785c316172bbe47",
"JobTrackerApi.Tests/TestSupport/TestHostFactory.cs": "c151d2311b884ef4a982c8fd1b703470df5448fe32a8faeea25e0b1bc93b9804",
"JobTrackerApi.Tests/TwoFactorControllerTests.cs": "06090015be9b60569987dbeee0c867653252671a9f07fb3f4b7dd3aef4a4846f",
"JobTrackerApi.Tests/UserOperationStoreTests.cs": "f72a76bf949fdecd7f6b923800aa2b9de052accbdea3723886e88c05836c9e57",
"JobTrackerApi.Tests/UsersControllerTests.cs": "3c49aae7fbfd7abe25c6c67c301c77a08adb614c61c018a9139278a12bbd129d",
"tools/summarizer/.dockerignore": "bb2ae3e760f6dd01d9332f60ec386699d4cd4fc0ad107ec961102acdef0dbd2d",
"tools/summarizer/app.py": "a721a7633f7ed93b7353f2135536a168e096494629506634c96b456b7ae713c2",
"tools/summarizer/Dockerfile": "d0b8777e81a74ed7099fe1d93f608b6601da39efc43b50ec0b3b058613207443",
"tools/summarizer/parser_child.py": "0074a05e9a0d511e26a329a057f98568cdc1723b2cc37168e0b59975b5424451",
"tools/summarizer/pytest.ini": "a7807c5eb6605b011dcd25172dc41218152a8f770296530553516ba5b9ce550f",
"tools/summarizer/README.md": "9819bee2323e514b502a2e5bf8476b48e0fa7721531c9ad1a9cb87ffd2deac57",
"tools/summarizer/requirements-dev.txt": "99597e9fe57388ff58a2b6582c41eea38854f9536987fcd9673116d68722e3d5",
"tools/summarizer/requirements-linux.lock": "36f2912965d183e59f2d8320f3817ca8dd0fee6d76e05cfd63ac92defe6c6031",
"tools/summarizer/requirements.txt": "0565afe7443fb60531af2938f9e34cf402f2db86eb23141e0e59182d48fa739a",
"tools/summarizer/scripts/bootstrap-and-test.sh": "ea1210abc4fcd830ae8cd58b62ad695590fbc24d006acd7c5723c2b6c20f5b52",
"tools/summarizer/tests/test_app.py": "7896ef777ecdedca1f0b6ce5328ca49608cf199eebb0d84d904567384611f822",
"tools/summarizer/tests/test_cv_grounding.py": "f13febeec5038ec96f121566fa6e5e22857075cec9f56b55def4d413d5127fae",
"tools/summarizer/uvicorn.err": "b03a759d0627646713696c5bc0e13475ea83f3eb840cc72a29c0f97da0e6a7f8",
"tools/summarizer/uvicorn.out": "23b596cbdefaac3284b41ea2d8773159480477eff5ef50435ead41390eed8dd5"
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,9 @@
{
"onlySemanticChange": "Read and carry the current Career revision for the initial synthetic seed; all volume assertions unchanged.",
"inputs": {
"docs/redesign/phase-9/p9-05/volume/playwright.config.ts": "0df97a9de76c0bbb9a0035fcec00bda0a665e0e6ba92ae5377bfc20869dac1c6",
"docs/redesign/phase-9/p9-05/volume/volume.spec.ts": "4510f29298f6391b36d27d2634b1f9355802eafcc310488231014fab799a4108",
"docs/redesign/phase-9/rd21-remediation/volume/playwright.config.ts": "9a689d58947778fbe601d4287129f49dc85a69688b3ba1d76bbada47a6d5a4f5",
"docs/redesign/phase-9/rd21-remediation/volume/volume.spec.ts": "e682394b0c11116df9e588fbb2ce923184c32eb0dd0475c4fd94f2914302be96"
}
}
@@ -0,0 +1,12 @@
import { defineConfig } from '../../../../../job-tracker-ui/node_modules/@playwright/test';
import base from '../../../../../job-tracker-ui/playwright.config';
import os from 'node:os';
import path from 'node:path';
const server = Array.isArray(base.webServer) ? base.webServer[0] : base.webServer!;
const dataRoot = path.join(os.tmpdir(), `jobtracker-e2e-p9-volume-${process.pid}-${Date.now().toString(36)}`);
export default defineConfig({ ...base, testDir: __dirname, testMatch: '*.spec.ts', retries: 0,
metadata: { isolatedDataRoot: dataRoot },
webServer: { ...server, cwd: path.resolve(__dirname, '../../../../../job-tracker-ui'),
command: server.command.replaceAll('5302', '5304'), url: 'http://localhost:5304/health',
reuseExistingServer: false, env: { ...server.env, Data__Root: dataRoot } } });
@@ -0,0 +1,100 @@
import { test, expect, type APIRequestContext, type PlaywrightWorkerArgs } from '../../../../../job-tracker-ui/node_modules/@playwright/test';
import { spawnSync } from 'node:child_process';
import path from 'node:path';
const base = 'http://localhost:5304/api';
const password = 'E2ePassword123!';
async function login(api: APIRequestContext, email: string) {
expect((await api.post(`${base}/auth/login`, { data: { email, password } })).status()).toBe(200);
const me = await (await api.get(`${base}/auth/me`)).json();
return { 'X-CSRF-TOKEN': (await api.storageState()).cookies.find(cookie => cookie.name === 'XSRF-TOKEN')!.value, 'X-Session-Context': me.sessionContext as string };
}
async function owner(playwright: PlaywrightWorkerArgs['playwright']) {
const admin = await playwright.request.newContext();
const api = await playwright.request.newContext();
try {
const headers = await login(admin, 'e2e@example.test');
const email = `p9-volume-${Date.now()}@example.test`;
const response = await admin.post(`${base}/users`, { headers, data: { email, password, roles: [] } });
expect(response.status()).toBe(200);
return { api, email, id: (await response.json()).id as string, headers: await login(api, email) };
} finally { await admin.dispose(); }
}
test('P9 volume: 100 CV revisions retain exact history, stale rejection and additive restore', async ({ playwright }, info) => {
test.setTimeout(180000);
const account = await owner(playwright);
try {
const { api, headers } = account;
expect((await api.put(`${base}/career/profile`, { headers, data: { expectedVersion: (await (await api.get(`${base}/career/profile`)).json()).revision, profile: { version: '1', contact: { fullName: 'Volume fixture' }, summary: ['Canonical unchanged'] } } })).status()).toBe(200);
const source = await (await api.get(`${base}/career/profile`)).json();
const created = await api.post(`${base}/cv/variants`, { headers, data: { name: 'Volume CV', settings: { themeId: 'minimal' } } });
expect(created.status()).toBe(200); let cv = await created.json(); const id = cv.id;
for (let version = 2; version <= 100; version++) {
const response = await api.put(`${base}/cv/variants/${id}`, { headers, data: { expectedVersion: cv.version, name: cv.name, settings: { ...cv.settings, headline: `Revision ${version}` }, source: 'manual' } });
expect(response.status()).toBe(200); cv = await response.json(); expect(cv.version).toBe(version);
}
const history = await (await api.get(`${base}/cv/variants/${id}/versions`)).json();
expect(history.map((row: { version: number }) => row.version)).toEqual(Array.from({ length: 100 }, (_, index) => 100 - index));
expect((await api.put(`${base}/cv/variants/${id}`, { headers, data: { expectedVersion: 99, settings: cv.settings } })).status()).toBe(409);
expect(await (await api.get(`${base}/cv/variants/${id}/versions`)).json()).toEqual(history);
const restored = await api.post(`${base}/cv/variants/${id}/versions/2/restore`, { headers, data: { expectedVersion: 100 } });
expect(restored.status()).toBe(200); expect(await restored.json()).toMatchObject({ version: 101, settings: { headline: 'Revision 2' } });
expect((await (await api.get(`${base}/cv/variants/${id}/versions`)).json()).length).toBe(101);
expect(await (await api.get(`${base}/career/profile`)).json()).toEqual(source);
await info.attach('phase9-volume-cv', { body: JSON.stringify({ savedRevisions: 100, finalVersions: 101, staleStatus: 409, canonicalUnchanged: true, limits: 'Native isolated SQLite API; no100-row history UI or MariaDB/long-term capacity claim.' }), contentType: 'application/json' });
} finally { await account.api.dispose(); }
});
test('P9 volume: 100 manual timeline messages retain exact membership and foreign-owner denial', async ({ playwright }, info) => {
test.setTimeout(180000);
const account = await owner(playwright); const other = await owner(playwright);
try {
const { api, headers } = account;
const company = await api.post(`${base}/companies`, { headers, data: { name: 'Synthetic volume timeline' } });
expect(company.status()).toBe(201);
const job = await api.post(`${base}/jobapplications`, { headers, data: { companyId: (await company.json()).id, jobTitle: 'Volume timeline fixture', status: 'Saved' } });
expect(job.status()).toBe(201); const jobId = (await job.json()).id;
const ids: number[] = []; const expectedContent = new Map<number, string>();
for (let index = 0; index < 100; index++) {
const content = `Timeline evidence ${index} ${'Documented progress. '.repeat(20)}`.trimEnd();
const response = await api.post(`${base}/correspondence`, { headers, data: { jobApplicationId: jobId, from: 'Synthetic manual note', content, channel: 'manual', direction: 'incoming' } });
expect(response.status()).toBe(201); const id = (await response.json()).id; ids.push(id); expectedContent.set(id, content);
}
const response = await api.get(`${base}/correspondence/${jobId}`); expect(response.status()).toBe(200);
const rows = await response.json(); expect(rows.map((row: { id: number }) => row.id).sort((a: number, b: number) => a - b)).toEqual([...ids].sort((a, b) => a - b));
for (const row of rows) expect(row.content).toBe(expectedContent.get(row.id));
expect((await other.api.get(`${base}/correspondence/${jobId}`)).status()).toBe(404);
await info.attach('phase9-volume-timeline', { body: JSON.stringify({ messages: rows.length, exactMembership: true, foreignRead: 404, limits: 'Native persisted manual correspondence; no external mail delivery or100-message browser rendering claim.' }), contentType: 'application/json' });
} finally { await account.api.dispose(); await other.api.dispose(); }
});
test('P9 volume: 100 native cancellation notices preserve bounded lists, unread counts and ownership', async ({ playwright }, info) => {
test.setTimeout(300000);
const account = await owner(playwright); const other = await owner(playwright);
try {
const dataRoot = info.config.metadata.isolatedDataRoot;
expect(typeof dataRoot).toBe('string'); expect(process.env.PLAYWRIGHT_REUSE_SERVERS).not.toBe('true');
for (let index = 0; index < 100; index++) {
// Existing helper admits one inert insert only after temp-path/schema/owner verification.
const seeded = spawnSync(process.env.PLAYWRIGHT_PYTHON_PATH || 'python', [path.resolve('e2e/helpers/seed-operation.py')], { input: JSON.stringify({ dataRoot, ownerId: account.id, ownerEmail: account.email }), encoding: 'utf8', timeout: 15000 });
expect(seeded.status, seeded.stderr).toBe(0);
const id = JSON.parse(seeded.stdout).operationId;
expect((await account.api.post(`${base}/operations/${id}/cancel`, { headers: account.headers })).status()).toBe(200);
}
const list = await account.api.get(`${base}/notifications?limit=100`); expect(list.status()).toBe(200);
const rows = await list.json(); expect(rows.length).toBe(100); expect(new Set(rows.map((row: { id: string }) => row.id)).size).toBe(100);
expect((await (await account.api.get(`${base}/notifications`)).json()).length).toBe(25);
expect(await (await account.api.get(`${base}/notifications/unread-count`)).json()).toEqual({ count: 100 });
expect((await account.api.get(`${base}/notifications?limit=101`)).status()).toBe(400);
expect(await (await other.api.get(`${base}/notifications`)).json()).toEqual([]);
expect((await other.api.post(`${base}/notifications/${rows[0].id}/read`, { headers: other.headers })).status()).toBe(404);
expect((await account.api.post(`${base}/notifications/${rows[0].id}/read`, { headers: account.headers })).status()).toBe(204);
expect((await account.api.post(`${base}/notifications/${rows[0].id}/read`, { headers: account.headers })).status()).toBe(204);
expect(await (await account.api.get(`${base}/notifications/unread-count`)).json()).toEqual({ count: 99 });
expect((await account.api.delete(`${base}/notifications/${rows[1].id}`, { headers: account.headers })).status()).toBe(204);
expect(await (await account.api.get(`${base}/notifications/unread-count`)).json()).toEqual({ count: 98 });
expect((await (await account.api.get(`${base}/notifications?limit=100`)).json()).length).toBe(99);
await info.attach('phase9-volume-notifications', { body: JSON.stringify({ notices: 100, defaultList: 25, maxList: 100, repeatedReadCount: 99, afterUnreadDismiss: 98, foreignMutation: 404, limits: 'Existing guarded inert operation seed + native cancel/read/dismiss. No enabled worker/provider/model or100-item bell UI claim.' }), contentType: 'application/json' });
} finally { await account.api.dispose(); await other.api.dispose(); }
});