Compare commits

..

8 Commits

93 changed files with 54936 additions and 6 deletions
+40
View File
@@ -0,0 +1,40 @@
# Reproducing the local qualification
Run from the repository root with existing installed dependencies and the pinned SDK. Create artifact directories first. PowerShell wrappers must preserve native exit codes; `$ErrorActionPreference='Stop'` plus redirected native stderr incorrectly treated benign process warnings as terminating errors in early attempts. Original failures remain under `.artifacts/phase9/`; final counts come only from completed zero-retry reports and exit metadata.
```powershell
$env:DOTNET_ROOT='C:\Users\Connor\.dotnet'
$env:DOTNET_HOST_PATH="$env:DOTNET_ROOT\dotnet.exe"
rtk proxy python docs/redesign/phase-9/p9-00/inventory.py
rtk proxy $env:DOTNET_HOST_PATH test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore --logger 'trx;LogFileName=phase9.trx' --results-directory .artifacts/phase9/backend
```
Inventory regeneration reflects the current checkout: the entry inventory has58 browser source files; Phase9 adds one ordinary spec, so regeneration has59. Do not overwrite the entry snapshot and mislabel it original evidence.
From `job-tracker-ui`:
```powershell
rtk proxy node node_modules/jest/bin/jest.js --runInBand --json --outputFile=../.artifacts/phase9/frontend.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
$env:PLAYWRIGHT_STATIC_EXPORT='true'
$env:PLAYWRIGHT_PREBUILT_EXPORT='true'
$env:CV_FIDELITY_OUTPUT='E:\Storage\Projects\Active\Job tracker\.artifacts\phase9\fidelity'
$env:CV_SETTINGS_FIDELITY_OUTPUT='E:\Storage\Projects\Active\Job tracker\.artifacts\phase9\settings-fidelity'
$env:PLAYWRIGHT_JSON_OUTPUT_NAME='E:\Storage\Projects\Active\Job tracker\.artifacts\phase9\ordinary-shard-1.json'
rtk proxy node node_modules/@playwright/test/cli.js test --shard=1/4 --retries=0 --reporter=list,json --output=../.artifacts/phase9/ordinary-shard-1-results
```
Repeat the ordinary command serially with `--shard=2/4`, `3/4` and `4/4`, separate `ordinary-shard-N.json` and output names, and an unchanged source/export. Playwright keeps connected files together because fullyParallel is false. Native `test --list --reporter=json` records the complete discovery set without starting servers. Final reconciliation requires the exact discovered362 IDs to appear once across the four successful shards. Interrupted attempts are retained but excluded. This preserves completed result checkpoints rather than repeatedly losing a nearly hour-long run; assertions/retries/skips are unchanged.
Run separate browser configurations sequentially, each with its own JSON/output name: `playwright.cv-ai.config.ts`, `playwright.auth-recovery.config.ts`, `playwright.rate-limits.config.ts`, `playwright.ingress.config.ts`, `playwright.pdf.config.ts`, and `../docs/redesign/phase-5/p5-15/p5-15-01/diagnostics/playwright.config.ts`. Use the same CLI `--config=... --retries=0 --reporter=list,json`. The Phase9 lane uses `../docs/redesign/phase-9/p9-05/diagnostics/playwright.config.ts` (18 cases); the separate API-only volume lane uses `../docs/redesign/phase-9/p9-05/volume/playwright.config.ts` (3 cases). Native PDF admission uses inert processes; it is distinct from native rendering fidelity.
The configs start isolated synthetic local API/storage and a static frontend. Do not point these workflows at production. Successful native reads/writes, scoped intercepted failure responses and withheld model operations must remain distinguishable.
From `tools/summarizer`, `SKIP_MODEL_LOAD=1`, run `rtk proxy .venv/Scripts/python.exe -m pytest -q tests --junitxml=../../.artifacts/phase9/sidecar.xml`. No inference semantics are qualified by these56 contracts.
The unchanged `scripts/verify-cv-fidelity.py` takes a corpus directory containing `measurements.json` and native PDF/preview fixtures. It requires the existing Python PDF/Pillow dependencies (bundled workspace runtime used in this run). Invoke it separately for the fidelity corpus and the combined Settings measurements. Never increase its tolerances to clear a failure.
After accepted reports exist, `rtk proxy python docs/redesign/phase-9/evidence.py` builds portable cases, route/axe/RD21/performance records and hashes raw reports. `rtk proxy python docs/redesign/phase-9/reconcile.py` checks362 ordinary cases,396 route vectors and57 unchanged preservation dispositions before generating final ledgers. Missing or failed data must not be replaced with baseline counts. Source/artifact identities are retained in `p9-00/source-manifest.json`.
+28
View File
@@ -0,0 +1,28 @@
# Phase 9 — Comprehensive QA and regression qualification
Entry: `1c24e406f194f0f42277d837b3008a7a28dca26a`, clean working tree and direct Phase 8 remote equality verified 22 October 2026. Work branch: `feature/phase9-full-qa`. Main was observed at `5f835e54a9b74e6b71418422e28431b2af06453f` at entry; later HTTP502 prevents a fresh remote claim. It is not the redesign base.
## Execution plan
Goal: assess the existing application, repair reproduced in-scope defects, and make independent Phase 9, Phase 10 and production decisions. Reuse the .NET, Jest, Playwright, offline Python and native PDF fixtures. No redesign, new integrations, dependencies, model activation or production operations. Execute inline and autonomously, as requested.
Specification: [owner brief](REQUEST.md). Authoritative entry records: [Phase 8 acceptance](../phase-8/p8-05/FINAL_ACCEPTANCE.md), [preservation](../phase-8/PRESERVATION.md), [original preservation contracts](../phase-2/PRESERVATION_MATRIX.md), [original implementation plan](../IMPLEMENTATION_PLAN.md), [Phase 7 acceptance](../phase-7/p7-12/FINAL_ACCEPTANCE.md) and [release withholding](../phase-7/p7-12/RELEASE_STATUS.md). Historic evidence remains unchanged.
| Checkpoint | Files / responsibility | Required verification |
|---|---|---|
| P9-00 | `p9-00/INVENTORY.md`, `p9-00/inventory.json`, QA matrix, baseline evidence | Extract actual 33 route patterns, 57 preservation groups, roles, API owners, UI components, test files; fresh backend/frontend baseline, types/lint/build; source identities. |
| P9-01 | `p9-01/README.md` | Execute complete connected browser journeys with isolated synthetic data; distinguish native HTTP from intercepted fixtures. |
| P9-02 | `p9-02/README.md`, screenshots | Route/theme/locale/viewport coverage; actual visual inspection recorded separately from DOM assertions. |
| P9-03 | `p9-03/README.md`, axe triage, human checklist | Account for all 64 inherited incomplete nodes; deduplicate causes, preserve manual obligations; EN/NB evidence. |
| P9-04 | `p9-04/README.md` | Provider/migration/concurrency/security tests; inspect local database runtime availability without touching live services. |
| P9-05 | `p9-05/README.md`, document/performance evidence | Native PDF pagination and visual checks, failure/large-data fixtures, bounded sustained local observations. |
| P9-06 | `p9-06/README.md`, defect register | Reproduce any defect before minimal shared-owner repair; red/green focused proof, all affected callers and full regression. |
| P9-07 | `p9-07/FINAL_ACCEPTANCE.md`, preservation, risk and handoff records | Reconcile every requested deliverable, exact results and limitations; independent decisions. |
Each validated checkpoint is committed and normally pushed, then direct remote equality is checked. No force push or main merge. A blocked runtime or human check remains NOT TESTED/PARTIAL and carries an owner, closure evidence and release impact.
## Review focus
Account switching and foreign IDs must not expose/write another owner's resources. Stale preference/CV/document saves must retain recoverable drafts and reject silent overwrites. Submitted binaries must remain frozen when canonical Career Profile data changes. Empty/dense/long translated UI must remain operable across widths. Provider, assistive technology and native output claims require their actual environments.
Use [TODO.md](TODO.md) for live checkpoint status. Raw transient artifacts live in `.artifacts/phase9/`; compact portable evidence belongs beside the checkpoint. An automated pass never substitutes for physical-device, human linguistic, screen-reader or production acceptance.
+651
View File
@@ -0,0 +1,651 @@
# Jobjakt — Phase 9: Comprehensive Application QA and Regression Qualification
## Mission
Complete Phase 9 of the Jobjakt redesign.
Perform a comprehensive, evidence-based quality-assurance assessment of the entire application following Phases 1–8.
Identify and resolve confirmed in-scope regressions, validate existing functionality, test user journeys, assess accessibility and responsiveness, and produce a defensible acceptance decision.
This phase is not a new redesign.
The priorities are:
1. Functional correctness and data integrity.
2. Ease of use and workflow consistency.
3. Accessibility and responsive behaviour.
4. Security and user/tenant isolation.
5. CV/document/PDF reliability.
6. English and Norwegian Bokmål quality.
7. Performance and stability.
8. Release readiness and transparent risk reporting.
Work autonomously through bounded checkpoints, testing, documentation, commits and remote pushes.
Do not begin Phase 10 or new integration features.
Do not deploy production.
## 1. Confirmed Phase 8 baseline
Phase 8 has completed its implemented scope.
- Final branch: `feature/phase8-dashboard-customisation`
- Final commit: `1c24e406f194f0f42277d837b3008a7a28dca26a`
- Phase 8: CONDITIONAL GO.
- Phase 9 readiness: CONDITIONAL GO.
- Production: NO-GO.
- Development remote matched HEAD.
- Working tree was clean.
Reported passing checks:
- Backend: 1,084.
- Frontend: 917.
- Complete browser suite: 360.
- Separate browser contracts: 23.
- AI sidecar: 56.
- Sizing/performance diagnostics: 3.
Accepted runs had zero failures or skips.
All 33 routes remain present.
All 57 functionality-preservation groups were reconciled, but their statuses were 56 PARTIAL and C11 DEFERRED.
Existing risk items include:
- 64 incomplete axe accessibility findings requiring triage/manual assessment.
- Outstanding real-device and manual accessibility checks.
- Database-provider runtime verification, particularly MariaDB.
- Unprofiled sustained performance.
- Pre-existing duplicate reminder read.
- Outstanding live advisories.
- Previously deferred P5-13 AI qualification.
- Existing production release blockers.
Read:
`docs/redesign/phase-8/p8-05/FINAL_ACCEPTANCE.md`
Read the Phase 9 handoff and the preceding redesign's authoritative preservation and acceptance records.
Do not treat unresolved requirements as passed.
## 2. Git and execution boundaries
Verify the latest accepted Phase 8 commit and remote state.
Create:
`feature/phase9-full-qa`
Base this branch on the accepted Phase 8 development HEAD.
Do not branch from the older production main if main does not contain the redesign.
Preserve existing working-tree changes and branch history.
Commit and push validated checkpoints to the Phase 9 feature branch.
Verify every remote push.
Do not force-push.
Do not merge to main.
Do not deploy production.
## 3. Establish the QA inventory
Before testing, construct a complete inventory from the actual application.
Include:
- All 33 routes.
- All 57 functionality-preservation groups.
- Existing user roles.
- All major APIs.
- Backend/database workflows.
- Frontend page components.
- Shared design-system components.
- AI sidecar contracts.
- CV/document rendering.
- Dashboard preferences.
- Authentication and authorisation.
- Admin-only functionality.
Identify the existing automated coverage associated with each major workflow.
Create a QA matrix connecting:
Route → Workflow → Feature → Test evidence → Known risks → Acceptance status.
Do not invent coverage where no tests exist.
## 4. End-to-end user journey testing
Test the application as a real job seeker would use it.
Cover:
### Authentication and account management
Registration, verification, login, logout, password recovery, session management, account security and error handling.
### Onboarding
New-user flows, incomplete onboarding, resuming onboarding, localisation and navigation.
### Dashboard
Statistics, widget visibility, ordering, sizing, persistence, conflicts, reset and responsive layouts.
### Jobs
Job creation, editing, statuses, table, Kanban, searching, filtering, sorting, timelines, reminders and deletion where applicable.
### Job Detail
Navigation, associated documents, history, actions and data preservation.
### Career Profile
Canonical data editing, profile sections, validation, saving, recovery and relationships to CVs.
### CV Builder
Templates, editing, section ordering, content overrides, revisions, preview, exports and document fidelity.
### Cover letters and documents
Creation, editing, version handling, association with applications and safe persistence.
### Analytics
Data correctness, calculations, filters, empty states and dashboard relationships.
### Notifications
Read/unread state, duplicate handling, reminders, failure recovery and preferences.
### Settings
Profile, account, security, localisation, themes, preferences and other supported sections.
### Admin
Permissions, statistics, workflows, isolation and user management.
Test complete connected workflows, not just individual pages.
Preserve submitted/frozen document state and canonical Career Profile boundaries.
## 5. Visual and responsive QA
Inspect every significant route and user workflow across:
- Desktop.
- Tablet.
- Mobile.
- English.
- Norwegian Bokmål.
- Light theme.
- Dark theme.
Check:
- Consistent design system.
- Responsive layout.
- Sidebar and navigation.
- Dialogs and drawers.
- Tables and cards.
- Forms and validation.
- Chart readability.
- Touch interactions.
- Typography and spacing.
- Overflow and clipping.
- Loading states.
- Empty states.
- Error states.
- Long text and translations.
- Realistic dense datasets.
Use reproducible browser screenshots and DOM/accessibility evidence where useful.
Compare against established redesign decisions.
Fix confirmed in-scope regressions without introducing another full redesign.
Do not mark a route visually tested unless it was actually inspected.
## 6. Accessibility qualification
Investigate Phase 8's 64 incomplete axe findings.
These are not necessarily violations.
Deduplicate findings by underlying cause and affected component.
Classify them into:
- Confirmed accessibility defect.
- Requires manual inspection.
- Tool limitation.
- Not applicable, with evidence.
- Resolved.
Test:
- Keyboard-only navigation.
- Logical focus order.
- Visible focus.
- Dialog focus handling.
- Accessible names.
- Semantic structure.
- Screen-reader announcements.
- Dynamic status changes.
- Reordering controls.
- Drag-and-drop alternatives.
- Reduced motion.
- Zoom and text resizing.
- Colour contrast.
- Mobile touch targets.
Run automated checks across representative routes.
Perform genuine manual checks when the available testing environment supports them.
Do not claim NVDA, VoiceOver, physical-device or human accessibility testing passed unless those checks actually occurred.
Create a precise manual testing checklist for any checks requiring the product owner or another human tester.
Carry uncompleted checks into the release gates.
## 7. English and Norwegian Bokmål
Review every significant workflow.
Look for:
- Missing translation keys.
- English strings appearing in Norwegian mode.
- Inconsistent terminology.
- Literal or unnatural translations.
- Incorrect date/number formatting.
- Layout problems caused by longer text.
- Inconsistent validation messages.
- Missing accessibility labels.
Prefer natural professional Bokmål.
Preserve localisation architecture.
Do not silently replace established terminology without a clear reason.
## 8. Database and persistence qualification
Investigate supported database providers and configurations.
Include:
- EF Core migrations.
- SQLite development behaviour.
- MariaDB deployment compatibility.
- Database schema expectations.
- Relationships and constraints.
- Concurrent updates.
- Stale writes.
- Transaction handling.
- Preference persistence.
- Career Profile consistency.
- CV revision safety.
Use isolated test databases and synthetic data.
Where possible, run actual MariaDB integration testing in an approved non-production environment.
Do not claim MariaDB runtime acceptance from SQLite-only tests.
Do not modify the live production database.
Document any limitations where the provider cannot be tested safely.
## 9. Security and privacy
Verify:
- User and tenant isolation.
- API authorisation.
- Admin permissions.
- Session handling.
- Upload validation.
- Document ownership.
- Sensitive-data exposure.
- Error message leakage.
- AI endpoint access controls.
- URL import protections.
- Relevant rate limits.
- Data retention and deletion behaviour.
- Safe handling of untrusted documents and external content.
Run applicable existing security tests and static checks.
Do not expand into an uncontrolled security rewrite.
Record discovered high-risk issues and address those within the authorised QA scope.
Do not hide security failures or weaken assertions.
## 10. CV and PDF qualification
Test real output fidelity using synthetic CV data.
Cover:
- One-page CVs.
- Multi-page CVs.
- Long employment histories.
- Long bullet lists.
- Missing optional sections.
- Different templates.
- English and Norwegian.
- Long words and wrapping.
- Special characters.
- Page breaks.
- Header/footer behaviour.
- Margins.
- Fonts.
- Preview/export agreement.
- Version preservation.
Verify document pagination visually and programmatically where appropriate.
Do not infer PDF fidelity from frontend component tests alone.
Record renderer and environment differences.
## 11. Large-data and edge-case testing
Create realistic synthetic scenarios involving:
- No applications.
- Large numbers of applications.
- Long application timelines.
- Many CV revisions.
- Complex Career Profile histories.
- Missing or partial fields.
- Long job descriptions.
- Large filtering and sorting datasets.
- Many notifications.
- Slow APIs.
- Network interruption.
- Failed saves.
- Expired sessions.
- Concurrent edits.
- Missing or stale external references.
Verify that workflows remain usable and that data is not lost.
Do not load destructive or excessive test data into production.
## 12. Performance and stability
Go beyond small sizing diagnostics.
Assess representative workloads for:
- Page loading.
- Dashboard rendering.
- Job Table/Kanban performance.
- Filtering and search.
- Large Career Profiles.
- CV editing and preview.
- PDF generation.
- Preference saving.
- Backend database requests.
- AI sidecar interactions.
Investigate sustained performance under controlled, bounded load.
Measure actual resource usage and latency where possible.
Use isolated or approved test environments.
Do not benchmark destructively against live services.
Clearly distinguish measured performance from estimates.
Document resource constraints and untested production-scale behaviour.
## 13. Known issues and deferred requirements
Investigate the duplicate reminder read and other pre-existing advisories.
Revisit:
- Phase 7 conditional acceptance.
- Phase 8 conditional acceptance.
- 56 PARTIAL preservation statuses.
- C11 DEFERRED.
- Accessibility incompletes.
- Database-provider coverage gaps.
- Sustained performance qualification.
- P5-13 withholding.
- Existing production blockers.
For every item, determine:
- Current status.
- Reproducibility.
- User impact.
- Severity.
- Owner/next action.
- Whether it blocks Phase 9 acceptance.
- Whether it blocks production.
- Required evidence for closure.
Do not automatically reinterpret PARTIAL as PASS or DEFERRED as completed.
Record why each item is legitimately accepted, deferred or still blocked.
Do not change historic acceptance evidence retroactively.
## 14. Remediation policy
Phase 9 may fix confirmed regressions and defects discovered during QA.
Keep fixes:
- Bounded.
- Tested.
- Relevant to Phase 9.
- Compatible with existing architecture.
- Documented.
- Independently reviewable.
For major architectural changes or new product features, create a separate issue and explain the dependency.
Do not begin Phase 10 legacy cleanup.
Do not introduce LinkedIn, FINN, NAV or new AI model features.
Do not activate P5-13.
## 15. Suggested checkpoints
Use existing authoritative Phase 9 checkpoint definitions where available; otherwise:
### P9-00 — QA baseline and coverage matrix
Establish the current test baseline, route/feature coverage, risks and acceptance criteria.
### P9-01 — End-to-end functional QA
Test full user journeys, account ownership, persistence and application workflows.
### P9-02 — Responsive and visual QA
Inspect routes, themes, languages, mobile/tablet layouts and complex states.
### P9-03 — Accessibility and localisation
Triage incomplete findings, resolve confirmed issues and prepare human testing evidence.
### P9-04 — Data integrity, database and security
Validate providers, concurrency, user isolation, uploads, document ownership and security contracts.
### P9-05 — CV/PDF, edge cases and performance
Verify document fidelity, large datasets, failure recovery and bounded performance.
### P9-06 — Defect remediation and full regression
Resolve approved in-scope defects and run the complete relevant suites.
### P9-07 — Final acceptance and Phase 10 handoff
Consolidate evidence, remaining blockers, updated preservation statuses and recommended cleanup scope.
At each validated checkpoint:
1. Implement necessary QA tests and in-scope fixes.
2. Execute verification.
3. Record exact results.
4. Commit the checkpoint.
5. Push to the Phase 9 branch.
6. Verify remote synchronisation.
7. Continue autonomously.
If an unsafe or unapproved issue blocks a checkpoint, document it and continue independent safe work where possible.
## 16. Production restrictions
The current production environment remains NO-GO.
Previously reported blockers include:
- EXT4 filesystem errors on Docker storage.
- Missing independently verified off-disk backup at the last assessment.
- Restore and rollback qualification.
- Production ingress security.
- Database-provider/runtime validation.
- Manual accessibility requirements.
- Outstanding release advisories.
- AI model integrity and qualification.
Do not assume these issues have been resolved.
Do not:
- Merge into main.
- Deploy Jobjakt.
- Restart live Docker services.
- Modify production secrets.
- Run production migrations.
- Repair the production filesystem.
- Perform live data deletion.
- Activate Qwen3.5 or replace Qwen2.5.
- Change production AI inference configuration.
Safe local QA and isolated integration testing may continue.
Production-readiness investigation can be documented but does not authorise production remediation.
## 17. Documentation and evidence
Use established repository conventions.
Suggested location:
`docs/redesign/phase-9/`
Deliver:
- QA coverage matrix.
- Route and workflow verification.
- Visual/responsive evidence.
- Accessibility findings and manual checklist.
- Localisation results.
- Database/provider validation.
- Security findings.
- CV/PDF fidelity evidence.
- Performance results.
- Defect register.
- Updated preservation matrix.
- Full regression results.
- Release risk register.
- Phase 10 cleanup eligibility list.
- Final acceptance report.
Suggested final report:
`docs/redesign/phase-9/p9-07/FINAL_ACCEPTANCE.md`
Maintain original evidence and stable issue IDs.
Separate PASS, FAIL, PARTIAL, DEFERRED and NOT TESTED.
## 18. Final acceptance
Provide independent decisions:
**Phase 9 QA:**
GO / CONDITIONAL GO / NO-GO.
**Phase 10 readiness:**
GO / CONDITIONAL GO / NO-GO.
**Production release:**
GO / NO-GO.
Do not claim production readiness solely because QA tests pass.
Do not claim a manual check passed without actual human/manual evidence.
Do not claim a database provider passed if it was not exercised.
Clearly distinguish development acceptance from production release approval.
## 19. Required final response
Report:
1. Completed QA checkpoints.
2. Routes and workflows tested.
3. Actual backend/frontend/browser/contract/sidecar results.
4. New regression tests.
5. Confirmed defects found and resolved.
6. Remaining defects and severity.
7. Accessibility outcomes and outstanding human checks.
8. Localisation findings.
9. Database-provider verification.
10. Security and tenant-isolation outcomes.
11. CV/PDF rendering results.
12. Performance results.
13. Preservation-group status changes.
14. C11 deferred status.
15. Phase 10 cleanup eligibility.
16. Final branch and commit.
17. Remote push verification.
18. Phase 9 decision.
19. Phase 10 readiness decision.
20. Production decision.
## 20. Final execution instruction
Begin Phase 9 from the accepted Phase 8 development baseline:
`1c24e406f194f0f42277d837b3008a7a28dca26a`
Create:
`feature/phase9-full-qa`
Complete comprehensive application QA autonomously through bounded checkpoints.
Fix confirmed, authorised in-scope regressions.
Preserve all existing features and data contracts.
Maintain transparent unresolved-risk tracking.
Commit and push each validated checkpoint.
Prepare a complete Phase 10 handoff.
**Do not merge into main.**
**Do not deploy production.**
**Do not begin Phase 10 automatically.**
+41
View File
@@ -0,0 +1,41 @@
# Retained risk and release register
Stable RD IDs come from [Phase 7](../phase-7/DEBT.md); the [Phase 8 acceptance](../phase-8/p8-05/FINAL_ACCEPTANCE.md) is the entry qualification. Severity below describes potential impact if the gate is ignored, not a claim that an untested system is currently broken. None of the production conditions was rechecked live or repaired in Phase 9.
Phase 9 can complete an assessment while withholding acceptance. Open high data-integrity risks and required human/provider evidence must stay visible in the final decision. Phase 10 receives a bounded handoff, not deletion authority.
| ID | Current status / reproducibility | Severity / user impact | Owner, next action and evidence required for closure | Gate |
|---|---|---|---|---|
| RD01 / F04 | OPEN; local static/loopback ingress contracts only | High: wrong client identity or exposed ingress | Release operator: actual TLS/IPv6/firewall/topology/trusted peer and deployed auth evidence | Production |
| RD02 | NOT TESTED: independently verified off-disk complete backup/restore | Critical if recovery needed: irreversible loss | Release operator: isolated restore of DB/files/CVs/keys/tombstones, hashes and recovery rehearsal | Production |
| RD03 / F19 | PARTIAL: SQLite and generated MariaDB SQL; MariaDB runtime unavailable | High: schema/provider/startup disagreement | Database owner: actual approved MariaDB migration, restart, CRUD/constraints/concurrency and effective configuration proof | Production; provider acceptance |
| RD04 | NOT TESTED: intended Linux rollback | High: failed release cannot be reversed | Release operator: isolated failure/rollback rehearsal using complete prior images/configuration/recovery set | Production |
| RD05 | OPEN: old runner crashes/deployed identity not superseded | High: healthy endpoint may serve wrong release | Infrastructure owner: native core/operator diagnosis, successful protected CI, exact deployed SHA and authenticated smoke | Production |
| RD06 | PARTIAL: finite axe/DOM/keyboard evidence; human checks open | High accessibility impact | Accessibility tester: [M09-01–06](p9-03/MANUAL_CHECKLIST.md), contextual contrast/reader evidence; triage every applicable incomplete | Acceptance qualification; production |
| RD07 | NOT TESTED: physical input/AT/alternate browsers/forced colors | Medium/High usability exclusion | Product/accessibility owners: actual supported devices/browser/input versions and complete workflows | Acceptance qualification; production |
| RD08 / C11 / P5-13 | DEFERRED; no new model qualification or activation | High: unqualified proposal semantics | Separate AI qualification owner: production-equivalent identity/inference, original 366-call protocol, independent human semantics, review UI/integration evidence | AI activation; production |
| RD09 | Local withheld-operation contract retained; deployed withholding NOT TESTED | High: unreviewed AI write/external request | Release/AI owners: keep 503/no-provider/no-write guards, verify actual deployment independently | Production / AI |
| RD10 | PARTIAL: native local PDF corpus and visual sheets; deployed fonts/photo/print absent | Medium/High document reliability | Document owner: intended Linux/fonts/photo/crop/print and alternate-browser proof, original bytes/geometry | Acceptance qualification; production |
| RD11 | Scoped SQLite bootstrap/WAL mechanism repaired before entry; broad reliability remains PARTIAL | High if preference save fails | Database owner: retain held-reader/write proof, distinguish old reproduced mechanism from unproven provider/contention cases | Reliability qualification |
| RD12 | PARTIAL: notification draft/failure recovery and SQLite tests; complete contention/provider behavior unqualified | Medium: settings may not persist | Database/settings owners: intended-provider overlapping writes and failure/reload recovery with no data loss | Reliability qualification |
| RD13 | Historical Rules 500 mechanism remains UNCONFIRMED | Medium: failed save/draft retention | Rules/API owners: original failure trace plus controlled causal reproduction and successor regression; passing retry alone insufficient | Reliability qualification |
| RD14 | Historical command/dialog focus incident remains UNCONFIRMED; settled drawer proof is a separate finite result | Medium/High keyboard access | Shared UI owner: preserve original observations, reproduce affected modal transitions and actual reader/trap/return behavior | Accessibility qualification |
| RD15 | Historical intermittent CV section expansion cause unproven | Medium: editing disrupted | CV owner: retain failed observation and reproduce causally before closing; do not weaken expansion assertions | Reliability qualification |
| RD16 | Scoped company-error repair retained; wider reader/dialog/date contract PARTIAL | Medium: recovery/access | Company/UI owners: native failed-save → retained draft → successful retry plus human dialogue checks | Preservation qualification |
| RD17 | Board remains O(N); 200/1,000-job and new bounded 250-job observations are finite | Medium: growing rendering cost | Jobs owner: agreed budget, bounded sustained profile and CPU/frame attribution before optimization; preserve full membership | Performance qualification |
| RD18 | NOT TESTED: physical drag/drop/cancel/browser variants | Medium access/workflow risk | Input/device tester: real Board/CV selection and named alternatives, no hidden result cap | Human/device qualification |
| RD19 | DEFERRED: reviewed `followMode` consumer | Medium workflow limitation | Product/mail owner: separate explicit mode→review/action/fallback design; no auto-send or uncertain resend | Deferred scope; not silently completed |
| RD20 | Optional P5-05 quick preview DEFERRED; Phase 8 Dashboard scope was delivered separately | Low optional scope | Product owner: explicit separate brief; retain existing full workspace and all routes | Deferred scope |
| RD21 | OPEN: canonical Career/generic job revision contract and creation-intent idempotency | High: stale editor can overwrite acknowledged edits | Domain/API/UI owners: separate bounded contract issue covering both callers, server compare-and-swap/transaction semantics, conflict recovery and backward compatibility; characterization is not safety acceptance | Data-integrity acceptance; production |
| RD22 / F20 | NOT TESTED: enabled-worker outage recovery/durability | High: duplicate/lost async work | Worker owner: isolated enabled-producer failure/restart/recovery, no-loss/no-duplicate proof before activation | Production / enabled producer |
| RD23 / F21 | OPEN: actual calendar offset/DST/date-only semantics | Medium: wrong event time | Calendar owner: dedicated boundary/DST/provider proof in authorised sandbox before semantic changes | Calendar qualification |
| RD24 | NOT TESTED: billing/deletion/retention/provider cleanup policy and configuration | High privacy/lifecycle impact | Product/security/operator owners: approved policy, explicit destructive-action authority, isolated recovery/cleanup proof | Production / lifecycle activation |
| RD25 | PARTIAL: local SMTP/HTTP/provider contracts; actual OAuth/Turnstile/mail/calendar/model unavailable | High identity/privacy/delivery impact | Approved provider/human tester: sandbox consent/revoke/reconnect/origin/state/delivery/uncertain-attempt proof | Provider acceptance; production |
| RD26 | Legacy Job/Application cutover OPEN | High compatibility/data loss if removed | Migration owner: expand/verify/contract, restore/rollback and all readers/writers/aliases before removal | Phase 10 deletion eligibility; production |
| RD27 | NOT TESTED: actual monitoring/alert/recovery coverage | High operational detection risk | Operations owner: effective sink, alert trigger, responder/runbook and recovery observations | Production |
| RD28 | Ongoing evidence/provenance obligation | High if failures are misrepresented | QA owner: exact source hashes/counts, original failures, no retries/skips/assertion relaxation; separate characterization from safe behavior | Every decision |
| P9-OPS-01 | Previously reported EXT4/Docker storage errors UNRECHECKED | Critical if disk faults persist | Production operator only: independent storage-health/repair and recovery qualification under separate authority | Production |
| P9-SEC-01 | Live advisories NOT REFRESHED; inherited NuGet Pkcs high/moderate and expiring dev exception retained | High dependency risk until assessed | Dependency owner: authorised live advisory refresh, actual locked versions/paths and exception expiry review; offline policy tests do not clear advisories | Production |
| P9-PUB-01 | Feature publication initially blocked by Git server HTTP 502 | Medium review/recoverability risk | Git service owner / QA: successful normal push and direct ref equality for each published checkpoint; never force push | Publication / handoff completeness |
The pre-existing duplicate initial reminder read is tracked as P9-PERF-01 in [DEFECTS.md](p9-06/DEFECTS.md). No shared loader/query framework was introduced without measured benefit and consumer proof. The new admin vendor-locale repair closes only P9-L01 after its integrated successor; it does not certify every third-party or provider string.
+12
View File
@@ -0,0 +1,12 @@
# Phase 9 TODO
- [ ] P9-00 — Inventory, matrix, fresh baseline and source identity.
- [ ] P9-01 — Connected functional journeys.
- [ ] P9-02 — Responsive / visual qualification.
- [ ] P9-03 — Accessibility / localisation and human checklist.
- [ ] P9-04 — Data, provider and security qualification.
- [ ] P9-05 — Native documents, edge cases and sustained performance.
- [ ] P9-06 — Confirmed defect remediation and complete regression.
- [ ] P9-07 — Acceptance, preservation reconciliation, risks and Phase 10 handoff.
No Phase 10 implementation or production operation is authorised.
+149
View File
@@ -0,0 +1,149 @@
"""Summarize completed raw QA artifacts; missing lanes stay missing."""
import hashlib
import base64
import json
from pathlib import Path
import xml.etree.ElementTree as ET
from datetime import datetime, timezone
ROOT = Path(__file__).resolve().parents[3]
HERE = Path(__file__).resolve().parent
RAW = ROOT / '.artifacts/phase9'
def digest(path):
return hashlib.sha256(path.read_bytes()).hexdigest()
def browser_cases(suites):
rows = []
for suite in suites:
rows.extend(browser_cases(suite.get('suites', [])))
for spec in suite.get('specs', []):
for test in spec.get('tests', []):
rows.append(dict(id=spec.get('id'), project=test.get('projectName'), file=spec.get('file'), title=spec['title'], status=test['status'],
results=[dict(status=r['status'], retry=r.get('retry', 0), durationMs=r.get('duration', 0),
errors=r.get('errors', []), attachments=r.get('attachments', [])) for r in test.get('results', [])]))
return rows
def attached_json(attachment):
body = base64.b64decode(attachment['body']) if 'body' in attachment else Path(attachment['path']).read_bytes()
return json.loads(body)
def write_json(path, value):
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(value, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
assert browser_cases([{'specs': [{'title': 'self-check', 'tests': [{'status': 'expected', 'results': [{'status': 'passed'}]}]}]}])[0]['results'][0]['status'] == 'passed'
if __name__ == '__main__':
report = dict(observedUtc=datetime.now(timezone.utc).isoformat(), lanes={}, rawFiles={})
manifest_path = HERE / 'p9-00/source-manifest.json'
manifest = json.loads(manifest_path.read_text(encoding='utf-8'))
changed = [name for name, expected in manifest.items() if not (ROOT / name).is_file() or digest(ROOT / name) != expected]
assert not changed, changed
report['sourceIdentity'] = dict(inputs=len(manifest), differences=changed, manifestSha256=digest(manifest_path),
qualification='Selected product/test, diagnostic, Release assembly and static-export bytes equal the frozen manifest. Documentation is outside this selected-source identity.')
report['documentOracle'] = dict(path='scripts/verify-cv-fidelity.py', sha256=digest(ROOT / 'scripts/verify-cv-fidelity.py'), qualification='Original unchanged oracle; native rendering and admission counts are separate.')
report['supplementalSources'] = {str(path.relative_to(ROOT)): digest(path) for path in sorted((HERE / 'p9-05/volume').glob('*.ts'))}
discovered = json.loads((RAW / 'discovered.json').read_text(encoding='utf-8-sig'))
discovered_cases = browser_cases(discovered['suites'])
discovered_ids = {(case['id'], case['project']) for case in discovered_cases}
assert not discovered.get('errors') and len(discovered_cases) == len(discovered_ids) == 362
report['discovery'] = dict(cases=362, errors=discovered.get('errors', []), source='.artifacts/phase9/discovered.json',
qualification='List-only inventory; no tests executed. Its not-run statuses are not regression skip results.')
write_json(HERE / 'p9-00/discovered-cases.json', [{key: case[key] for key in ['id', 'project', 'file', 'title']} for case in discovered_cases])
sources = dict(ordinary=[f'ordinary-shard-{number}' for number in range(1, 5)], ai='ai', auth='auth', rate='rate', ingress='ingress', pdf='pdf', preferences='preferences', phase9='phase9-frozen', volume='volume-qualified')
for lane, source in sources.items():
files = [RAW / f'{name}.json' for name in (source if isinstance(source, list) else [source])]
if not all(file.exists() for file in files):
continue
datasets = [json.loads(file.read_text(encoding='utf-8-sig')) for file in files]
cases = [case for data in datasets for case in browser_cases(data['suites'])]
stats = dict(startTime=min(data['stats']['startTime'] for data in datasets),
**{key: sum(data['stats'][key] for data in datasets) for key in ['duration', 'expected', 'skipped', 'unexpected', 'flaky']})
if lane == 'ordinary':
assert len({(case['id'], case['project']) for case in cases}) == len(cases), 'Duplicate cases across native shards'
assert {(case['id'], case['project']) for case in cases} == discovered_ids, 'Shard union differs from full native discovery'
report['lanes'][lane] = dict(stats=stats, cases=len(cases),
retries=sum(max(len(c['results']) - 1, 0) for c in cases),
statuses={status: sum(c['status'] == status for c in cases) for status in ['expected', 'unexpected', 'flaky', 'skipped']},
fileFailures=[error for data in datasets for error in data.get('errors', [])],
sourceReports=[dict(file=str(file.relative_to(ROOT)), stats=data['stats']) for file, data in zip(files, datasets)])
if lane == 'ordinary':
report['lanes'][lane]['membershipMatchesDiscovery'] = True
folder = HERE / ('p9-01' if lane == 'ordinary' else 'p9-05' if lane in ['phase9', 'volume'] else 'p9-06')
folder.mkdir(parents=True, exist_ok=True)
if lane == 'volume':
observations = [dict(name=attachment['name'], observation=attached_json(attachment)) for case in cases for result in case['results'] for attachment in result['attachments'] if attachment['name'].startswith('phase9-volume-')]
write_json(HERE / 'p9-05/volume-results.json', observations)
if lane == 'phase9':
matrix, axe, screenshots = [], [], []
for case in cases:
for attachment in case['results'][0]['attachments']:
name = attachment['name']
if name == 'phase9-route-matrix':
sample = attached_json(attachment)
for row in sample['samples']:
row.pop('bodyText', None)
matrix.append(row)
elif name == 'phase9-settled-axe':
axe.append(attached_json(attachment))
elif name == 'phase9-rd21-characterization':
write_json(HERE / 'p9-04/rd21.json', attached_json(attachment))
elif name == 'phase9-sustained-performance':
write_json(HERE / 'p9-05/performance.json', attached_json(attachment))
if attachment['contentType'] == 'image/png':
path = Path(attachment['path'])
screenshots.append(dict(case=case['title'], name=name, path=str(path.relative_to(ROOT)), sha256=digest(path)))
assert len(matrix) == 396
write_json(HERE / 'p9-02/route-results.json', matrix)
write_json(HERE / 'p9-02/screenshots.json', screenshots)
write_json(HERE / 'p9-03/settled-axe.json', axe)
if lane == 'ordinary':
for case in cases:
for attachment in case['results'][0]['attachments']:
if attachment['name'].startswith('route-census-') and attachment['contentType'] == 'application/json':
write_json(HERE / 'p9-01' / (attachment['name'] + '.json'), attached_json(attachment))
elif attachment['name'] == 'actual-browser-zoom-observations':
observation = attached_json(attachment)
first = observation['records'][0]
assert first['language'] in ['en', 'nb'] and first['mode'] in ['light', 'dark']
write_json(HERE / 'p9-03' / f"zoom-{first['language']}-{first['mode']}.json", observation)
for case in cases:
for result in case['results']:
for attachment in result['attachments']:
if 'body' in attachment:
body = base64.b64decode(attachment.pop('body'))
attachment.update(bytes=len(body), sha256=hashlib.sha256(body).hexdigest())
(folder / f'{lane}-cases.json').write_text(json.dumps(cases, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
frontend = RAW / 'frontend.json'
if frontend.exists():
data = json.loads(frontend.read_text(encoding='utf-8-sig'))
report['lanes']['frontend'] = {k: data.get(k) for k in ['success', 'numPassedTestSuites', 'numFailedTestSuites', 'numPassedTests', 'numFailedTests', 'numPendingTests', 'numTodoTests', 'startTime']}
backend = RAW / 'backend/phase9.trx'
if backend.exists():
doc = ET.parse(backend)
report['lanes']['backend'] = doc.find('.//{*}Counters').attrib
cases = [dict(name=e.get('testName'), outcome=e.get('outcome'), duration=e.get('duration')) for e in doc.findall('.//{*}UnitTestResult')]
(HERE / 'p9-00/backend-cases.json').write_text(json.dumps(cases, indent=2) + '\n', encoding='utf-8')
sidecar = RAW / 'sidecar.xml'
if sidecar.exists():
report['lanes']['sidecar'] = ET.parse(sidecar).find('.//testsuite').attrib
report['failedOrSupersededAttempts'] = {}
for lane in ['phase9', 'phase9-successor', 'phase9-final', 'phase9-qualified', 'phase9-accepted', 'ordinary', 'ordinary-final', 'ordinary-accepted', 'ordinary-complete', 'volume', 'landing-red', 'landing-green', 'landing-qualified']:
file = RAW / f'{lane}.json'
if file.exists():
data = json.loads(file.read_text(encoding='utf-8-sig'))
report['failedOrSupersededAttempts'][lane] = data.get('stats')
for file in sorted(RAW.glob('*-exit.json')):
report['lanes'][file.stem.replace('-exit', '') + 'Process'] = json.loads(file.read_text(encoding='utf-8-sig'))
for file in sorted(RAW.rglob('*')):
if file.is_file() and file.suffix in ['.json', '.xml', '.trx', '.log'] and 'results' not in file.parts:
report['rawFiles'][str(file.relative_to(ROOT))] = dict(bytes=file.stat().st_size, sha256=digest(file))
(HERE / 'validation.json').write_text(json.dumps(report, indent=2, ensure_ascii=False) + '\n', encoding='utf-8')
print(json.dumps(report['lanes'], indent=2))
+22
View File
@@ -0,0 +1,22 @@
# P9-00 — Entry baseline and coverage inventory
Development baseline and direct remote: `1c24e406f194f0f42277d837b3008a7a28dca26a` on `feature/phase8-dashboard-customisation`, clean before work. New branch is `feature/phase9-full-qa`. Main remains the older release branch and is not the redesign base. Feature pushes are authorised; `.gitea/workflows/ci-deploy.yml` restricts deployment to a main push.
The reproducible [source inventory](INVENTORY.md) and [full JSON](inventory.json) enumerate **33 concrete routes**, **57 preservation groups**, actual page/shared component owners, **43 API controller/partial owners**, migration/data owners, the Admin/Premium entitlement roles and existing test files: backend 117, frontend 104, ordinary browser 58, sidecar 2. These are file counts and associations, not exhaustive behavioral coverage. Public/anonymous, roleless authenticated and administrator actors remain distinct; arbitrary stored roles are not inferred to confer grants.
The exact group-level entry disposition is **56 PARTIAL / PRES-C11 DEFERRED**. Original contract/test/gap columns are retained in JSON and link back to the authoritative matrix. The current Documents route and context-preserving correspondence alias supersede older route descriptions; historic records are not edited.
## Fresh entry observations
| Lane | Actual entry evidence | Qualification |
|---|---|---|
| Backend | 1,084 passed; 0 failed/skipped, Release, pinned SDK 9.0.317 | `.artifacts/phase9/backend/phase9.trx`; SQLite/test-host evidence, not MariaDB runtime. |
| Frontend assertions | Report records 917 passed /104 suites, 0 failed/pending | Original wrapper was interrupted; its report is retained as `frontend-entry-reported.json`. A clean completed successor process is required for final acceptance. |
| Types / lint / build | PASS; static frontend export uses `http://localhost:5302/api` | Rebuilt again after the bounded locale repair; no deployment. |
| Sidecar | Initial 55 pass /1 fail; full corrected fixture successor 56/56 | Entry failure and red/green proof retained; see P9-T01. No model loading/inference acceptance. |
| Ordinary browser | Interrupted after 36 completed cases | Not a complete accepted run. Complete successor evidence required; final protocol uses four native serial shards with exact full-discovery membership, zero skips/retries and four successful exits. |
| Provider availability | Docker Linux engine pipe missing; no `mariadbd`/`mysqld` runtime found | MariaDB runtime NOT TESTED. Do not substitute generated SQL or SQLite results. |
Commands are the existing pinned `.dotnet/dotnet.exe test ... --configuration Release --no-restore`, Jest `--runInBand --json`, `npm run typecheck`, `npm run lint`, `npm run build`, offline pytest with `SKIP_MODEL_LOAD=1`, and native Playwright with static/prebuilt export, isolated synthetic data root, `--retries=0`. Raw logs and result files remain under `.artifacts/phase9/`. The final portable [validation record](../validation.json) supersedes provisional run counts without erasing failed attempts.
Inventory assertions require exact 33/57 membership and one deferred group. Product verification and final acceptance are separate checkpoints; P9-00 does not clear inherited manual/provider/output/release gates.
+117
View File
@@ -0,0 +1,117 @@
# P9-00 source inventory
Generated by `inventory.py`; associations below are existing candidate coverage, not executed Phase 9 passes.
## Route → workflow → feature → test evidence → risk → acceptance
| Route | Actual element owners | Preservation contracts / existing test evidence | Known risk | Phase 9 |
|---|---|---|---|---|
| `/` | `Navigate`, `LandingPage` | PRES-E01, PRES-J04; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/dashboard` | `DashboardView` | PRES-S01, PRES-S02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/analytics` | `AnalyticsPage` | Shared shell / nearest parent contracts; direct route evidence required; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/discover` | `JobDiscoveryPage` | PRES-J01, PRES-J02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/jobs` | `JobTable` | PRES-J05, PRES-J06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/jobs/:id` | `ApplicationWorkspacePage` | PRES-W01, PRES-W02, PRES-W03; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/reminders` | `RemindersView` | PRES-W11; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/operations` | `OperationsPage` | PRES-W12; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/kanban` | `LegacyBoardRedirect` | PRES-J07; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/companies` | `CompaniesTable` | PRES-J08; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/offers` | `OfferComparisonPage` | PRES-J09; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/correspondence` | `CorrespondenceInboxPage` | PRES-M03, PRES-M04, PRES-M05; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/correspondence/review` | `LegacyCorrespondenceReviewRedirect` | PRES-M05; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/profile` | `ProfilePage` | PRES-E04, PRES-E05, PRES-E06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/applications/:id` | `LegacyApplicationRedirect` | PRES-W01; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/career` | `CareerWorkspacePage` | PRES-C01, PRES-C02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/career/builder` | `CvBuilderPage` | PRES-C05; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/career/builder/:id` | `CvBuilderEditor` | PRES-C06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/documents` | `DocumentsPage` | Shared shell / nearest parent contracts; direct route evidence required; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/admin/audit` | `AdminAuditPage` | PRES-A02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/admin/users` | `AdminUsersPage` | PRES-A01; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/admin/system` | `AdminSystemPage` | PRES-A03; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/trash` | `JobTable` | PRES-J06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/settings` | `SettingsView` | PRES-J10, PRES-W11, PRES-S03, PRES-S04; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/settings/connected-accounts` | `ConnectedAccountsPage` | PRES-M06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/login` | `LoginPage` | PRES-E02, PRES-E03, PRES-E04; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/register` | `LoginPage` | PRES-E02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/forgot-password` | `ForgotPasswordPage` | PRES-E02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/reset-password` | `ResetPasswordPage` | PRES-E02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/verify-email` | `VerifyEmailPage` | PRES-E02; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/confirm-email-change` | `VerifyEmailPage` | PRES-E06; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/microsoft-legacy-relink` | `MicrosoftLegacyRelinkPage` | PRES-E03; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
| `/cv/:slug` | `PublicCvPage` | PRES-C12; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |
## Complete preservation ledger
Exact source/owner/test/gap columns for every group are retained in [inventory.json](inventory.json). The original matrix is authoritative for sub-capabilities.
| ID | Capability | Entry status | Phase 9 |
|---|---|---|---|
| PRES-E01 | **PRES-E01** — Public product/plans; honest unavailable billing | PARTIAL | NOT TESTED |
| PRES-E02 | **PRES-E02** — Local login/register/remember, challenge, reset and verification | PARTIAL | NOT TESTED |
| PRES-E03 | **PRES-E03** — Google/Microsoft login, link, legacy relink and popup results | PARTIAL | NOT TESTED |
| PRES-E04 | **PRES-E04** — 2FA challenge/recovery/setup/disable; trusted-device revocation | PARTIAL | NOT TESTED |
| PRES-E05 | **PRES-E05** — Session list/current device, revoke one/others, logout | PARTIAL | NOT TESTED |
| PRES-E06 | **PRES-E06** — Avatar, account names/headline, email change and password | PARTIAL | NOT TESTED |
| PRES-E07 | **PRES-E07** — Desktop collapse/mobile drawer, active nav and command search/actions | PARTIAL | NOT TESTED |
| PRES-E08 | **PRES-E08** — Theme/system, EN/NB hydration, toast/confirm/prompt and errors | PARTIAL | NOT TESTED |
| PRES-E09 | **PRES-E09** — Account-switch private-state disposal and stale request rejection | PARTIAL | NOT TESTED |
| PRES-J01 | **PRES-J01** — NAV discovery/filter/sort/source/deadline/details | PARTIAL | NOT TESTED |
| PRES-J02 | **PRES-J02** — Saved searches, run/delete/alerts, result changes/dismissal | PARTIAL | NOT TESTED |
| PRES-J03 | **PRES-J03** — Reviewed manual/URL/paste job create, company/tags/dates, duplicates | PARTIAL | NOT TESTED |
| PRES-J04 | **PRES-J04** — Extension/bookmarklet/share capture; post-create attachment/CV | PARTIAL | NOT TESTED |
| PRES-J05 | **PRES-J05** — Job filters/sort/page/columns, saved views and row/mobile actions | PARTIAL | NOT TESTED |
| PRES-J06 | **PRES-J06** — Bulk status/delete, soft delete/trash/restore and job edit | PARTIAL | NOT TESTED |
| PRES-J07 | **PRES-J07** — Kanban grouped statuses, pointer/keyboard move and precise menu | PARTIAL | NOT TESTED |
| PRES-J08 | **PRES-J08** — Company/contact edits, pipeline dates and linked-job history | PARTIAL | NOT TESTED |
| PRES-J09 | **PRES-J09** — Recorded offers/compensation/deadlines/notes and source links | PARTIAL | NOT TESTED |
| PRES-J10 | **PRES-J10** — CSV/JSON export, JSON import and CSV-to-JSON conversion | PARTIAL | NOT TESTED |
| PRES-W01 | **PRES-W01** — Full workspace, sections, legacy links and optional reusable overlay | PARTIAL | NOT TESTED |
| PRES-W02 | **PRES-W02** — Detail/status/progression, recruiter/dates/description/timeline | PARTIAL | NOT TESTED |
| PRES-W03 | **PRES-W03** — Analysis, match/gaps, strategy and reviewed status/workflow suggestions | PARTIAL | NOT TESTED |
| PRES-W04 | **PRES-W04** — Checklist create/edit/complete/delete/order and next action | PARTIAL | NOT TESTED |
| PRES-W05 | **PRES-W05** — Attach/select/create/tailor CV and source context | PARTIAL | NOT TESTED |
| PRES-W06 | **PRES-W06** — Cover-letter manual/AI review, versions/restore and dirty protection | PARTIAL | NOT TESTED |
| PRES-W07 | **PRES-W07** — Application drafts and immutable submitted package/archived binaries | PARTIAL | NOT TESTED |
| PRES-W08 | **PRES-W08** — Attachments upload/category/name/AI consent/preview/download/delete | PARTIAL | NOT TESTED |
| PRES-W09 | **PRES-W09** — Interview questions/answers/ready/manual removal/AI review | PARTIAL | NOT TESTED |
| PRES-W10 | **PRES-W10** — Debrief/follow-up draft/date/readiness | PARTIAL | NOT TESTED |
| PRES-W11 | **PRES-W11** — Reminder rules/actions/notifications, ICS and Google/Outlook events | PARTIAL | NOT TESTED |
| PRES-W12 | **PRES-W12** — Async progress/failure/retry/cancel/notifications | PARTIAL | NOT TESTED |
| PRES-C01 | **PRES-C01** — Canonical structured career data and long-tail/custom sections | PARTIAL | NOT TESTED |
| PRES-C02 | **PRES-C02** — Profile overview/completeness/import guidance/raw copy/history/restore | PARTIAL | NOT TESTED |
| PRES-C03 | **PRES-C03** — Upload/extract/rebuild/reprocess/diff/select/accept/discard/retry/cancel | PARTIAL | NOT TESTED |
| PRES-C04 | **PRES-C04** — Evidence bank source/category/tags/add/list/delete | PARTIAL | NOT TESTED |
| PRES-C05 | **PRES-C05** — CV library create/copy/delete/templates/share/publication/PDF | PARTIAL | NOT TESTED |
| PRES-C06 | **PRES-C06** — Studio tabs, preview debounce/pages/fit/save state/mobile panes | PARTIAL | NOT TESTED |
| PRES-C07 | **PRES-C07** — Visibility/order/custom sections and item/document overrides | PARTIAL | NOT TESTED |
| PRES-C08 | **PRES-C08** — Capability-aware templates/typography/color/header/skills/sidebar/photo | PARTIAL | NOT TESTED |
| PRES-C09 | **PRES-C09** — A4/Letter/density/margins/dates/document locale/section presentation | PARTIAL | NOT TESTED |
| PRES-C10 | **PRES-C10** — Undo/redo, save queue, dirty guard, history restore/preview lifecycle | PARTIAL | NOT TESTED |
| PRES-C11 | **PRES-C11** — Section and whole-document AI improve/translate/instruction/grammar review | DEFERRED | NOT TESTED |
| PRES-C12 | **PRES-C12** — Private PDF and published anonymous CV/PDF, long searchable pages | PARTIAL | NOT TESTED |
| PRES-M01 | **PRES-M01** — Job-scoped manual correspondence/search/delete/paste import | PARTIAL | NOT TESTED |
| PRES-M02 | **PRES-M02** — Gmail candidate/thread import/refresh/sync/unlink/relink/move | PARTIAL | NOT TESTED |
| PRES-M03 | **PRES-M03** — Global inbox filters/page/provider/link/direction/detail/source links | PARTIAL | NOT TESTED |
| PRES-M04 | **PRES-M04** — Compose/reply/provider/recipient/job; draft conflicts; confirm send/uncertainty | PARTIAL | NOT TESTED |
| PRES-M05 | **PRES-M05** — Review proposed jobs/link/reject/keep/notes/sync/create | PARTIAL | NOT TESTED |
| PRES-M06 | **PRES-M06** — Gmail/Graph/IMAP connect/status/disconnect separate from sign-in | PARTIAL | NOT TESTED |
| PRES-S01 | **PRES-S01** — Personal metrics/activity/funnel/company/skills/stage/salary/next actions | PARTIAL | NOT TESTED |
| PRES-S02 | **PRES-S02** — Owner-local five visibility preferences/onboarding dismiss/notifications | PARTIAL | NOT TESTED |
| PRES-S03 | **PRES-S03** — Rules/reminder/table/theme/language preferences and account links | PARTIAL | NOT TESTED |
| PRES-S04 | **PRES-S04** — AI privacy/usage/limits/Free-Pro/server entitlement/conditional billing | PARTIAL | NOT TESTED |
| PRES-S05 | **PRES-S05** — Account ZIP/encrypted backup/lifecycle/deletion confirmations | PARTIAL | NOT TESTED |
| PRES-A01 | **PRES-A01** — Admin user/create/roles/reset/delete/last-admin/self guards | PARTIAL | NOT TESTED |
| PRES-A02 | **PRES-A02** — Audit list/detail/supported undo/job restore | PARTIAL | NOT TESTED |
| PRES-A03 | **PRES-A03** — System/build/DB/AI/mail/SMTP/test/probe/benchmark/maintenance | PARTIAL | NOT TESTED |
## API and implementation census
43 controller/partial owners; 254 HTTP method attributes. Full base/suffix/authorization attributes are in JSON; this is source inventory, not runtime endpoint acceptance.
Existing test files: backend 117, frontend 104, browser 58, sidecar 2. File presence does not establish coverage of every branch.
Actors: anonymous/public, authenticated ordinary account, administrator, and plan entitlement variants. Actual role literals and authorization attributes are recorded in JSON. Test auth handlers, real local cookies and external identity providers require separate qualification.
Database workflows: canonical Career Profile and evidence/import, CV variants/revisions/overrides, frozen application packages, job lifecycle/soft delete, correspondence/draft versions, account preferences/session revocation, administrative restore. Migration and data-owner file lists are in JSON.
Shared UI: complete page/component lists in JSON; preserve current MUI/theme/i18n/router/confirm/prompt/resource owners. AI sidecar contracts are offline only unless actual model inference is explicitly exercised; P5-13 remains withheld.
@@ -0,0 +1,14 @@
{
"changed": [
"job-tracker-ui\\e2e\\phase7-admin-users.spec.ts"
],
"before": {
"job-tracker-ui\\e2e\\phase7-admin-users.spec.ts": "242418271363e218790bee5cfe2f8b2ebdf1b5e437601333bdf7162ca2e966d1"
},
"after": {
"job-tracker-ui\\e2e\\phase7-admin-users.spec.ts": "223455bb5db867053e340fce533ec024388f40413facb6041b8bce779d782e90"
},
"qualification": "Only the ordinary AdminUsers locale-sensitive test locator changed. Product/build/backend/Jest/18 diagnostics and separate volume sources are unchanged. All four final ordinary shards use the new manifest.",
"earlierManifestSha256": "a8292c5a5a37851a554623cf0be02cce156b33e05655828d77eda6dbda73f206",
"ordinaryManifestSha256": "42ee391a244939283e2ac2f7c962629385da4ffb0165e29a6b2f926c1c71d1b6"
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+100
View File
@@ -0,0 +1,100 @@
"""Reproducible source census; test-file associations are candidates, not passes."""
import json
import re
from pathlib import Path
import shutil
ROOT = Path(__file__).resolve().parents[4]
HERE = Path(__file__).resolve().parent
UI = ROOT / 'job-tracker-ui'
def relative(path):
return path.relative_to(ROOT).as_posix()
def collect():
app = (UI / 'src/App.tsx').read_text(encoding='utf-8')
routes = {}
for match in re.finditer(r'<Route\s+path="([^"]+)"', app):
route = match.group(1)
element_match = re.search(r'element=\{\s*<([A-Za-z][A-Za-z0-9]*)', app[match.end():match.end() + 1200])
element = element_match.group(1) if element_match else 'Inspect App.tsx route body'
if route == '*':
continue
routes.setdefault(route, []).append(element)
for route, element in re.findall(r'\{ path: "([^"]+)", element: <([A-Za-z][A-Za-z0-9]*)', app):
if '*' not in route:
routes.setdefault(route, []).append(element)
# Public and authenticated '/' are one concrete pattern.
assert len(routes) == 33, (len(routes), routes)
source_matrix = (ROOT / 'docs/redesign/phase-2/PRESERVATION_MATRIX.md').read_text(encoding='utf-8')
accepted = (ROOT / 'docs/redesign/phase-8/PRESERVATION.md').read_text(encoding='utf-8')
groups = []
for line in source_matrix.splitlines():
if not line.startswith('| **PRES-'):
continue
cells = [cell.strip() for cell in line.strip('|').split('|')]
identifier = re.search(r'PRES-[A-Z]\d{2}', cells[0]).group()
previous = next(row for row in accepted.splitlines() if identifier in row and row.startswith('|'))
groups.append(dict(id=identifier, capability=cells[0], entry=cells[1], owners=cells[2],
existingEvidence=cells[3], historicGap=cells[4],
entryStatus='DEFERRED' if '| DEFERRED |' in previous else 'PARTIAL',
phase9Status='NOT TESTED'))
assert len(groups) == 57 and len({group['id'] for group in groups}) == 57
assert sum(group['entryStatus'] == 'DEFERRED' for group in groups) == 1
endpoints = []
for path in sorted((ROOT / 'JobTrackerApi/Controllers').glob('*.cs')):
text = path.read_text(encoding='utf-8-sig')
bases = re.findall(r'\[Route\("([^"]+)"\)\]', text)
methods = re.findall(r'\[Http(Get|Post|Put|Patch|Delete)(?:\("([^"]*)"\))?\]', text)
if bases or methods:
endpoints.append(dict(file=relative(path), baseRoutes=bases, actions=[dict(method=m.upper(), suffix=s) for m, s in methods],
authorizationAttributes=re.findall(r'\[Authorize[^\]]*\]', text)))
tests = dict(backend=[relative(p) for p in sorted((ROOT / 'JobTrackerApi.Tests').rglob('*Tests.cs'))],
frontend=[relative(p) for p in sorted((UI / 'src').rglob('*')) if re.search(r'\.(test|spec)\.tsx?$', p.name)],
browser=[relative(p) for p in sorted((UI / 'e2e').glob('*.spec.ts'))],
sidecar=[relative(p) for p in sorted((ROOT / 'tools/summarizer/tests').glob('test_*.py'))])
assert all(tests.values())
role_source = (ROOT / 'JobTrackerApi/Controllers/UsersController.cs').read_text(encoding='utf-8')
role_literals = sorted(set(re.findall(r'"(Admin|User|Pro|Premium|Administrator)"', role_source)))
plan_source = (ROOT / 'JobTrackerApi/Models/AccountPlans.cs').read_text(encoding='utf-8')
entitlement_roles = sorted(set(re.findall(r'Contains\("([^"]+)"', plan_source)))
return dict(baseline='1c24e406f194f0f42277d837b3008a7a28dca26a', routes=routes,
preservation=groups, apiOwners=endpoints, rolesFromUsersController=role_literals,
entitlementRoles=entitlement_roles,
rolesCaveat='Admin controls user administration; Admin/Premium grant pro entitlements; ordinary accounts may have no role. UsersController supports custom role strings, which do not imply new grants. Public/anonymous is distinct.',
frontendPages=[relative(p) for p in sorted((UI / 'src/views').glob('*.tsx'))],
sharedComponents=[relative(p) for p in sorted((UI / 'src/components').rglob('*.tsx'))], tests=tests,
databaseWorkflows=[relative(p) for p in sorted((ROOT / 'JobTrackerApi/Data').rglob('*.cs'))],
migrations=[relative(p) for p in sorted((ROOT / 'JobTrackerApi/Migrations').glob('*.cs'))],
cvDocumentOwners=[relative(p) for p in sorted((ROOT / 'JobTrackerApi').rglob('*.cs')) if any(word in p.name for word in ['Pdf', 'CvRender', 'Document', 'CareerProfile'])])
if __name__ == '__main__':
inventory = collect()
HERE.mkdir(parents=True, exist_ok=True)
(HERE / 'inventory.json').write_text(json.dumps(inventory, indent=2, ensure_ascii=False) + '\n', encoding='utf-8')
request = Path('C:/Users/Connor/.codex/attachments/08a603fb-3692-4d57-8f62-69475e72a7e0/Pasted text.txt')
if request.exists() and not (HERE.parent / 'REQUEST.md').exists():
shutil.copyfile(request, HERE.parent / 'REQUEST.md')
lines = ['# P9-00 source inventory', '', 'Generated by `inventory.py`; associations below are existing candidate coverage, not executed Phase 9 passes.', '',
'## Route → workflow → feature → test evidence → risk → acceptance', '',
'| Route | Actual element owners | Preservation contracts / existing test evidence | Known risk | Phase 9 |',
'|---|---|---|---|---|']
for route, owners in inventory['routes'].items():
matched = [group for group in inventory['preservation'] if route in re.findall(r'/[A-Za-z0-9_:/-]*', group['entry'])]
group_text = ', '.join(group['id'] for group in matched) or 'Shared shell / nearest parent contracts; direct route evidence required'
lines.append(f"| `{route}` | {', '.join('`' + owner.replace('|', '&#124;') + '`' for owner in owners)} | {group_text}; [original test mapping](../../phase-2/PRESERVATION_MATRIX.md) | Human/device/provider qualification retained | NOT TESTED |")
lines += ['', '## Complete preservation ledger', '',
'Exact source/owner/test/gap columns for every group are retained in [inventory.json](inventory.json). The original matrix is authoritative for sub-capabilities.', '',
'| ID | Capability | Entry status | Phase 9 |', '|---|---|---|---|']
lines += [f"| {g['id']} | {g['capability']} | {g['entryStatus']} | NOT TESTED |" for g in inventory['preservation']]
lines += ['', '## API and implementation census', '',
f"{len(inventory['apiOwners'])} controller/partial owners; {sum(len(a['actions']) for a in inventory['apiOwners'])} HTTP method attributes. Full base/suffix/authorization attributes are in JSON; this is source inventory, not runtime endpoint acceptance.", '',
f"Existing test files: {', '.join(f'{lane} {len(files)}' for lane, files in inventory['tests'].items())}. File presence does not establish coverage of every branch.", '',
'Actors: anonymous/public, authenticated ordinary account, administrator, and plan entitlement variants. Actual role literals and authorization attributes are recorded in JSON. Test auth handlers, real local cookies and external identity providers require separate qualification.', '',
'Database workflows: canonical Career Profile and evidence/import, CV variants/revisions/overrides, frozen application packages, job lifecycle/soft delete, correspondence/draft versions, account preferences/session revocation, administrative restore. Migration and data-owner file lists are in JSON.', '',
'Shared UI: complete page/component lists in JSON; preserve current MUI/theme/i18n/router/confirm/prompt/resource owners. AI sidecar contracts are offline only unless actual model inference is explicitly exercised; P5-13 remains withheld.']
(HERE / 'INVENTORY.md').write_text('\n'.join(lines) + '\n', encoding='utf-8')
print(json.dumps(dict(routes=len(inventory['routes']), groups=len(inventory['preservation']), apiOwners=len(inventory['apiOwners']), tests={k: len(v) for k, v in inventory['tests'].items()})))
@@ -0,0 +1,827 @@
{
"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",
"global.json": "0786ac717bead2cb2c414024d54ddb86b16564be459d6e2b2f9d8114dbb62a9d",
"job-tracker-ui\\e2e\\accessibility.spec.ts": "8cd724183b6c1dd4e5b47f358afe9bd71e2ee1fac889a8c1ac01f93ab7e23f81",
"job-tracker-ui\\e2e\\account-isolation.spec.ts": "c1029dfb8f684cceff238925c91fc6690f14edfa84e1071ad8a843badf01bd24",
"job-tracker-ui\\e2e\\analytics-auth-repair.spec.ts": "03560be9bfff4d410866b5498f2a0b05ba1d9733a7ccbf8cde24f6d8e08cd4eb",
"job-tracker-ui\\e2e\\analytics-presentation.spec.ts": "eacb2ec856f406cbb1642044a5cca4105507c8c6ce8cf53bd19dd69d4e847c54",
"job-tracker-ui\\e2e\\board-presentation.spec.ts": "5f99a88d9d49a1749449390fa7380c04fbc972ac57086ebeffeb5ec5a9b738f0",
"job-tracker-ui\\e2e\\browser-zoom-audit.spec.ts": "d2e14c8fb86a068456c1bcebf090b707d6448561b8643f13204bcd22e1515b37",
"job-tracker-ui\\e2e\\builder-preview-keyboard.spec.ts": "abb2bfbf9a10f8fd717c3b438c9fb794a9fe63f25331f48acf4ab6eb0dd7f392",
"job-tracker-ui\\e2e\\csv-export.spec.ts": "8c02ff73f975b1073038b81f2b2d5dde187b8d25ed81b195f1006562c6b2b082",
"job-tracker-ui\\e2e\\cv-editor-frame.spec.ts": "560044042c97f71f1e8d6dc2f0fc2c8106f29d3fd3557324c9cc7c5569c58ecd",
"job-tracker-ui\\e2e\\cv-pagination.spec.ts": "507829402816ea4d977f2b46d95f71c90c75fc5abd60cd6f3dddeefbfb83d6f8",
"job-tracker-ui\\e2e\\cv-preview-presentation.spec.ts": "ed2d8676daa8101de53bd49c4dc1e27fc4e75db2b522a9cdd8d246ea8b42abaf",
"job-tracker-ui\\e2e\\cv-readiness.spec.ts": "fa5815d8fe735230d78f8857fed30b7231295e7312b59961d06f11f2d1de3b73",
"job-tracker-ui\\e2e\\cv-responsive-workflow.spec.ts": "315fc480cef1fda3dcfb6aa339ecb49a8709650fe4a142388446756fe5519ee8",
"job-tracker-ui\\e2e\\cv-section-scope.spec.ts": "d6d1eaf7d0fec859abac4f16d3ae64280c9813b391b2555f6b4235bb11502f4c",
"job-tracker-ui\\e2e\\cv-settings-presentation.spec.ts": "b395da8de320e18a55df4deb75373773fcac54f41e9a7b9752b3f16ce2a4b3f6",
"job-tracker-ui\\e2e\\dashboard-presentation.spec.ts": "964f50aa7e212282c7c244f383ec50ae82b04562d1dbaf741da49c5b37243524",
"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": "8167fee1a0e98c6b477ba5326c98116f79982e061e6db8b757167959693fb9b9",
"job-tracker-ui\\e2e\\job-sections-presentation.spec.ts": "bd3e08daecc48d4fb99e9b3d46bfc3ce0e2f9ada19c2fc521c5a1cadbea33a54",
"job-tracker-ui\\e2e\\kanban-theme.spec.ts": "3df2d2e6e3d459492331ff429c7bfc19064563110df39ac53d40093a0d8f3225",
"job-tracker-ui\\e2e\\landing-presentation.spec.ts": "1259073fec105074d5eb827b687913ecfe2aaee04830d981220f4de3a717e53d",
"job-tracker-ui\\e2e\\named-controls-modal-state.spec.ts": "c03cd2ce5f3b8c68292403f59f42189933e59e55f255a9c8303b2e89700fd529",
"job-tracker-ui\\e2e\\phase7-account-security.spec.ts": "99bfb44568ae506e5505bcf4ff0a26722a7cf3a98c5eaf2d1c3697be172d1330",
"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": "242418271363e218790bee5cfe2f8b2ebdf1b5e437601333bdf7162ca2e966d1",
"job-tracker-ui\\e2e\\phase7-application-forms.spec.ts": "f9bcf5d8369a2cc726f09b2e19f2880f02f0eda03dd5b6a978445ddcf0f3d8f9",
"job-tracker-ui\\e2e\\phase7-authentication.spec.ts": "62aa7d5941d047a764d06653641e5dc714c5ce5b335b017b385622cc629a7f9f",
"job-tracker-ui\\e2e\\phase7-career-editor.spec.ts": "dfc696107e8ad9adf265a5bae885407afd09f1be3b507de8ff03739b39a7f0b1",
"job-tracker-ui\\e2e\\phase7-career-import-review.spec.ts": "9d71da36f2a3c6f66034f6a810a3d8ea370eb7b492cb9de1527133a04388196f",
"job-tracker-ui\\e2e\\phase7-career-overview.spec.ts": "40370ab8871b6f0d1b52123aecde692a9e1b9bac67d84f56b230334b687336de",
"job-tracker-ui\\e2e\\phase7-career-source-ids.spec.ts": "92bc8f1b4c82210207071c56940813dfece3136832ba09ebd1e6c3471d8d7945",
"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": "7bed3271ebd74ddf0f69f5c2ec6c75a5dc34b360fb593a32650b0d6e4e644896",
"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": "e1d62f8c76b8fd3b80232a27232d2de55b7137ed898f26156b029d794751dd59",
"job-tracker-ui\\e2e\\phase7-job-import.spec.ts": "c16a82463eeeeee52430fff4cf71139586225c150db8cee1f1c572c9e17635b2",
"job-tracker-ui\\e2e\\phase7-notifications.spec.ts": "e6cd67b489057ea7ce9ff2db27ba6f08e9641e516d97ebac27f1a24ab43fdf86",
"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": "73639d3ab25c8c0b9dd3c1d637ab0adf2c9844385a35399376a85f56f9e3b466",
"job-tracker-ui\\e2e\\phase7-operations.spec.ts": "9a3ef4c0c6cd484349241b8ce1e378a2e456db152d2ab2cc2669a0b8fea29514",
"job-tracker-ui\\e2e\\phase7-public-cv.spec.ts": "f3dfebaf8bae716e3b824d6778c7581690393812d93a3b0b15b9af105252f019",
"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": "997b01c7e2a313e5f590820bad6b630af7eec67e782df7a786ccce6ebd569da0",
"job-tracker-ui\\e2e\\responsive-accessibility-audit.spec.ts": "b69420b00c516855b4664807f2ceb174c004f1491a77bd4a2670c7dfee47a026",
"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": "72f549ac7595cb3c148fd887e3f27fd14d9b8776ffb6b12bc59b18ac614e581b",
"job-tracker-ui\\e2e\\settings-page-layout.spec.ts": "2db9a988be4664539d78250c93cc2ca98b85379b6294e6762b8ffb9213396acd",
"job-tracker-ui\\e2e\\shell-readiness.spec.ts": "3cbcda9504535a707f25f9813fdd435218cc5a7605ab665cd753faeac7f9a5c4",
"job-tracker-ui\\e2e\\smoke.spec.ts": "5ef62fb4db1dbb86a1128954136297605dd3117ecca2344bb724d7541aabd836",
"job-tracker-ui\\e2e\\table-density.spec.ts": "73f2376c87d839c5579907e313e33d65bd87887d6c99bda17c6199589a53b3b5",
"job-tracker-ui\\out\\404.html": "9a3f39152ff8a17cadcd8731ae32aa3cd3be5118722b0c6353cd3fe892cc3d83",
"job-tracker-ui\\out\\__next.__PAGE__.txt": "edb60412df882fc9e308301e9deb428ffd04d09cdcf32df66827f832434b9c49",
"job-tracker-ui\\out\\__next._full.txt": "42b041318a6627c247336c97b429043c346d9ce0d5fe07bd6d7af74ec4467960",
"job-tracker-ui\\out\\__next._tree.txt": "2e7fe594ef87239650bda526e05a40f63f726de8de29a8816fdc7df5dcaf712c",
"job-tracker-ui\\out\\_next\\static\\chunks\\035759_jwo3d2.js": "d130d6ae20af93e585ff79b3c22443e790f69c3c0bdbd035b8505c9bd70bd8b7",
"job-tracker-ui\\out\\_next\\static\\chunks\\04ne4s00wst-i.js": "c254b7f1fa8df945d7c333e331cec95e6d7dc4620490170ed64703f8f0162255",
"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\\0w3y5uv0hr947.js": "94b0774abaaa0aaf1f6f324d72982fcec39061a97602b8d27d7550e2076ab0c0",
"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\\1pvs_7i8s24h_.js": "e00d3cb92b81cf1572f00175d3b25bf3805946d5bd189e8d268c23af449473f3",
"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\\1vjm2fk23r5kh.js": "a5720dd1ceb2b511ce89f809366c8ce4b63318b52a90368f50fa1e17f2e14237",
"job-tracker-ui\\out\\_next\\static\\chunks\\1xwc-b795syag.css": "f73c002233f931ca14d0ae58815c47ca9f2659f25b1547a6d1fdca12a2a00b3f",
"job-tracker-ui\\out\\_next\\static\\chunks\\1zc_vxyphd4dx.js": "493d5c39a256c2de40b80bfa1dd9682e9af0bad5cc1e3f85a4b89812b9e80d14",
"job-tracker-ui\\out\\_next\\static\\chunks\\2aoqedway9mw0.js": "8931dbd823bb6b3bd3d74e2c1353c934c4b65307969e66450c1750943406ba7a",
"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\\2lppknr1nvqch.js": "fccd6b742b8831c7ddbc8905df7f8882d73c4d3e644b63ea1c1203a3119f4ac3",
"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\\2qdw9ugzxwxat.js": "3ab1b2b469e65b653b59ce7bc5e8241443ac6d87f9b096a79d5b42fa5ac81d89",
"job-tracker-ui\\out\\_next\\static\\chunks\\2vlttipo05xfv.js": "a17d6235f5f3d618b8d0c03fcafe6ee624088571c8b29f1f6d8800f8f57bccf2",
"job-tracker-ui\\out\\_next\\static\\chunks\\2wg3pmbkxahjq.js": "d26d9f38ba1ee22692f6f28110126ec8a5e63f29807325bab05814291690a080",
"job-tracker-ui\\out\\_next\\static\\chunks\\2ygcif9043xun.js": "5b2f31e6415195eab37a9362098b434bf0c1f41646a57e2f9e7715506bc04d5f",
"job-tracker-ui\\out\\_next\\static\\chunks\\2yj1t8mjxjl5o.js": "54e05f4836355eae5caa458de0b52da91b73a7a4bd2bffaacb2d5c8c20fce9cf",
"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\\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\\3da5bxiklpfv1.js": "2299285ad5bb253aa699f0548015c8293ed3aa59e51ed928151a219cb40a79f1",
"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\\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\\406gm9r2rgjcf.js": "c165b5e9dced109c6faf32b8bdcbe2050471f67c5bc37c8349404827d4575ca1",
"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\\u-ZXZvvxOhn5WiMaKfQU7\\_buildManifest.js": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea",
"job-tracker-ui\\out\\_next\\static\\u-ZXZvvxOhn5WiMaKfQU7\\_clientMiddlewareManifest.js": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a",
"job-tracker-ui\\out\\_next\\static\\u-ZXZvvxOhn5WiMaKfQU7\\_ssgManifest.js": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00",
"job-tracker-ui\\out\\_not-found\\__next._full.txt": "29a88e66b5760ba4f3010671dc04db55caa13626276bfe38e2510347396ea9b2",
"job-tracker-ui\\out\\_not-found\\__next._not-found\\__PAGE__.txt": "a8a77976ab0e3f1000fe207b1d401acbea8e2acdda4e1b3b0f987171418559dc",
"job-tracker-ui\\out\\_not-found\\__next._tree.txt": "dbe4544c3d1adac0a307414f25a67f2487cc2933ee6dcda57c3cfe670e96b6f7",
"job-tracker-ui\\out\\_not-found.html": "9a3f39152ff8a17cadcd8731ae32aa3cd3be5118722b0c6353cd3fe892cc3d83",
"job-tracker-ui\\out\\_not-found.txt": "29a88e66b5760ba4f3010671dc04db55caa13626276bfe38e2510347396ea9b2",
"job-tracker-ui\\out\\favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a",
"job-tracker-ui\\out\\favicon.svg": "f46bb75bd17edaa86713a92b40774be5055bc2bd5f49223b3891fbe9a5d068cb",
"job-tracker-ui\\out\\index.html": "ed3ac768f8d727529b507c352710e2aab04d9b9cc54b57ed6e1e23e5bc7e25d5",
"job-tracker-ui\\out\\index.txt": "42b041318a6627c247336c97b429043c346d9ce0d5fe07bd6d7af74ec4467960",
"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\\playwright.config.ts": "24f13510ab8d4f2718bfeaaa7c77bb95ae109c69d4a318abd1b5c87777306ee0",
"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": "bcbbd31dfe6327a54c490609bbb859759e1cdb37fa896bbe43f62a155e145965",
"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": "d51a6fa0f1884048b5a13e4935184edc36ce50527bec42303fd7f265a9a8fdf5",
"job-tracker-ui\\src\\applicationDrafts.ts": "2a5578f58e2ca00d345a04db039d61c5af28c094ef0e976b1106173e137a6027",
"job-tracker-ui\\src\\applicationWorkspace.test.ts": "bd068a208d40f782f66f77e6196378f4fa2a5be6f0eacd71e4f6271276e89362",
"job-tracker-ui\\src\\applicationWorkspace.ts": "73b5b8c894e1ff053a41cc8c8beb6baf66ca03146abaec5866377602345f6981",
"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": "65ca2f09815b1cedfe693e772839655717e705d2c88795344c3a114eb21b1b01",
"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": "2ec396e29bacccacc7f9cac675894625474c99d68be33d88eaa15c93fb4ee43c",
"job-tracker-ui\\src\\career-workspace-page.test.tsx": "628512985a14e71d0d34bf1e3e0e77d948ad7d5c3eb608de482051f2aedf3052",
"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": "453476dca53b2bbb898d082fdc6088426924774e21fb4114e118968d26573391",
"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": "d2bc438b66b3280dc7cd40909b578032407f7735b3e25957e2ea532056a0000b",
"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": "037c58c30a0fa0f7a3082613ec751872f6f0ff86c8720b1a108dc711dd3c02fe",
"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": "2e72e75fd7c6e0d0aac84a7b9e1450a881d0efb71dd06ed990afd047537a629c",
"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\\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": "fd4b5fab56ed4612f3ee5c32546ed2eaa0daee401898f58eeddd5f6d27ff2772",
"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": "68fbd25b22101c464e5aaeddfbb44f298c2359dea9e7f7404bb515cabdbef3ad",
"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": "0ad289228a60bf715cc6d8c44f7c50f2b7366def96bf6d7bd43474d5bf738d2d",
"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": "568cecba158504787c4710675e77276b719df64786dbce6da6d4daa38d9aa7bc",
"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": "a45779b0b7868c4a69ed4a17316899074416fc8c6f8f6c083827e949f790d7b1",
"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": "7a0fb891f2632b35a8267ca0143a68522334f20bd2b2eda57b3ed2661e357934",
"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": "03d4b7d4bc9aa55d597e70980f99449e4da0a5ab8c1f4a06aff6bca79d45abfd",
"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": "b108ef0cd1a4d79329857bf6d12cf9b8a019389fd51d92ee3e3b4a93cd0b0e44",
"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": "dd4384e91cdaeac62339aa79f1ea37631801432f050d55dfb1dc508fc1581712",
"JobTrackerApi\\.dockerignore": "a8ebaa567f938e5d0f9d81d29a36c686aeabadbc37385344d8dfcbe04cecba8e",
"JobTrackerApi\\appsettings.Development.json": "c5fceaa5113f8106146879005a8e00c13b3bc0438fb83e2c162e99cec1e166a8",
"JobTrackerApi\\appsettings.json": "7c5696451094393edd60777d23363776575244508ff54cbd0e6942ab856ffd6d",
"JobTrackerApi\\bin\\Release\\net9.0\\JobTrackerApi.dll": "8e9d09348f68315218a6fa92f8d83d609bd4634103a55b29e5041f9c5db4cacc",
"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": "ffc199ad27194f4b6601b98922808d660159f73ba798d5368284a50832e41bd9",
"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": "f8ada6382c3051954f7ea9977fa54680fee7c709f23aec8593485eda92bfb509",
"JobTrackerApi\\Controllers\\BackupController.cs": "1e99eb05f1644755feceea76af2155543458f7a4a30d5269a49081ccd1baa8eb",
"JobTrackerApi\\Controllers\\BillingController.cs": "a7c46d83bd6e0e6d7d5983fd83ae8662b36fd65f1280765d6536fb476045e99c",
"JobTrackerApi\\Controllers\\CareerEvidenceController.cs": "46b9f9a78aa486d0870fe86a85156f87820798454d2e4f5e96c02208b47cd117",
"JobTrackerApi\\Controllers\\CareerProfileController.cs": "d4c3a7a639032e7df178cfcc5d7b0943c6ef84051466018d592a82821bcc4334",
"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": "835121a822d1eaaba03381bbd890c643d2e05c5df90630ad88e7081170ff73ce",
"JobTrackerApi\\Controllers\\JobApplicationLifecycleController.cs": "127a5cda45ea4813332a85e174d5451091437a2477db9102fa1944c80ab4b165",
"JobTrackerApi\\Controllers\\JobApplicationsController.cs": "b6cab1db19181005afded95a768a8c789cab22d5b5cc65cc31a30af564b8af98",
"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": "2bcb4166e7f42510ae1c5a553943e2db036be66eff6ca996ce85e3a032708be8",
"JobTrackerApi\\Controllers\\ProfileCvController.Parsing.cs": "5def3865c98277cc0b4d891b80c8680a0ce38e9864d6dc35570ece902a657aac",
"JobTrackerApi\\Controllers\\ProfileCvController.Pipeline.cs": "ba26995f12b43d6a7cffef35a553d76d44df49de64739e9685f5f1daa841e0f7",
"JobTrackerApi\\Controllers\\ProfileCvDtos.cs": "73f91d597b06ee03ee56d5d0f2432a1d90e3d849f142e56d85c061feeddb5ffd",
"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": "61e2007b54d93e82293884ae490bb7526086bb18b73f1ef237d06f7b54742a37",
"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\\JobTrackerContextModelSnapshot.cs": "bcb596507956a89ccd243901e337c89407897b479cfe6e20dd59f42584fc5f2d",
"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": "dd75f1e33d5094e0c244938365e1a3ff63a1ecf1895247a8008dd0ec667904d1",
"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": "e906d23d8d4195a8e361428b26a9a713a77981f4d6636c80f68f6706c47e4d53",
"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": "0eeb42c046bc0724acc93eff31275b156f69f7e8d6c6200ee620a3d5011bacb4",
"JobTrackerApi\\Services\\ApplicationChecklistService.cs": "b9b0bf8c362f4cecf4586e221b9e003cf241bfcbcf3baea45519d3227aeb4c4c",
"JobTrackerApi\\Services\\ApplicationIntelligenceService.cs": "4ee426d66e325a03196d88e3a952b337fc0d93847e5b2c9c952997307fb69aee",
"JobTrackerApi\\Services\\ApplicationTimelineService.cs": "0a42d6e2dc2647c8f878a5c21b17f3635771a1fe79933d1a5adca216c04ea7a7",
"JobTrackerApi\\Services\\ApplicationWorkspaceService.cs": "89804f852b410b6b5f357ee202ba4d11974f5b795679ef6b6978fb140fb936a5",
"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": "96d7ff93fe8efc5a26d378ca067812beac4c1742a0c58459c3b2899748929549",
"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\\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": "1291602d291df13c445784e3a96e3396392ab7ac45996015527f51dbc1520731",
"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": "95c6a680cb00db945da49f1d454f071688712e8220401327e170cb0442165a7f",
"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": "0d137d140fb5f96c097e4828a446a31cf3290829cb14e2faf4e36dfbd07f3295",
"JobTrackerApi.Tests\\BuildMetadataTests.cs": "ad3b09389071067500a58cdf2c9b0e0806e6225d0f41b1b691f439f6af1cdada",
"JobTrackerApi.Tests\\CareerEvidenceControllerTests.cs": "2621168ce6e0a287d2415da3c22a2348977d2989206e7737ba7de7e7780c7aae",
"JobTrackerApi.Tests\\CareerProfileControllerTests.cs": "05aa1356072a33dac1ebf203e0487164b117b2a3020cc50b8f8f39bdf436e307",
"JobTrackerApi.Tests\\CareerProfileServiceTests.cs": "806ec60b7465eefd46fc7ff548b7ff28f06a0c11dc5e34e815a77229d8bf6b2a",
"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": "ddfd745b81d75dbb01bd6f206c546d231fde22c77b02389c32bb7d780a397cab",
"JobTrackerApi.Tests\\CvBuilderTests.cs": "fca823e4f23319153af2a3d2edaa983db8abadc6f566ae13140eee83ffa6171b",
"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": "31cbe4219ebb035751c1ffb73c975ca579ecb88af0671e117a4c30a997fa60ce",
"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": "5dff6fdf1bf2a3f5e965b211c871ea55044f42c83970f4cd29b0ba310488a946",
"JobTrackerApi.Tests\\JobApplicationsAppliedDateHistoryTests.cs": "a64865b38cc81ebcac9422f83540a3ae172d7ec6a9af2a6771e934f1ef22cf3b",
"JobTrackerApi.Tests\\JobApplicationsAuthorizationTests.cs": "a1513153818a5485b0406791e599c46a1247dcc6e9157d9ae85d0d19f7a81c17",
"JobTrackerApi.Tests\\JobApplicationsControllerTests.cs": "63fa161f4c5c410ace99dc1b48621812ff44bda3be95b3002eaf6bbcadecda17",
"JobTrackerApi.Tests\\JobApplicationsEndpointBehaviorTests.cs": "d5c0c29c7c483cecdf05370289ec0b51694aec3d6d0faed202a59de8335002f1",
"JobTrackerApi.Tests\\JobApplicationsFollowUpDraftTests.cs": "72ebdca92d5e04c67f773171ee41988062c08da44088ba08dd2ec7ebcf7cb855",
"JobTrackerApi.Tests\\JobApplicationsMariaDraftTests.cs": "2b4d0a427b56c229496237cc2492c9ec4fbe2e09a2835ded43db83044a25edaa",
"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": "b49c8490a89f2d980a3f9283e9c7a9f3a28caa5ac7ce14080adda272e8eaeb02",
"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": "f7075de96846e9044f90654b5c0e634d41c846716445d99e4bab26636740748b",
"JobTrackerApi.Tests\\PublicCvControllerTests.cs": "94bbb54fcfce091db453ddb0584f71d9a3f5936232a5c9c460c2692d933c4374",
"JobTrackerApi.Tests\\RateLimitPartitionKeysTests.cs": "578314976674bbba6f5fb28a46f42145fe497a53e9029af5d1308f8540907477",
"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": "be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758",
"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"
}
@@ -0,0 +1,827 @@
{
"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",
"global.json": "0786ac717bead2cb2c414024d54ddb86b16564be459d6e2b2f9d8114dbb62a9d",
"job-tracker-ui\\e2e\\accessibility.spec.ts": "8cd724183b6c1dd4e5b47f358afe9bd71e2ee1fac889a8c1ac01f93ab7e23f81",
"job-tracker-ui\\e2e\\account-isolation.spec.ts": "c1029dfb8f684cceff238925c91fc6690f14edfa84e1071ad8a843badf01bd24",
"job-tracker-ui\\e2e\\analytics-auth-repair.spec.ts": "03560be9bfff4d410866b5498f2a0b05ba1d9733a7ccbf8cde24f6d8e08cd4eb",
"job-tracker-ui\\e2e\\analytics-presentation.spec.ts": "eacb2ec856f406cbb1642044a5cca4105507c8c6ce8cf53bd19dd69d4e847c54",
"job-tracker-ui\\e2e\\board-presentation.spec.ts": "5f99a88d9d49a1749449390fa7380c04fbc972ac57086ebeffeb5ec5a9b738f0",
"job-tracker-ui\\e2e\\browser-zoom-audit.spec.ts": "d2e14c8fb86a068456c1bcebf090b707d6448561b8643f13204bcd22e1515b37",
"job-tracker-ui\\e2e\\builder-preview-keyboard.spec.ts": "abb2bfbf9a10f8fd717c3b438c9fb794a9fe63f25331f48acf4ab6eb0dd7f392",
"job-tracker-ui\\e2e\\csv-export.spec.ts": "8c02ff73f975b1073038b81f2b2d5dde187b8d25ed81b195f1006562c6b2b082",
"job-tracker-ui\\e2e\\cv-editor-frame.spec.ts": "560044042c97f71f1e8d6dc2f0fc2c8106f29d3fd3557324c9cc7c5569c58ecd",
"job-tracker-ui\\e2e\\cv-pagination.spec.ts": "507829402816ea4d977f2b46d95f71c90c75fc5abd60cd6f3dddeefbfb83d6f8",
"job-tracker-ui\\e2e\\cv-preview-presentation.spec.ts": "ed2d8676daa8101de53bd49c4dc1e27fc4e75db2b522a9cdd8d246ea8b42abaf",
"job-tracker-ui\\e2e\\cv-readiness.spec.ts": "fa5815d8fe735230d78f8857fed30b7231295e7312b59961d06f11f2d1de3b73",
"job-tracker-ui\\e2e\\cv-responsive-workflow.spec.ts": "315fc480cef1fda3dcfb6aa339ecb49a8709650fe4a142388446756fe5519ee8",
"job-tracker-ui\\e2e\\cv-section-scope.spec.ts": "d6d1eaf7d0fec859abac4f16d3ae64280c9813b391b2555f6b4235bb11502f4c",
"job-tracker-ui\\e2e\\cv-settings-presentation.spec.ts": "b395da8de320e18a55df4deb75373773fcac54f41e9a7b9752b3f16ce2a4b3f6",
"job-tracker-ui\\e2e\\dashboard-presentation.spec.ts": "964f50aa7e212282c7c244f383ec50ae82b04562d1dbaf741da49c5b37243524",
"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": "8167fee1a0e98c6b477ba5326c98116f79982e061e6db8b757167959693fb9b9",
"job-tracker-ui\\e2e\\job-sections-presentation.spec.ts": "bd3e08daecc48d4fb99e9b3d46bfc3ce0e2f9ada19c2fc521c5a1cadbea33a54",
"job-tracker-ui\\e2e\\kanban-theme.spec.ts": "3df2d2e6e3d459492331ff429c7bfc19064563110df39ac53d40093a0d8f3225",
"job-tracker-ui\\e2e\\landing-presentation.spec.ts": "1259073fec105074d5eb827b687913ecfe2aaee04830d981220f4de3a717e53d",
"job-tracker-ui\\e2e\\named-controls-modal-state.spec.ts": "c03cd2ce5f3b8c68292403f59f42189933e59e55f255a9c8303b2e89700fd529",
"job-tracker-ui\\e2e\\phase7-account-security.spec.ts": "99bfb44568ae506e5505bcf4ff0a26722a7cf3a98c5eaf2d1c3697be172d1330",
"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": "f9bcf5d8369a2cc726f09b2e19f2880f02f0eda03dd5b6a978445ddcf0f3d8f9",
"job-tracker-ui\\e2e\\phase7-authentication.spec.ts": "62aa7d5941d047a764d06653641e5dc714c5ce5b335b017b385622cc629a7f9f",
"job-tracker-ui\\e2e\\phase7-career-editor.spec.ts": "dfc696107e8ad9adf265a5bae885407afd09f1be3b507de8ff03739b39a7f0b1",
"job-tracker-ui\\e2e\\phase7-career-import-review.spec.ts": "9d71da36f2a3c6f66034f6a810a3d8ea370eb7b492cb9de1527133a04388196f",
"job-tracker-ui\\e2e\\phase7-career-overview.spec.ts": "40370ab8871b6f0d1b52123aecde692a9e1b9bac67d84f56b230334b687336de",
"job-tracker-ui\\e2e\\phase7-career-source-ids.spec.ts": "92bc8f1b4c82210207071c56940813dfece3136832ba09ebd1e6c3471d8d7945",
"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": "7bed3271ebd74ddf0f69f5c2ec6c75a5dc34b360fb593a32650b0d6e4e644896",
"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": "e1d62f8c76b8fd3b80232a27232d2de55b7137ed898f26156b029d794751dd59",
"job-tracker-ui\\e2e\\phase7-job-import.spec.ts": "c16a82463eeeeee52430fff4cf71139586225c150db8cee1f1c572c9e17635b2",
"job-tracker-ui\\e2e\\phase7-notifications.spec.ts": "e6cd67b489057ea7ce9ff2db27ba6f08e9641e516d97ebac27f1a24ab43fdf86",
"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": "73639d3ab25c8c0b9dd3c1d637ab0adf2c9844385a35399376a85f56f9e3b466",
"job-tracker-ui\\e2e\\phase7-operations.spec.ts": "9a3ef4c0c6cd484349241b8ce1e378a2e456db152d2ab2cc2669a0b8fea29514",
"job-tracker-ui\\e2e\\phase7-public-cv.spec.ts": "f3dfebaf8bae716e3b824d6778c7581690393812d93a3b0b15b9af105252f019",
"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": "997b01c7e2a313e5f590820bad6b630af7eec67e782df7a786ccce6ebd569da0",
"job-tracker-ui\\e2e\\responsive-accessibility-audit.spec.ts": "b69420b00c516855b4664807f2ceb174c004f1491a77bd4a2670c7dfee47a026",
"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": "72f549ac7595cb3c148fd887e3f27fd14d9b8776ffb6b12bc59b18ac614e581b",
"job-tracker-ui\\e2e\\settings-page-layout.spec.ts": "2db9a988be4664539d78250c93cc2ca98b85379b6294e6762b8ffb9213396acd",
"job-tracker-ui\\e2e\\shell-readiness.spec.ts": "3cbcda9504535a707f25f9813fdd435218cc5a7605ab665cd753faeac7f9a5c4",
"job-tracker-ui\\e2e\\smoke.spec.ts": "5ef62fb4db1dbb86a1128954136297605dd3117ecca2344bb724d7541aabd836",
"job-tracker-ui\\e2e\\table-density.spec.ts": "73f2376c87d839c5579907e313e33d65bd87887d6c99bda17c6199589a53b3b5",
"job-tracker-ui\\out\\404.html": "9a3f39152ff8a17cadcd8731ae32aa3cd3be5118722b0c6353cd3fe892cc3d83",
"job-tracker-ui\\out\\__next.__PAGE__.txt": "edb60412df882fc9e308301e9deb428ffd04d09cdcf32df66827f832434b9c49",
"job-tracker-ui\\out\\__next._full.txt": "42b041318a6627c247336c97b429043c346d9ce0d5fe07bd6d7af74ec4467960",
"job-tracker-ui\\out\\__next._tree.txt": "2e7fe594ef87239650bda526e05a40f63f726de8de29a8816fdc7df5dcaf712c",
"job-tracker-ui\\out\\_next\\static\\chunks\\035759_jwo3d2.js": "d130d6ae20af93e585ff79b3c22443e790f69c3c0bdbd035b8505c9bd70bd8b7",
"job-tracker-ui\\out\\_next\\static\\chunks\\04ne4s00wst-i.js": "c254b7f1fa8df945d7c333e331cec95e6d7dc4620490170ed64703f8f0162255",
"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\\0w3y5uv0hr947.js": "94b0774abaaa0aaf1f6f324d72982fcec39061a97602b8d27d7550e2076ab0c0",
"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\\1pvs_7i8s24h_.js": "e00d3cb92b81cf1572f00175d3b25bf3805946d5bd189e8d268c23af449473f3",
"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\\1vjm2fk23r5kh.js": "a5720dd1ceb2b511ce89f809366c8ce4b63318b52a90368f50fa1e17f2e14237",
"job-tracker-ui\\out\\_next\\static\\chunks\\1xwc-b795syag.css": "f73c002233f931ca14d0ae58815c47ca9f2659f25b1547a6d1fdca12a2a00b3f",
"job-tracker-ui\\out\\_next\\static\\chunks\\1zc_vxyphd4dx.js": "493d5c39a256c2de40b80bfa1dd9682e9af0bad5cc1e3f85a4b89812b9e80d14",
"job-tracker-ui\\out\\_next\\static\\chunks\\2aoqedway9mw0.js": "8931dbd823bb6b3bd3d74e2c1353c934c4b65307969e66450c1750943406ba7a",
"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\\2lppknr1nvqch.js": "fccd6b742b8831c7ddbc8905df7f8882d73c4d3e644b63ea1c1203a3119f4ac3",
"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\\2qdw9ugzxwxat.js": "3ab1b2b469e65b653b59ce7bc5e8241443ac6d87f9b096a79d5b42fa5ac81d89",
"job-tracker-ui\\out\\_next\\static\\chunks\\2vlttipo05xfv.js": "a17d6235f5f3d618b8d0c03fcafe6ee624088571c8b29f1f6d8800f8f57bccf2",
"job-tracker-ui\\out\\_next\\static\\chunks\\2wg3pmbkxahjq.js": "d26d9f38ba1ee22692f6f28110126ec8a5e63f29807325bab05814291690a080",
"job-tracker-ui\\out\\_next\\static\\chunks\\2ygcif9043xun.js": "5b2f31e6415195eab37a9362098b434bf0c1f41646a57e2f9e7715506bc04d5f",
"job-tracker-ui\\out\\_next\\static\\chunks\\2yj1t8mjxjl5o.js": "54e05f4836355eae5caa458de0b52da91b73a7a4bd2bffaacb2d5c8c20fce9cf",
"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\\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\\3da5bxiklpfv1.js": "2299285ad5bb253aa699f0548015c8293ed3aa59e51ed928151a219cb40a79f1",
"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\\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\\406gm9r2rgjcf.js": "c165b5e9dced109c6faf32b8bdcbe2050471f67c5bc37c8349404827d4575ca1",
"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\\u-ZXZvvxOhn5WiMaKfQU7\\_buildManifest.js": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea",
"job-tracker-ui\\out\\_next\\static\\u-ZXZvvxOhn5WiMaKfQU7\\_clientMiddlewareManifest.js": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a",
"job-tracker-ui\\out\\_next\\static\\u-ZXZvvxOhn5WiMaKfQU7\\_ssgManifest.js": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00",
"job-tracker-ui\\out\\_not-found\\__next._full.txt": "29a88e66b5760ba4f3010671dc04db55caa13626276bfe38e2510347396ea9b2",
"job-tracker-ui\\out\\_not-found\\__next._not-found\\__PAGE__.txt": "a8a77976ab0e3f1000fe207b1d401acbea8e2acdda4e1b3b0f987171418559dc",
"job-tracker-ui\\out\\_not-found\\__next._tree.txt": "dbe4544c3d1adac0a307414f25a67f2487cc2933ee6dcda57c3cfe670e96b6f7",
"job-tracker-ui\\out\\_not-found.html": "9a3f39152ff8a17cadcd8731ae32aa3cd3be5118722b0c6353cd3fe892cc3d83",
"job-tracker-ui\\out\\_not-found.txt": "29a88e66b5760ba4f3010671dc04db55caa13626276bfe38e2510347396ea9b2",
"job-tracker-ui\\out\\favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a",
"job-tracker-ui\\out\\favicon.svg": "f46bb75bd17edaa86713a92b40774be5055bc2bd5f49223b3891fbe9a5d068cb",
"job-tracker-ui\\out\\index.html": "ed3ac768f8d727529b507c352710e2aab04d9b9cc54b57ed6e1e23e5bc7e25d5",
"job-tracker-ui\\out\\index.txt": "42b041318a6627c247336c97b429043c346d9ce0d5fe07bd6d7af74ec4467960",
"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\\playwright.config.ts": "24f13510ab8d4f2718bfeaaa7c77bb95ae109c69d4a318abd1b5c87777306ee0",
"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": "bcbbd31dfe6327a54c490609bbb859759e1cdb37fa896bbe43f62a155e145965",
"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": "d51a6fa0f1884048b5a13e4935184edc36ce50527bec42303fd7f265a9a8fdf5",
"job-tracker-ui\\src\\applicationDrafts.ts": "2a5578f58e2ca00d345a04db039d61c5af28c094ef0e976b1106173e137a6027",
"job-tracker-ui\\src\\applicationWorkspace.test.ts": "bd068a208d40f782f66f77e6196378f4fa2a5be6f0eacd71e4f6271276e89362",
"job-tracker-ui\\src\\applicationWorkspace.ts": "73b5b8c894e1ff053a41cc8c8beb6baf66ca03146abaec5866377602345f6981",
"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": "65ca2f09815b1cedfe693e772839655717e705d2c88795344c3a114eb21b1b01",
"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": "2ec396e29bacccacc7f9cac675894625474c99d68be33d88eaa15c93fb4ee43c",
"job-tracker-ui\\src\\career-workspace-page.test.tsx": "628512985a14e71d0d34bf1e3e0e77d948ad7d5c3eb608de482051f2aedf3052",
"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": "453476dca53b2bbb898d082fdc6088426924774e21fb4114e118968d26573391",
"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": "d2bc438b66b3280dc7cd40909b578032407f7735b3e25957e2ea532056a0000b",
"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": "037c58c30a0fa0f7a3082613ec751872f6f0ff86c8720b1a108dc711dd3c02fe",
"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": "2e72e75fd7c6e0d0aac84a7b9e1450a881d0efb71dd06ed990afd047537a629c",
"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\\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": "fd4b5fab56ed4612f3ee5c32546ed2eaa0daee401898f58eeddd5f6d27ff2772",
"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": "68fbd25b22101c464e5aaeddfbb44f298c2359dea9e7f7404bb515cabdbef3ad",
"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": "0ad289228a60bf715cc6d8c44f7c50f2b7366def96bf6d7bd43474d5bf738d2d",
"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": "568cecba158504787c4710675e77276b719df64786dbce6da6d4daa38d9aa7bc",
"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": "a45779b0b7868c4a69ed4a17316899074416fc8c6f8f6c083827e949f790d7b1",
"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": "7a0fb891f2632b35a8267ca0143a68522334f20bd2b2eda57b3ed2661e357934",
"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": "03d4b7d4bc9aa55d597e70980f99449e4da0a5ab8c1f4a06aff6bca79d45abfd",
"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": "b108ef0cd1a4d79329857bf6d12cf9b8a019389fd51d92ee3e3b4a93cd0b0e44",
"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": "dd4384e91cdaeac62339aa79f1ea37631801432f050d55dfb1dc508fc1581712",
"JobTrackerApi\\.dockerignore": "a8ebaa567f938e5d0f9d81d29a36c686aeabadbc37385344d8dfcbe04cecba8e",
"JobTrackerApi\\appsettings.Development.json": "c5fceaa5113f8106146879005a8e00c13b3bc0438fb83e2c162e99cec1e166a8",
"JobTrackerApi\\appsettings.json": "7c5696451094393edd60777d23363776575244508ff54cbd0e6942ab856ffd6d",
"JobTrackerApi\\bin\\Release\\net9.0\\JobTrackerApi.dll": "8e9d09348f68315218a6fa92f8d83d609bd4634103a55b29e5041f9c5db4cacc",
"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": "ffc199ad27194f4b6601b98922808d660159f73ba798d5368284a50832e41bd9",
"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": "f8ada6382c3051954f7ea9977fa54680fee7c709f23aec8593485eda92bfb509",
"JobTrackerApi\\Controllers\\BackupController.cs": "1e99eb05f1644755feceea76af2155543458f7a4a30d5269a49081ccd1baa8eb",
"JobTrackerApi\\Controllers\\BillingController.cs": "a7c46d83bd6e0e6d7d5983fd83ae8662b36fd65f1280765d6536fb476045e99c",
"JobTrackerApi\\Controllers\\CareerEvidenceController.cs": "46b9f9a78aa486d0870fe86a85156f87820798454d2e4f5e96c02208b47cd117",
"JobTrackerApi\\Controllers\\CareerProfileController.cs": "d4c3a7a639032e7df178cfcc5d7b0943c6ef84051466018d592a82821bcc4334",
"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": "835121a822d1eaaba03381bbd890c643d2e05c5df90630ad88e7081170ff73ce",
"JobTrackerApi\\Controllers\\JobApplicationLifecycleController.cs": "127a5cda45ea4813332a85e174d5451091437a2477db9102fa1944c80ab4b165",
"JobTrackerApi\\Controllers\\JobApplicationsController.cs": "b6cab1db19181005afded95a768a8c789cab22d5b5cc65cc31a30af564b8af98",
"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": "2bcb4166e7f42510ae1c5a553943e2db036be66eff6ca996ce85e3a032708be8",
"JobTrackerApi\\Controllers\\ProfileCvController.Parsing.cs": "5def3865c98277cc0b4d891b80c8680a0ce38e9864d6dc35570ece902a657aac",
"JobTrackerApi\\Controllers\\ProfileCvController.Pipeline.cs": "ba26995f12b43d6a7cffef35a553d76d44df49de64739e9685f5f1daa841e0f7",
"JobTrackerApi\\Controllers\\ProfileCvDtos.cs": "73f91d597b06ee03ee56d5d0f2432a1d90e3d849f142e56d85c061feeddb5ffd",
"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": "61e2007b54d93e82293884ae490bb7526086bb18b73f1ef237d06f7b54742a37",
"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\\JobTrackerContextModelSnapshot.cs": "bcb596507956a89ccd243901e337c89407897b479cfe6e20dd59f42584fc5f2d",
"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": "dd75f1e33d5094e0c244938365e1a3ff63a1ecf1895247a8008dd0ec667904d1",
"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": "e906d23d8d4195a8e361428b26a9a713a77981f4d6636c80f68f6706c47e4d53",
"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": "0eeb42c046bc0724acc93eff31275b156f69f7e8d6c6200ee620a3d5011bacb4",
"JobTrackerApi\\Services\\ApplicationChecklistService.cs": "b9b0bf8c362f4cecf4586e221b9e003cf241bfcbcf3baea45519d3227aeb4c4c",
"JobTrackerApi\\Services\\ApplicationIntelligenceService.cs": "4ee426d66e325a03196d88e3a952b337fc0d93847e5b2c9c952997307fb69aee",
"JobTrackerApi\\Services\\ApplicationTimelineService.cs": "0a42d6e2dc2647c8f878a5c21b17f3635771a1fe79933d1a5adca216c04ea7a7",
"JobTrackerApi\\Services\\ApplicationWorkspaceService.cs": "89804f852b410b6b5f357ee202ba4d11974f5b795679ef6b6978fb140fb936a5",
"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": "96d7ff93fe8efc5a26d378ca067812beac4c1742a0c58459c3b2899748929549",
"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\\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": "1291602d291df13c445784e3a96e3396392ab7ac45996015527f51dbc1520731",
"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": "95c6a680cb00db945da49f1d454f071688712e8220401327e170cb0442165a7f",
"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": "0d137d140fb5f96c097e4828a446a31cf3290829cb14e2faf4e36dfbd07f3295",
"JobTrackerApi.Tests\\BuildMetadataTests.cs": "ad3b09389071067500a58cdf2c9b0e0806e6225d0f41b1b691f439f6af1cdada",
"JobTrackerApi.Tests\\CareerEvidenceControllerTests.cs": "2621168ce6e0a287d2415da3c22a2348977d2989206e7737ba7de7e7780c7aae",
"JobTrackerApi.Tests\\CareerProfileControllerTests.cs": "05aa1356072a33dac1ebf203e0487164b117b2a3020cc50b8f8f39bdf436e307",
"JobTrackerApi.Tests\\CareerProfileServiceTests.cs": "806ec60b7465eefd46fc7ff548b7ff28f06a0c11dc5e34e815a77229d8bf6b2a",
"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": "ddfd745b81d75dbb01bd6f206c546d231fde22c77b02389c32bb7d780a397cab",
"JobTrackerApi.Tests\\CvBuilderTests.cs": "fca823e4f23319153af2a3d2edaa983db8abadc6f566ae13140eee83ffa6171b",
"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": "31cbe4219ebb035751c1ffb73c975ca579ecb88af0671e117a4c30a997fa60ce",
"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": "5dff6fdf1bf2a3f5e965b211c871ea55044f42c83970f4cd29b0ba310488a946",
"JobTrackerApi.Tests\\JobApplicationsAppliedDateHistoryTests.cs": "a64865b38cc81ebcac9422f83540a3ae172d7ec6a9af2a6771e934f1ef22cf3b",
"JobTrackerApi.Tests\\JobApplicationsAuthorizationTests.cs": "a1513153818a5485b0406791e599c46a1247dcc6e9157d9ae85d0d19f7a81c17",
"JobTrackerApi.Tests\\JobApplicationsControllerTests.cs": "63fa161f4c5c410ace99dc1b48621812ff44bda3be95b3002eaf6bbcadecda17",
"JobTrackerApi.Tests\\JobApplicationsEndpointBehaviorTests.cs": "d5c0c29c7c483cecdf05370289ec0b51694aec3d6d0faed202a59de8335002f1",
"JobTrackerApi.Tests\\JobApplicationsFollowUpDraftTests.cs": "72ebdca92d5e04c67f773171ee41988062c08da44088ba08dd2ec7ebcf7cb855",
"JobTrackerApi.Tests\\JobApplicationsMariaDraftTests.cs": "2b4d0a427b56c229496237cc2492c9ec4fbe2e09a2835ded43db83044a25edaa",
"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": "b49c8490a89f2d980a3f9283e9c7a9f3a28caa5ac7ce14080adda272e8eaeb02",
"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": "f7075de96846e9044f90654b5c0e634d41c846716445d99e4bab26636740748b",
"JobTrackerApi.Tests\\PublicCvControllerTests.cs": "94bbb54fcfce091db453ddb0584f71d9a3f5936232a5c9c460c2692d933c4374",
"JobTrackerApi.Tests\\RateLimitPartitionKeysTests.cs": "578314976674bbba6f5fb28a46f42145fe497a53e9029af5d1308f8540907477",
"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": "be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758",
"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"
}
+19
View File
@@ -0,0 +1,19 @@
# P9-01 connected functional journeys
Execution outcomes are recorded in [ordinary-cases.json](ordinary-cases.json) and [validation](../validation.json); a named test file below describes its actual scope, not an extra pass count. Final full-suite completion is required. No route-only screenshot is treated as a successful mutation journey.
| Journey | Existing exercised sequence / evidence owner | Qualification retained |
|---|---|---|
| Authentication / account | `analytics-auth-repair`, `phase7-authentication`, `phase7-account-security`, `account-isolation`: sign-in return path/query/hash, invalid sign-in, expired cookies, logout, two-tab account switch, own session revoke/failure/retry and identity save/readback without canonical/CV mutation | Local native HTTP and controlled failures; real Turnstile, delivery, authenticator and provider consent are separate |
| Onboarding / navigation | `phase7-onboarding`, `shell-readiness`, `named-controls-modal-state`: missing-versus-failed profile reads, owner-local dismissal, resumed draft, account disposal, keyboard commands and drawer/route focus | Actual reader, physical input, OS/browser variations and historical timing incidents remain |
| Dashboard / analytics | `phase8-dashboard-customisation`, `dashboard-presentation`, `analytics-presentation`: actual report reads, draft cancel/reset/navigation, HTTP/offline failure and recoverable retry, persisted order/size/visibility after fresh browser/logout, explicit stale409 reload and account separation | Bounded datasets; no SLA or alternate-provider capacity claim |
| Jobs / Board / companies / offers | `functional-acceptance`, `board-presentation`, `phase7-companies`, `phase7-offers`, `phase7-discovery`: owned creation/edit/filter/sort/readback, exact200/1000 membership, status movement, partial failure, preserved drafts and local saved-search execution | RD21 stale generic saves FAIL; idempotency, actual NAV freshness, physical drag and calendar DST remain unqualified |
| Workspace / documents | `phase7-application-forms`, `phase7-documents`, `phase7-documents-contract`: held/failed reads, explicit retries, long letter and answers drafts, attach/replace/detach, actual submission capture then source mutation and archived byte identity, metadata source navigation/download, owner logout and second-owner exclusion | Frozen submission is not email delivery; all storage/provider/manual combinations remain |
| Career / import / evidence | `phase7-career-editor`, `phase7-career-import-review`, `phase7-career-source-ids`, `phase7-career-overview`: saved canonical structure/raw/history, stable IDs, review select/deselect/accept/discard, additive restore, source/CV/frozen separation and independent recovery | Real OCR/model quality and long-tail human input remain; RD21 canonical stale writes FAIL |
| CV library / editor / public output | `phase7-cv-library`, `cv-readiness`, `cv-section-scope`, `cv-responsive-workflow`, `phase7-public-cv`: library/template/edit/revision/history/conflict/dirty guard, paginated preview, saved overrides versus canonical inheritance, actual private/public PDF and unpublished/foreign states | Model semantics, intended Linux/fonts/photo/printing and human reader remain |
| Mail / notifications / reminders / operations | `phase7-correspondence-read`, `phase7-correspondence-compose`, `phase7-oauth-sender`, `phase7-notifications`, `phase7-reminders`, `phase7-operations`, `rules-draft-repair`: scoped read failure/retry, draft/conflict/confirmed send/uncertain-attempt guards, read/dismiss, retained rule drafts and operation polling/action guards | Local fixtures and HTTP/SMTP contracts do not prove live mailbox/calendar/worker durability. Initial duplicate reminder GET retained |
| Settings / backup / admin | `phase7-settings-preferences`, `phase7-account-security`, `phase7-admin-users/audit/system`: independent failed resources, explicit save/current-language drafts, actual ZIP byte identity, administrator create/roles and target revocation, ordinary-user403, last-admin409, scoped undo/restore and GET-only diagnostic recovery | No real paid deletion, backup restoration, production maintenance, model benchmark or operational probe executed |
All33 concrete routes are additionally tied to explicit applied-state/read/overflow samples in [QA_MATRIX](../QA_MATRIX.md). The native route census tests ordinary-role/admin/anonymous ownership posture separately from the privileged synthetic screenshot fixture. Admin page rendering is not an authorisation grant. All service/API/sidecar results are distinguished in [P9-04](../p9-04/README.md), [P9-05](../p9-05/README.md) and final regression.
Failure cases deliberately intercept a specific local read/write or transport response; successful saves and ownership checks use local native API where stated by their fixtures. No new integration or external provider call was introduced. The exact per-case titles and raw attachments are retained so reviewers can distinguish intercepted UI recovery from persisted API evidence.
+15
View File
@@ -0,0 +1,15 @@
# P9-02 visual and responsive evidence
The33-route matrix generates396 actual native screenshots:320/768/1440px × English/Bokmål × light/dark. [Route rows](route-results.json) retain applied document language/theme, root width, headings and native read status. [Screenshot index](screenshots.json) identifies full-page originals with SHA256; [contact-sheet index](evidence/index.json) identifies33 overview sheets. Each sheet contains12 first900px crops; it does not show every full-page state.
A separate read-only AI reviewer actually inspected all33 original route sheets (396 thumbnail crops). Full-size followups inspected Admin768NB/light, CV320NB/dark and job-detail320EN. The supposed job-detail clipping was a thumbnail artefact; deliberate horizontal tab/progression scrollers remain. No gross blank/overlap/unusable first-viewport layout was otherwise confirmed in those sheets. This is agent image inspection, not human acceptance or exhaustive glyph/contrast/readability review.
The reviewer confirmed overlapping public-page h2 text in full EN/light and NB/dark320px originals. P9-V01 now sets lineHeight1.4 on the existing four owners. An unchanged native text-rectangle assertion fails on the original and the insufficient1.2 attempt, then passes both language cases over16 width/theme vectors at320/390/768/1440. Independent inspection of final320EN/light and NB/dark full-page screenshot crops confirms the heading separation.
The initial Reminders and Profile matrix captures were loading-only and cannot qualify their body layouts. The matrix now waits for Reminders' settled region and the seeded Profile username. The reviewer inspected the eight corrected320px EN/NB light/dark originals: actual empty-state/forms were visible, with no clipping/overlap identified. Additional final-width inspection must be recorded when actually performed; do not infer it from screenshot generation alone.
Final frozen review actually re-inspected all33 regenerated sheets (396 first900px thumbnail crops), with no new gross overlap/clipping/blank render identified. Nine final full-page originals were additionally inspected: `/`, `/reminders` and `/profile`, each at320EN/light,768NB/light and1440NB/dark. Those root headings are separated and the two private routes show settled content at all three inspected widths. This supplements the earlier inspections; it does not certify every full-page original or all text readability.
Existing ordinary browser fixtures cover populated/empty/loading/error/long-translation states, dialog recovery, dense Jobs/Board, long Career/CV, saved-settings variants and the Dashboard editor. Their exact scope is limited to the executable scenarios; this396-route cross-product is not a cross-product of every state. Intentional grid/document scrollers preserve content; fixed CV paper geometry was not changed to fit the screen.
Real software keyboards, physical touch/drag, actual zoom/text enlargement, alternate browsers, screen readers and professional Bokmål review remain in the [human checklist](../p9-03/MANUAL_CHECKLIST.md). Automated focus/axe/overflow assertions and emulated touch are recorded separately.
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,18 @@
# Human qualification checklist
All entries below start **NOT TESTED**. Browser automation, image inspection by this agent, DOM focus checks and emulated viewports are separate evidence. Record tester, UTC timestamp, OS/browser/assistive-technology versions, application commit, test account, exact steps, result and artifact for each row. Use synthetic records in an approved development environment.
| ID / owner | Reproducible check | Acceptance / closure evidence |
|---|---|---|
| M09-01 / accessibility tester | With NVDA + supported desktop browser, traverse login, Jobs, job details, Career, CV editor, Documents and Settings using headings/landmarks/forms. Repeat equivalent VoiceOver/Safari journeys. | Names, roles, values, selected state, headings, reading order and errors are understandable; retain reader/version and spoken observations. No hidden background content is announced. |
| M09-02 / accessibility tester | Keyboard-only: skip link → navigation → commands → add/edit dialogs → job sections → CV preview/history. Open/close the mobile drawer, confirmation, select and menu repeatedly, including after errors. | Visible focus, logical order, genuine traps only while modal, Escape and focus restoration; no off-screen/hidden tab stops. Record any transition-specific failure. |
| M09-03 / accessibility tester | Dashboard: hide/show, Earlier/Later, size, Cancel, Reset-confirm/cancel, failed Save, stale conflict/reload, saved empty layout recovery. Listen with a reader. | Each action/position/save/error announces once and agrees with visible DOM order; pointer drag has an equivalent keyboard route. |
| M09-04 / accessibility tester | Inspect P9-AX-02/03 backgrounds in light/dark, focused/hover/disabled, open native select, scrolled editor and fixed chrome. Measure actual foreground/background paint. | Applicable normal text ≥4.5:1, large text ≥3:1 and necessary UI boundaries/focus ≥3:1. Record sampled colors/ratios/state. An axe incomplete is not sufficient to close the row. |
| M09-05 / accessibility tester | Inspect zero badges and both open/settled-closed drawer states with the accessibility tree and actual reader. | Invisible zero badge is absent from announcements; live unread count remains meaningful; closed drawer is neither read nor tabbable. Runtime DOM checks cover only the tested states. |
| M09-06 / accessibility tester | Use actual browser 100/200/400% zoom and text-only enlargement, increased text spacing and forced colors across all significant forms, grid pagination, job sections and CV controls. | Essential controls remain reachable/readable, no lost content or focus; distinguish intentional table/document scrollers from root clipping. Preserve fixed A4/Letter geometry. |
| M09-07 / product owner with physical devices | On actual phone/tablet in portrait/landscape, edit long text with software keyboard, open drawers/dialogs/selects, reorder Dashboard and Board via supported alternatives, scroll CV preview and download PDF. | No keyboard-obscured primary action/data loss; reachable touch targets, no accidental destructive action; record device/input mode. Emulated touch does not close this. |
| M09-08 / Bokmål reviewer | Read registration/recovery, validation/errors, onboarding, Dashboard editing, Jobs/Board, Career/import, CV/library, documents/mail, notifications, Settings and Admin in Bokmål. Include long names, singular/plural, dates/numbers and accessible names. | Natural professional Bokmål, consistent established terms, meaningful messages. Separate authored English content, technical names and provider strings from untranslated application copy. |
| M09-09 / document reviewer | Compare preview and downloaded one-/multi-page EN/NB CVs, long words, optional/photo sections and all supported templates on intended Linux/font environment and another supported browser; print representative PDFs. | Legible fonts, intact glyphs/diacritics, margins, page boundaries, searchable text, photo/crop, correct language/date output and no missing/duplicated content. Retain original bytes, renderer/font versions and print observations. |
| M09-10 / approved provider tester | In authorised sandboxes test Google/Microsoft/Turnstile, verification/reset mail delivery, mailbox reconnect/revocation, uncertain send and actual calendar timezone/DST. | Correlated origin/state, explicit confirmation, no accidental resend, correct ownership/timezone. Local SMTP/HTTP fixtures do not close external-provider qualification. |
RD06/RD07/RD10/RD18/RD23/RD25 remain release qualifications until the applicable rows have genuine evidence. P5-13/C11 semantic review has its own withheld process; this checklist does not authorise model activation. Production infrastructure, backup/restore, ingress and rollback require their separate operator gates.
+15
View File
@@ -0,0 +1,15 @@
# P9-03 accessibility and localisation
**PARTIAL.** Automated findings and finite keyboard/DOM observations do not establish human accessibility acceptance.
The inherited 64 incomplete axe occurrences are deduplicated in [triage](inherited-axe-triage.json): one aria-hidden drawer-focus occurrence, 48 native size-control background-overlap occurrences, five other obscured-background occurrences and ten invisible zero-badge occurrences. They are not 64 confirmed violations. Hidden zero badges are not applicable in the tested zero-area, aria-hidden state. The inherited Analytics drawer occurrence remains qualified: fresh shared-drawer settled Dashboard tests do not establish the exact original cause or actual reader behaviour. The53 background-contrast cases require contextual painted-colour inspection. New open-modal background incompletes are separately observed tool/state limits; do not conflate them with the inherited drawer node. Keep original occurrences and stable group IDs.
The settled diagnostic suite explicitly inspects zero badges, keyboard-opened drawer focus, Escape return, closed drawer/descendant visibility and 24 Tab presses, plus Dashboard editor controls. Exact final scans and incompletes are in [settled-axe.json](settled-axe.json) when accepted; failed transition observations remain retained in raw traces. No NVDA, VoiceOver, human reader, physical device, forced-colour or actual browser-zoom acceptance is claimed. [Human checklist](MANUAL_CHECKLIST.md) gives exact steps, owners and closure records.
Final `phase9-frozen` evidence is16 scans with0violations and120 incomplete-node occurrences:100`bgOverlap` (contextual colour inspection still required),16`shortTextContent` (the verified invisible zero badge; not applicable in that state) and4`focusable-modal-open` (background root during the active modal, a state/tool limitation; actual reader/modal behaviour remains M09-01/02/05). Counts are repeated occurrences across states, not120 unique defects. The earlier failed NB observations sampled15 visible descendants after root hiding but before Slide exit; the successor polls the complete unchanged settled predicate and then verifies24Tab presses, with no retries/skips or product drawer change.
The dictionary [comparison](localisation.json) found 2,871 English and 2,871 Bokmål keys, no missing/extra keys and no placeholder mismatch. The 49 identical values are candidates reviewed as technical/proper/established terms, not automatic untranslated-copy defects. Dictionary parity alone does not certify grammar, dates, pluralisation or every rendered state.
P9-L01 fixes the AdminUsers vendor pagination controls by passing the installed MUI nbNO locale; English remains the default. Two parameterized Jest regressions and a visible native desktop pagination assertion cover the actual shared owner. The rendered route scan separately lists candidate exact-English strings; persisted `Created` event types in job/audit metadata remain a Low linguistic residual, not a missing dictionary key. Authored text and provider labels must not be indiscriminately translated. Natural professional Bokmål still needs M09-08 human review.
P9-V01 repairs wrapped public-page h2 spacing at the existing four owners; the original headings inherited a fixed body line height despite larger fonts. Native geometry assertions cover English/Bokmål, both themes and four widths without changing typography tokens or the rendering architecture.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,206 @@
{
"englishKeys": 2871,
"bokmalKeys": 2871,
"missingNb": [],
"extraNb": [],
"placeholderDifferences": [],
"unchangedStrings": [
{
"key": "appTitle",
"value": "Jobbjakt"
},
{
"key": "dashboard",
"value": "Dashboard"
},
{
"key": "documentsType",
"value": "Type"
},
{
"key": "documentsTypeCv",
"value": "CV"
},
{
"key": "documentsFileSize",
"value": "{size} KB"
},
{
"key": "cvTemplateElegantName",
"value": "Elegant"
},
{
"key": "admin",
"value": "Admin"
},
{
"key": "system",
"value": "System"
},
{
"key": "languageNorwegianBokmal",
"value": "Norsk bokmål"
},
{
"key": "landingPlanFree",
"value": "Free"
},
{
"key": "landingPlanPro",
"value": "Pro"
},
{
"key": "emailConnectionsPort",
"value": "Port"
},
{
"key": "intelligenceCategoryAi",
"value": "AI"
},
{
"key": "cvEditorDesign",
"value": "Design"
},
{
"key": "cvEditorZoom",
"value": "Zoom"
},
{
"key": "cvEditorPro",
"value": "Pro"
},
{
"key": "cvEditorUsLetter",
"value": "US Letter"
},
{
"key": "coverAiTone",
"value": "Tone"
},
{
"key": "addJobModalStatus",
"value": "Status"
},
{
"key": "salaryPeriodLabel",
"value": "Per"
},
{
"key": "settingsThemeSystem",
"value": "System"
},
{
"key": "settingsColumnStatus",
"value": "Status"
},
{
"key": "profileCvLinkUrl",
"value": "URL"
},
{
"key": "profileCvContactLinkedIn",
"value": "LinkedIn"
},
{
"key": "profileCvJobStart",
"value": "Start"
},
{
"key": "profileCvEducationStart",
"value": "Start"
},
{
"key": "cropDialogZoom",
"value": "Zoom"
},
{
"key": "dashboardSizeStandard",
"value": "Standard"
},
{
"key": "companiesPipeline",
"value": "Pipeline"
},
{
"key": "adminUsersAdmin",
"value": "Admin"
},
{
"key": "adminSystemOcrEnabled",
"value": "OCR {languages}"
},
{
"key": "adminSystemOs",
"value": "OS"
},
{
"key": "adminSystemPort",
"value": "Port"
},
{
"key": "adminSystemSsl",
"value": "SSL"
},
{
"key": "correspondenceGoogleGmail",
"value": "Google Gmail"
},
{
"key": "correspondenceSearchGmailPlaceholder",
"value": "from:company@example.com OR interview"
},
{
"key": "correspondenceStatus",
"value": "Status"
},
{
"key": "gmailReviewFilter",
"value": "Filter: {value}"
},
{
"key": "adminAuditType",
"value": "Type"
},
{
"key": "adminSystemStatusTab",
"value": "Status"
},
{
"key": "adminSystemDatabase",
"value": "Database"
},
{
"key": "adminSystemSmtp",
"value": "SMTP"
},
{
"key": "google",
"value": "Google"
},
{
"key": "microsoft",
"value": "Microsoft"
},
{
"key": "jobTableStatus",
"value": "Status"
},
{
"key": "savedViewsStatusLabel",
"value": "Status: {value}"
},
{
"key": "jobDetailsNotAvailable",
"value": "—"
},
{
"key": "jobDetailsMatchPercent",
"value": "{count}% match"
},
{
"key": "workspaceCv",
"value": "CV"
}
],
"limitation": "Dictionary/placeholder parity is static evidence. Equal strings can be proper names or technical words. Human Bokmal review and provider-generated/server messages remain separate."
}
@@ -0,0 +1,27 @@
import fs from 'node:fs';
import path from 'node:path';
import vm from 'node:vm';
import assert from 'node:assert/strict';
import ts from '../../../../job-tracker-ui/node_modules/typescript/lib/typescript.js';
import { fileURLToPath } from 'node:url';
const here = path.dirname(fileURLToPath(import.meta.url));
const root = path.resolve(here, '../../../..');
const source = fs.readFileSync(path.join(root, 'job-tracker-ui/src/i18n/translations.ts'), 'utf8');
const compiled = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS } }).outputText;
const sandbox = { exports: {} };
vm.runInNewContext(compiled, sandbox);
const { en, nb } = sandbox.exports.translations;
const placeholders = value => [...new Set(value.match(/\{\w+\}/g) ?? [])].sort();
assert.deepEqual(placeholders('A {count} and {name} {count}'), ['{count}', '{name}']);
const missingNb = Object.keys(en).filter(key => !(key in nb));
const extraNb = Object.keys(nb).filter(key => !(key in en));
const placeholderDifferences = Object.keys(en).filter(key => key in nb && JSON.stringify(placeholders(en[key])) !== JSON.stringify(placeholders(nb[key])));
const unchangedStrings = Object.keys(en).filter(key => en[key] === nb[key]).map(key => ({ key, value: en[key] }));
const report = { englishKeys: Object.keys(en).length, bokmalKeys: Object.keys(nb).length, missingNb, extraNb, placeholderDifferences, unchangedStrings,
limitation: 'Dictionary/placeholder parity is static evidence. Equal strings can be proper names or technical words. Human Bokmal review and provider-generated/server messages remain separate.' };
fs.writeFileSync(path.join(here, 'localisation.json'), JSON.stringify(report, null, 2) + '\n');
assert.deepEqual(missingNb, []);
assert.deepEqual(extraNb, []);
assert.deepEqual(placeholderDifferences, []);
console.log(JSON.stringify({ ...report, unchangedStrings: unchangedStrings.length }));
File diff suppressed because it is too large Load Diff
+43
View File
@@ -0,0 +1,43 @@
"""Account for every inherited axe node without upgrading manual requirements."""
from collections import Counter, defaultdict
import json
from pathlib import Path
HERE = Path(__file__).resolve().parent
ROOT = HERE.parents[3]
source = ROOT / 'docs/redesign/phase-8/p8-05/evidence/axe.json'
data = json.loads(source.read_text(encoding='utf-8'))
groups = defaultdict(list)
for scan in data['scans']:
for rule in scan['incomplete']:
for node in rule['nodes']:
checks = node.get('any', []) + node.get('all', []) + node.get('none', [])
keys = sorted(set((check.get('data') or {}).get('messageKey', check['id']) for check in checks))
component = 'dashboard size selector' if '<select' in node['html'] else 'hidden badge' if 'MuiBadge-invisible' in node['html'] else 'drawer/focus' if rule['id'] == 'aria-hidden-focus' else 'text/control with obscured background'
groups[(rule['id'], ', '.join(keys), component)].append(dict(scan=scan['name'], target=node['target'], html=node['html'], checks=checks))
counts = Counter(rule for (rule, _, _), nodes in groups.items() for node in nodes)
assert sum(counts.values()) == 64, counts
assert counts == {'color-contrast': 63, 'aria-hidden-focus': 1}, counts
rows = []
settled_path = HERE / 'settled-axe.json'
settled = json.loads(settled_path.read_text(encoding='utf-8')) if settled_path.exists() else []
if settled:
assert len(settled) == 4 and sum(len(row['scans']) for row in settled) == 16
assert not any(scan['violations'] for row in settled for scan in row['scans'])
assert all(node['ariaHidden'] == 'true' and node['width'] * node['height'] == 0 for row in settled for node in row['badge'])
assert all(node['ariaHidden'] == 'true' and node['visibility'] == 'hidden' and not node['containsActive'] and node['visibleTabbables'] == 0 for row in settled for node in row['hiddenDrawer'])
for index, ((rule, reason, component), nodes) in enumerate(sorted(groups.items()), 1):
# Source evidence identifies an automated measurement limit; it does not prove visible contrast/focus compliance.
classification = 'Not applicable to invisible zero badge, subject to settled visibility verification' if component == 'hidden badge' else 'Requires manual inspection'
current = 'Requires manual inspection'
evidence = 'Contextual foreground/background measurement remains required.'
if component == 'hidden badge' and settled:
current = 'Not applicable in tested settled hidden state'
evidence = 'Four current native EN/NB theme vectors: aria-hidden=true and zero area. Actual reader/live unread-state remains separate.'
elif component == 'drawer/focus' and settled:
evidence = 'Shared Dashboard drawer settled predicate, Escape focus and24Tab proof pass. Original Analytics transition cause is not proven; human reader/transition qualification remains.'
rows.append(dict(id=f'P9-AX-{index:02}', rule=rule, reason=reason, component=component, occurrences=len(nodes), classification=classification, phase9Disposition=current, closureEvidence=evidence, observations=nodes))
report = dict(source=str(source.relative_to(ROOT)), total=64, counts=counts, groups=rows,
conclusion='Original observations retained. Ten hidden-badge occurrences are not applicable in the verified current hidden state;53 background cases and the original drawer transition remain human qualifications. Current settled runtime evidence is separate from original-cause proof.')
(HERE / 'inherited-axe-triage.json').write_text(json.dumps(report, indent=2, ensure_ascii=False) + '\n', encoding='utf-8')
print(json.dumps([{k: v for k, v in row.items() if k != 'observations'} for row in rows], ensure_ascii=False, indent=2))
@@ -0,0 +1,31 @@
# RD21 — Protect canonical Career and generic job edits from stale overwrites
**Severity: High. Status: reproduced / unresolved. Safety qualification: FAIL.** This is an existing risk carried from Phase 7, now reproduced with two independently authenticated local clients on isolated synthetic SQLite. The characterization test passing means the observations were captured; it does not mean writes are safe.
## Exact reproduction
1. Both clients read the same saved Career Profile, whose summary is “Initial summary”.
2. A changes the summary to “First editor committed summary” and receives 200.
3. B changes a different field in its old snapshot and submits it. B receives 200; a fresh read now contains “Initial summary”. A's acknowledged edit is lost.
4. Repeat with a saved job. A changes the title to “First editor committed title”. B changes notes in its stale full snapshot and receives 204. Readback restores “Original job title”.
Fresh [native evidence](rd21.json) records exact statuses/values. Reproducer: [data.spec.ts](../p9-05/diagnostics/data.spec.ts), retained under the 18-case Phase 9 diagnostic lane. Ownership is the same account in both clients; this demonstrates stale-write loss, not a cross-account disclosure. Existing foreign-account protections and CV/Dashboard revision tests remain separate.
## Responsible boundary and dependency
The existing `CareerProfileController.Put` and `CareerProfileService` save the current submitted profile without a caller-supplied revision comparison. The generic `JobApplicationsController` PUT likewise applies an old complete snapshot without a complete expected-version contract. `UpdatedAtUtc` by itself is not an atomic precondition. Do not copy the Dashboard version shape into unrelated domains without deciding the actual contract.
This is a cross-caller API/data contract change. The Phase 9 brief requires major architectural/contract work to become a separate issue. No partial client-only workaround, arbitrary retry, silent merge, data rewrite or weakening of existing assertions is included in QA.
Owner: backend/domain owner with the Career and Jobs frontend owners. Separate work must inventory canonical import/history/restoration, job forms/bulk/workspace/extension/automation callers and legacy API consumers; define compatibility, version creation, atomic conditional write and conflict semantics; retain canonical/CV/frozen document boundaries; and preserve recoverable drafts when rejected. The Career write and later Identity completion also need explicit transaction/partial-failure behavior.
## Required closure evidence
- Concurrent independent clients editing different and same fields cannot silently overwrite an acknowledged save.
- Actual owner-and-revision preconditions on the database write; simultaneous submissions and first saves are covered.
- SQLite and supported MariaDB runtime evidence, including constraints, held readers/writers and partial failure.
- Conflicts preserve drafts and offer explicit current-data review/reload; account switch and stale session fail closed.
- Imports, history restores, generic job updates, lifecycle/bulk operations and old callers follow the agreed compatibility contract.
- Complete affected regression, frozen document byte preservation and no unrelated Identity replay.
Creation-intent idempotency is another retained RD21 concern; these stale-write observations do not claim to test or solve it. Production and unqualified data-integrity acceptance remain withheld. Phase 10 must not remove compatibility paths while this contract is unresolved.
+15
View File
@@ -0,0 +1,15 @@
# P9-04 — Data integrity, providers and security
**PARTIAL overall; RD21 stale-write safety FAIL; MariaDB runtime NOT TESTED.** These dispositions are independent from passing security guards and CV/Dashboard revision contracts.
The complete backend run passed **1,084/1,084**, no failures/skips, on unchanged backend source. [Exact per-case results](../p9-00/backend-cases.json) retain migration-chain/startup/schema ownership, SQLite WAL/held-reader/parallel writes, dashboard owner-and-revision comparisons, unsafe/future-schema/body-limit guards, CV revision/restore, account isolation, session revocation/context/CSRF, admin/last-admin/self guards, document ownership, attachment validation, import URL/transport protections, account export/deletion and sidecar admission contracts. Test-host authentication and SQLite are identified as such; test names do not certify a deployed endpoint.
The 33-route native identity census and separate AI, auth-recovery, rate-limit, ingress and PDF admission lanes belong to the final regression record. Their actual completed counts, rather than expected baseline totals, determine acceptance. Ordinary browser cookies/session context/CSRF exercise local HTTP; local SMTP and inert PDF/AI fixtures are not external-provider/model/native-output acceptance.
The new two-client [RD21 observation](rd21.json) reproduces loss of acknowledged Career and generic job edits. Both stale requests are accepted (200/204) and restore old fields. [Separate issue and exact reproduction](RD21_CONCURRENCY_ISSUE.md) define affected callers and closure proof. CV/Dashboard conflict rejection does not close this. Creation-intent idempotency and the canonical-write/later-Identity partial-commit concern remain separate uncompleted requirements.
Provider availability was checked without installing/restarting services: Docker fails to connect to `dockerDesktopLinuxEngine`; `mariadbd`/`mysqld` are absent from PATH. The existing MariaDB SQL-generation case passes, but no MariaDB server ran. Actual provider startup/migrations/CRUD/constraints/concurrency/restart therefore remain NOT TESTED. No live database, production migration, schema cutover or destructive reset was used.
Offline security gates passed: tracked-secret scan, supply-chain helpers 3, Ollama evaluation helpers 5, browser-runtime helpers 6, ingress helpers 3, Node dependency-policy/SMTP contracts 15 and extension URL contracts 3; SBOM generated from the lockfiles. Exact command exit codes/log hashes are retained in `validation.json` / `.artifacts/phase9/offline.json`. These are bounded tests/static checks, not a penetration-test or blanket security certification.
No manifests, lockfiles, database models/migrations, auth grants, upload limits or inference configuration changed. Live advisories, real provider grants/delivery, enabled-worker recovery, deployment ingress, retention policy, restore/rollback and actual release identity remain [open gates](../RISKS.md). No live external content or model inference was fetched to replace missing evidence.
+21
View File
@@ -0,0 +1,21 @@
{
"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."
}
+27
View File
@@ -0,0 +1,27 @@
# P9-05 — Documents, edge cases and finite performance
The final separate Phase9 diagnostic lane completed **18/18**, zero failures/skips/flaky/retries, on the frozen825-input manifest (`phase9-frozen`, exit0 at20:25:16UTC). It includes12 route/theme/locale/width cases, four settled accessibility cases, one RD21 characterization and one bounded workload. **A passing characterization does not qualify the unsafe behavior it records.** The earlier18-case run and the later16pass/2fail transition observation remain superseded raw evidence.
That diagnostic snapshot is retained as [source-manifest-before-admin-fixture.json](../p9-00/source-manifest-before-admin-fixture.json). The final ordinary-run snapshot changes only the locale-sensitive Admin test locator; [exact delta](../p9-00/admin-fixture-delta.json) proves product/build/diagnostic/core inputs are unchanged. No diagnostic result is claimed to execute an ordinary fixture it does not load.
## Native documents
Fresh real preview and native exported PDF bytes from the retained corpus passed **16/16 fixtures /36 pages** under the unchanged oracle: exact page count/membership, physical dimensions ±0.5mm, marker positions ±2mm, font sizes ±0.5pt and original RGB tolerance. Nine defaults, long EN/NB, 8mm Letter, 28mm roomy, grid/bubbles, long sidebar and unbreakable boundary fixtures are included. No renderer geometry or tolerance changed.
[Portable oracle results](evidence/fidelity-results.json) retain all measurements. The final frozen ordinary run's native corpus producer passed; the unchanged oracle again passed16/16 over its fresh36 pages. All36 regenerated page thumbnails were actually inspected in [sheet1](evidence/pdf-sheet-1.png), [sheet2](evidence/pdf-sheet-2.png) and [sheet3](evidence/pdf-sheet-3.png), plus the full-size preview/PDF `unbreakable-and-boundary/comparison-4.png`. Inspection found no visible clipping/overlap/blank output in those views. Several last pages contain little content; that is recorded layout behavior, not missing text according to the marker oracle. Thumbnail/spot inspection is not print/readability, photo/crop, every glyph or intended Linux-font acceptance. Whole-suite completion remains a separate gate.
Existing browser fixtures also cover hidden preview mounting, image-layout readiness, dirty edits, stale CV revisions, preview transport recovery, canonical versus variant overrides, frozen submitted packages/archived binaries and missing optional sections. Their full-suite outcomes belong to final regression. Native PDF admission uses inert child processes and is not added to fidelity counts.
The separate Settings corpus passed the same unchanged oracle over **8 fixtures /24 pages**: EN/NB × light/dark, before and after actual document-control changes. All24 page thumbnails were inspected in [Settings sheet1](evidence/settings-pdf-sheet-1.png) and [sheet2](evidence/settings-pdf-sheet-2.png); a full-size light-EN before preview/PDF comparison was also inspected. No visible clipping/overlap/blank output was found in those views. [Measured results](evidence/settings-fidelity-results.json) retain the before/after page dimensions, marker/font/colour agreement. These are separate24 pages, not extra fixtures in the16/36 baseline corpus, and do not close human/Linux/print requirements.
## Sustained local workload
[Raw finite measurements](performance.json): **65.303s**, two paced readers, **240 successful reads**, 250 owned applications, eight Career roles with48 distinct long bullets, and20 native navigations across Dashboard/Table/Board/long CV. The same saved canonical profile and250-job membership remained intact afterward. CV readiness waits for settled pagination and verifies the final bullet's page membership and multiple rendered pages before recording timing.
API latency across these reads: **p50 23ms /p95 76ms /max115ms**. Native ready times in this run: Dashboard1377–1728ms; Table995–1249ms; Board1530–2238ms; long CV2038–2310ms. These include browser boot/auth/render work and automation overhead. The host reports Windows,16 logical CPUs,34,145,554,432 bytes RAM and Chromium151.0.7922.34; API uses isolated SQLite and frontend uses the rebuilt static export. This is a shared development host; final Jest overlapped most diagnostic collection and completed during the sustained case. Timing is not an isolated machine comparison.
CDP CPU/task/heap/DOM metrics are retained for every navigation. They are observations, not leak diagnosis or attributed backend resource profiling. Two paced readers for a minute do not establish capacity/SLA, sustained drag frames, physical mobile performance, long-term memory stability, MariaDB/Linux behavior or real model inference throughput. No production load was generated.
Retained ordinary fixtures extend edge-case coverage to no-data,1,000-job Board membership/filtering, long timelines/profiles, revision conflicts, stale sessions, HTTP/network failures, missing/foreign references and recoverable drafts. Remaining worker durability, creation idempotency and high RD21 stale writes are explicit risks. No synthetic data was loaded into production.
A separately isolated [volume supplement](volume/README.md) adds3 passing native API cases:100 CV revisions plus additive restore101,100 long manual timeline messages with exact membership and foreign-owner denial, and100 cancellation notices with bounded listing/read/dismissal counts. Its source hashes and results are separate from the825-input ordinary-run snapshot. This establishes finite persisted membership/count/revision behavior, not large-history browser capacity.
@@ -0,0 +1,74 @@
import { test, expect } from '../../../../../job-tracker-ui/node_modules/@playwright/test';
import AxeBuilder from '../../../../../job-tracker-ui/node_modules/@axe-core/playwright';
import { translations } from '../../../../../job-tracker-ui/src/i18n/translations';
const api = 'http://localhost:5302/api';
for (const language of ['en', 'nb'] as const) for (const theme of ['light', 'dark'] as const) {
test(`P9 settled badge drawer and editor triage ${language} ${theme}`, async ({ page, context, playwright }, info) => {
test.setTimeout(120000);
const t = translations[language];
await page.setViewportSize({ width: 320, height: 900 });
await page.emulateMedia({ reducedMotion: 'reduce' });
await context.addInitScript(({ language, theme }) => {
localStorage.setItem('uiLanguage', language); localStorage.setItem('jobtracker.themeMode', theme);
}, { language, theme });
await context.route('**/*', route => {
const url = new URL(route.request().url());
return ['localhost', '127.0.0.1'].includes(url.hostname) || ['data:', 'blob:', 'about:'].includes(url.protocol) ? route.continue() : route.abort();
});
const admin = await playwright.request.newContext();
try {
const password = 'E2ePassword123!';
expect((await admin.post(`${api}/auth/login`, { data: { email: 'e2e@example.test', password } })).status()).toBe(200);
const adminMe = await (await admin.get(`${api}/auth/me`)).json();
const csrf = (await admin.storageState()).cookies.find(cookie => cookie.name === 'XSRF-TOKEN')!.value;
const email = `p9-axe-${language}-${theme}-${Date.now()}@example.test`;
expect((await admin.post(`${api}/users`, { headers: { 'X-CSRF-TOKEN': csrf, 'X-Session-Context': adminMe.sessionContext }, data: { email, password, roles: [] } })).status()).toBe(200);
expect((await page.request.post(`${api}/auth/login`, { data: { email, password } })).status()).toBe(200);
const me = await (await page.request.get(`${api}/auth/me`)).json();
const ownerCsrf = (await page.request.storageState()).cookies.find(cookie => cookie.name === 'XSRF-TOKEN')!.value;
expect((await page.request.put(`${api}/auth/preferences/language`, { headers: { 'X-CSRF-TOKEN': ownerCsrf, 'X-Session-Context': me.sessionContext }, data: { language: language === 'nb' ? 'nb-NO' : 'en' } })).status()).toBe(204);
await page.goto('/dashboard');
await expect(page.getByRole('button', { name: t.dashboardCustomize, exact: true })).toBeVisible();
const badge = await page.locator('.MuiBadge-invisible').evaluateAll(nodes => nodes.map(node => ({
ariaHidden: node.getAttribute('aria-hidden'), text: node.textContent, width: node.getBoundingClientRect().width,
height: node.getBoundingClientRect().height, visibility: getComputedStyle(node).visibility, transform: getComputedStyle(node).transform })));
expect(badge.length).toBeGreaterThan(0);
expect(badge.every(node => node.ariaHidden === 'true' && node.width * node.height === 0)).toBe(true);
const scans: object[] = [];
const scan = async (state: string) => {
const result = await new AxeBuilder({ page }).withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa']).analyze();
scans.push({ state, violations: result.violations, incomplete: result.incomplete });
expect.soft(result.violations, state).toEqual([]);
};
await scan('dashboard-settled');
const trigger = page.getByRole('button', { name: t.openNavigation, exact: true });
await trigger.focus(); await trigger.press('Enter');
const drawer = page.getByRole('dialog', { name: t.navigation, exact: true });
await expect(drawer.getByRole('button', { name: t.dashboard, exact: true })).toBeFocused();
await scan('drawer-open');
await page.keyboard.press('Escape');
await expect(drawer).not.toBeVisible(); await expect(trigger).toBeFocused();
// Backdrop/root exit can precede Slide exit; await the complete settled predicate.
const inspectDrawer = () => page.locator('.MuiDrawer-modal').evaluateAll(nodes => nodes.map(node => ({
ariaHidden: node.getAttribute('aria-hidden'), visibility: getComputedStyle(node).visibility,
containsActive: node.contains(document.activeElement),
visibleTabbables: [...node.querySelectorAll('[tabindex="0"],button,a[href],input,select')].filter(element => getComputedStyle(element).visibility !== 'hidden' && element.getClientRects().length > 0).length })));
const drawerAfterEscape = await inspectDrawer();
await expect.poll(async () => (await inspectDrawer()).every(node => node.ariaHidden === 'true' && node.visibility === 'hidden' && !node.containsActive && node.visibleTabbables === 0)).toBe(true);
const hiddenDrawer = await inspectDrawer();
expect(hiddenDrawer.every(node => node.ariaHidden === 'true' && !node.containsActive && node.visibleTabbables === 0)).toBe(true);
for (let index = 0; index < 24; index++) {
await page.keyboard.press('Tab');
expect(await page.evaluate(() => !!document.activeElement?.closest('.MuiDrawer-modal[aria-hidden="true"]'))).toBe(false);
}
await scan('drawer-closed-settled');
await page.getByRole('button', { name: t.dashboardCustomize, exact: true }).click();
const editor = page.getByRole('region', { name: t.dashboardEditing, exact: true });
await expect(editor.getByRole('combobox')).toHaveCount(9);
await scan('editor-settled');
await info.attach('phase9-settled-axe', { body: JSON.stringify({ language, theme, badge, drawerAfterEscape, hiddenDrawer, scans,
limits: 'Finite native DOM/keyboard evidence; remaining overlapping background contrast and actual screen-reader perception still require human assessment.' }, null, 2), contentType: 'application/json' });
} finally { await admin.dispose(); }
});
}
@@ -0,0 +1,49 @@
import { test, expect, type APIRequestContext } from '../../../../../job-tracker-ui/node_modules/@playwright/test';
const api = 'http://localhost:5302/api';
const password = 'E2ePassword123!';
async function login(request: APIRequestContext, email: string) {
expect((await request.post(`${api}/auth/login`, { data: { email, password } })).status()).toBe(200);
const me = await (await request.get(`${api}/auth/me`)).json();
const csrf = (await request.storageState()).cookies.find(cookie => cookie.name === 'XSRF-TOKEN')!.value;
return { 'X-CSRF-TOKEN': csrf, 'X-Session-Context': me.sessionContext as string };
}
test('P9 characterize retained RD21 stale writes separately from CV revision safety', async ({ playwright }, info) => {
const admin = await playwright.request.newContext();
const first = await playwright.request.newContext();
const second = await playwright.request.newContext();
try {
const adminHeaders = await login(admin, 'e2e@example.test');
const email = `p9-stale-${Date.now()}@example.test`;
expect((await admin.post(`${api}/users`, { headers: adminHeaders, data: { email, password, roles: [] } })).status()).toBe(200);
const a = await login(first, email); const b = await login(second, email);
const submitted = { version: '1', contact: { fullName: 'Synthetic concurrent owner' }, summary: ['Initial summary'] };
expect((await first.put(`${api}/career/profile`, { headers: a, data: { profile: submitted } })).status()).toBe(200);
const careerA = (await (await first.get(`${api}/career/profile`)).json()).profile;
const careerB = (await (await second.get(`${api}/career/profile`)).json()).profile;
careerA.summary = ['First editor committed summary']; careerB.contact.headline = 'Second editor headline';
expect((await first.put(`${api}/career/profile`, { headers: a, data: { profile: careerA } })).status()).toBe(200);
const staleCareer = await second.put(`${api}/career/profile`, { headers: b, data: { profile: careerB } });
expect([200, 409]).toContain(staleCareer.status());
const careerAfter = (await (await first.get(`${api}/career/profile`)).json()).profile;
const company = await first.post(`${api}/companies`, { headers: a, data: { name: 'Synthetic stale job fixture' } });
expect(company.status()).toBe(201);
const created = await first.post(`${api}/jobapplications`, { headers: a, data: { companyId: (await company.json()).id, jobTitle: 'Original job title', status: 'Saved' } });
expect(created.status()).toBe(201); const jobId = (await created.json()).id;
const jobA = await (await first.get(`${api}/jobapplications/${jobId}`)).json();
const jobB = await (await second.get(`${api}/jobapplications/${jobId}`)).json();
jobA.jobTitle = 'First editor committed title'; jobB.notes = 'Second editor notes';
expect([200, 204]).toContain((await first.put(`${api}/jobapplications/${jobId}`, { headers: a, data: jobA })).status());
const staleJob = await second.put(`${api}/jobapplications/${jobId}`, { headers: b, data: jobB });
expect([200, 204, 409]).toContain(staleJob.status());
const jobAfter = await (await first.get(`${api}/jobapplications/${jobId}`)).json();
const careerLostFirstEdit = careerAfter.summary[0] !== careerA.summary[0];
const jobLostFirstEdit = jobAfter.jobTitle !== jobA.jobTitle;
await info.attach('phase9-rd21-characterization', { body: JSON.stringify({ id: 'RD21',
career: { staleStatus: staleCareer.status(), expectedFirstSummary: careerA.summary, actualSummary: careerAfter.summary, lostFirstEdit: careerLostFirstEdit },
job: { staleStatus: staleJob.status(), expectedFirstTitle: jobA.jobTitle, actualTitle: jobAfter.jobTitle, lostFirstEdit: jobLostFirstEdit },
safetyQualification: careerLostFirstEdit || jobLostFirstEdit ? 'FAIL: stale writes can overwrite acknowledged edits' : 'Finite scenario retained prior 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.' }, null, 2), contentType: 'application/json' });
} finally { await second.dispose(); await first.dispose(); await admin.dispose(); }
});
@@ -0,0 +1,121 @@
import { test, expect, type APIRequestContext } from '../../../../../job-tracker-ui/node_modules/@playwright/test';
import { translations, type TranslationKey } from '../../../../../job-tracker-ui/src/i18n/translations';
import fs from 'node:fs/promises';
import path from 'node:path';
const api = 'http://localhost:5302/api';
const password = 'E2ePassword123!';
async function login(request: APIRequestContext, email: string) {
expect((await request.post(`${api}/auth/login`, { data: { email, password } })).status()).toBe(200);
const me = await (await request.get(`${api}/auth/me`)).json();
const csrf = (await request.storageState()).cookies.find(cookie => cookie.name === 'XSRF-TOKEN')!.value;
return { 'X-CSRF-TOKEN': csrf, 'X-Session-Context': me.sessionContext as string };
}
const publicRoutes: [string, TranslationKey | null][] = [
['/', null], ['/login', 'signInTitle'], ['/register', 'createAccount'],
['/forgot-password', 'forgotPasswordTitle'], ['/reset-password', 'resetPasswordTitle'],
['/verify-email', 'verifyEmailTitle'], ['/confirm-email-change', 'confirmEmailChangeTitle'],
['/microsoft-legacy-relink', 'microsoftLegacyRelinkTitle'], ['/cv/:slug', 'publicCvTitle'],
];
const privateRoutes: [string, TranslationKey, string][] = [
['/dashboard', 'dashboard', '/jobapplications/stats'], ['/analytics', 'analytics', '/jobapplications/stats'],
['/discover', 'discoverJobs', '/job-discovery/saved-searches'], ['/jobs', 'jobApplications', '/jobapplications'],
['/jobs/:id', 'jobDetails', '/jobapplications/:id/workspace'], ['/reminders', 'reminders', '/jobapplications/reminders'],
['/operations', 'operations', '/operations'], ['/kanban', 'jobApplications', '/jobapplications/board'],
['/companies', 'companies', '/companies'], ['/offers', 'offerComparisonTitle', '/jobapplications'],
['/correspondence', 'correspondenceInboxTitle', '/correspondence/page'],
['/correspondence/review', 'correspondenceInboxTitle', '/gmail/review-candidates'],
['/profile', 'profile', '/auth/me'], ['/applications/:id', 'jobDetails', '/jobapplications/:id/workspace'],
['/career', 'careerWorkspace', '/career/profile'], ['/career/builder', 'cvBuilder', '/cv/variants'],
['/career/builder/:id', 'cvBuilder', '/cv/variants/:cv'], ['/documents', 'documentsTitle', '/documents'],
['/admin/audit', 'auditLog', '/admin/audit'], ['/admin/users', 'users', '/users'],
['/admin/system', 'systemStatus', '/admin/system'], ['/trash', 'trash', '/jobapplications'],
['/settings', 'settings', '/notification-settings'], ['/settings/connected-accounts', 'connectedAccounts', '/gmail/status'],
];
for (const width of [320, 768, 1440]) for (const language of ['en', 'nb'] as const) for (const theme of ['light', 'dark'] as const) {
test(`P9 all 33 routes ${width} ${language} ${theme}`, async ({ page, context, playwright }, info) => {
test.setTimeout(360000);
const t = translations[language];
const census = JSON.parse(await fs.readFile(path.resolve(__dirname, '../../p9-00/inventory.json'), 'utf8'));
expect([...publicRoutes.map(row => row[0]), ...privateRoutes.map(row => row[0])].sort()).toEqual(Object.keys(census.routes).sort());
await page.setViewportSize({ width, height: 900 });
await context.addInitScript(({ language, theme }) => {
localStorage.setItem('uiLanguage', language);
localStorage.setItem('jobtracker.themeMode', theme);
}, { language, theme });
await context.route('**/*', route => {
const url = new URL(route.request().url());
return ['localhost', '127.0.0.1'].includes(url.hostname) || ['data:', 'blob:', 'about:'].includes(url.protocol) ? route.continue() : route.abort();
});
const samples: object[] = [];
const capture = async (pattern: string, index: number, status?: number) => {
await page.evaluate(async () => { await document.fonts.ready; await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve))); });
const state = await page.evaluate(() => ({ width: innerWidth, scrollWidth: document.documentElement.scrollWidth,
title: document.title, headings: [...document.querySelectorAll('h1')].map(node => node.textContent),
lang: document.documentElement.lang, effectiveTheme: document.documentElement.getAttribute('data-color-scheme'),
bodyText: document.body.innerText, domElements: document.querySelectorAll('*').length }));
const visibleLines = new Set(state.bodyText.split('\n').map(line => line.trim()));
const englishLeakCandidates = language === 'nb' ? Object.entries(translations.en)
.filter(([key, value]) => value.length > 6 && translations.nb[key as TranslationKey] !== value && visibleLines.has(value))
.map(([key, value]) => ({ key, value })) : [];
samples.push({ pattern, viewport: width, language, theme, status, ...state, englishLeakCandidates });
expect.soft(state.effectiveTheme, `${pattern} applied theme`).toBe(theme);
expect.soft(state.lang, `${pattern} applied locale`).toBe(language === 'nb' ? 'nb-NO' : 'en');
expect.soft(state.scrollWidth, `${pattern} root overflow`).toBeLessThanOrEqual(width + 1);
expect.soft(state.bodyText, `${pattern} raw translation key`).not.toMatch(/\b(?:dashboardCustomize|documentsPageSubtitle|careerWorkspaceSubtitle)\b/);
const screenshot = info.outputPath(`route-${String(index).padStart(2, '0')}-${width}-${language}-${theme}.png`);
await page.screenshot({ path: screenshot, fullPage: true, animations: 'disabled' });
await info.attach(`route-${index}-${pattern}`, { path: screenshot, contentType: 'image/png' });
};
const admin = await playwright.request.newContext();
let createdId: string | undefined;
let adminHeaders: Record<string, string> | undefined;
try {
for (const [index, [pattern, key]] of publicRoutes.entries()) {
await page.goto(pattern.replace(':slug', 'phase9-unpublished'));
if (key) await expect(page.getByRole('heading', { name: t[key], exact: true })).toBeVisible();
else await expect(page.getByRole('heading', { level: 1 }).first()).toBeVisible();
if (pattern === '/cv/:slug') await expect(page.getByText(t.publicCvUnavailableBody, { exact: true })).toBeVisible();
await capture(pattern, index);
}
adminHeaders = await login(admin, 'e2e@example.test');
const email = `phase9-matrix-${width}-${language}-${theme}-${Date.now()}@example.test`;
const created = await admin.post(`${api}/users`, { headers: adminHeaders, data: { email, password, roles: ['Admin'] } });
expect(created.status()).toBe(200); createdId = (await created.json()).id;
const headers = await login(page.request, email);
expect((await page.request.put(`${api}/auth/preferences/language`, { headers, data: { language: language === 'nb' ? 'nb-NO' : 'en' } })).status()).toBe(204);
const company = await page.request.post(`${api}/companies`, { headers, data: { name: 'Phase 9 — Nordlys dokumenterte arbeidsflyter æøå' } });
expect(company.status()).toBe(201);
const job = await page.request.post(`${api}/jobapplications`, { headers, data: { companyId: (await company.json()).id, jobTitle: 'Phase 9 reliable workflow engineer — dokumentert erfaring', status: 'Saved' } });
expect(job.status()).toBe(201); const jobId = (await job.json()).id;
const cv = await page.request.post(`${api}/cv/variants`, { headers, data: { name: 'Phase 9 synthetic CV' } });
expect(cv.status()).toBe(200); const cvId = (await cv.json()).id;
for (const [index, [pattern, key, endpoint]] of privateRoutes.entries()) {
const url = pattern.replace(':id', pattern.startsWith('/career/builder/') ? String(cvId) : String(jobId));
const apiPath = `/api${endpoint.replace(':id', String(jobId)).replace(':cv', String(cvId))}`;
const response = page.waitForResponse(response => new URL(response.url()).pathname === apiPath && response.request().method() === 'GET');
await page.goto(url);
const status = (await response).status();
expect.soft(status, pattern).toBe(pattern === '/correspondence/review' ? 409 : 200);
await expect(page.getByRole('heading', { level: 1, name: t[key], exact: true })).toBeVisible();
if (pattern === '/career/builder/:id') {
if (width < 900) await page.getByRole('button', { name: t.cvEditorPreview, exact: true }).click();
await expect(page.getByRole('region', { name: t.cvEditorLivePreview, exact: true })).toHaveAttribute('aria-busy', 'false');
await expect(page.getByTitle(t.cvEditorPreviewPage.replace('{page}', '1'), { exact: true })).toBeVisible();
}
if (pattern === '/dashboard') await expect(page.locator('[data-dashboard-widget]')).toHaveCount(9);
if (pattern === '/reminders') await expect(page.getByRole('region', { name: t.remindersTitle, exact: true })).toHaveAttribute('aria-busy', 'false');
if (pattern === '/profile') await expect(page.getByLabel(t.profileUsername, { exact: true })).toHaveValue(email);
if (pattern === '/admin/users' && width >= 768) await expect(page.getByText(language === 'nb' ? 'Rader per side:' : 'Rows per page:', { exact: true })).toBeVisible();
await capture(pattern, index + publicRoutes.length, status);
}
} finally {
await info.attach('phase9-route-matrix', { body: JSON.stringify({ width, language, theme, samples,
limits: 'Screenshots and DOM evidence; actual visual review must be recorded separately. No provider/device/human linguistic acceptance.' }, null, 2), contentType: 'application/json' });
if (createdId) expect((await admin.put(`${api}/users/${createdId}/roles`, { headers: adminHeaders, data: { roles: [] } })).status()).toBe(204);
await admin.dispose();
}
});
}
@@ -0,0 +1,8 @@
import { defineConfig } from '../../../../../job-tracker-ui/node_modules/@playwright/test';
import base from '../../../../../job-tracker-ui/playwright.config';
import path from 'node:path';
const cwd = path.resolve(__dirname, '../../../../../job-tracker-ui');
const servers = Array.isArray(base.webServer) ? base.webServer : [base.webServer!];
export default defineConfig({ ...base, testDir: __dirname, testMatch: '*.spec.ts',
webServer: servers.map(server => ({ ...server, cwd })) });
@@ -0,0 +1,99 @@
import { test, expect, type APIRequestContext } from '../../../../../job-tracker-ui/node_modules/@playwright/test';
import os from 'node:os';
const api = 'http://localhost:5302/api';
const password = 'E2ePassword123!';
async function login(request: APIRequestContext, email: string) {
expect((await request.post(`${api}/auth/login`, { data: { email, password } })).status()).toBe(200);
const me = await (await request.get(`${api}/auth/me`)).json();
const csrf = (await request.storageState()).cookies.find(cookie => cookie.name === 'XSRF-TOKEN')!.value;
return { 'X-CSRF-TOKEN': csrf, 'X-Session-Context': me.sessionContext as string };
}
test('P9 bounded sustained reads with 250 jobs and long CV while using native workspaces', async ({ page, context, playwright }, info) => {
test.setTimeout(240000);
const admin = await playwright.request.newContext();
const latency: { worker: number; endpoint: string; ms: number; bytes: number; status: number }[] = [];
const navigation: object[] = [];
const cdp = await context.newCDPSession(page);
await cdp.send('Performance.enable');
try {
const adminHeaders = await login(admin, 'e2e@example.test');
const email = `p9-sustained-${Date.now()}@example.test`;
expect((await admin.post(`${api}/users`, { headers: adminHeaders, data: { email, password, roles: ['Premium'] } })).status()).toBe(200);
const headers = await login(page.request, email);
const company = await page.request.post(`${api}/companies`, { headers, data: { name: 'P9 bounded workload' } });
expect(company.status()).toBe(201); const companyId = (await company.json()).id;
for (let index = 0; index < 250; index++) expect((await page.request.post(`${api}/jobapplications`, { headers,
data: { companyId, jobTitle: `P9 bounded role ${index}`, status: 'Applied', dateApplied: new Date().toISOString() } })).status()).toBe(201);
const profile = { version: '1', contact: { fullName: 'Åse Synthetic', email: 'synthetic@example.test' }, summary: ['Documented accessible workflows.'],
jobs: Array.from({ length: 8 }, (_, index) => ({ id: `p9-role-${index}`, title: `Platform engineer ${index}`, company: 'Nordlys synthetic',
start: '2017-01', end: '2025-12', bullets: Array.from({ length: 6 }, (_, bullet) => `Evidence ${index}.${bullet}: ${'Documented reliable workflows. Dokumenterte pålitelige arbeidsflyter. '.repeat(3).trim()}`) })) };
expect((await page.request.put(`${api}/career/profile`, { headers, data: { profile } })).status()).toBe(200);
const savedProfile = (await (await page.request.get(`${api}/career/profile`)).json()).profile;
expect(savedProfile.jobs).toHaveLength(8);
expect(savedProfile.jobs.map((job: { start: string; end: string; bullets: string[] }) => ({ start: job.start, end: job.end, bullets: job.bullets })))
.toEqual(profile.jobs.map(job => ({ start: job.start, end: job.end, bullets: job.bullets })));
const cv = await page.request.post(`${api}/cv/variants`, { headers, data: { name: 'P9 long workload CV', settings: { themeId: 'minimal', language: 'nb' } } });
expect(cv.status()).toBe(200); const cvId = (await cv.json()).id;
await context.route('**/*', route => {
const url = new URL(route.request().url());
return ['localhost', '127.0.0.1'].includes(url.hostname) || ['data:', 'blob:', 'about:'].includes(url.protocol) ? route.continue() : route.abort();
});
const endpoints = ['/jobapplications/stats', '/jobapplications/board', '/career/profile', '/documents'];
const started = Date.now();
const readWorker = async (worker: number) => {
for (let index = 0; index < 120; index++) {
const endpoint = endpoints[index % endpoints.length]; const begin = Date.now();
const response = await page.request.get(`${api}${endpoint}`);
latency.push({ worker, endpoint, ms: Date.now() - begin, bytes: (await response.body()).length, status: response.status() });
expect(response.status(), endpoint).toBe(200);
if (endpoint.endsWith('/board')) expect(await response.json()).toHaveLength(250);
await new Promise(resolve => setTimeout(resolve, 500));
}
};
const interact = async () => {
for (let cycle = 0; cycle < 5; cycle++) for (const route of ['/dashboard', '/jobs?view=table', '/jobs?view=board', `/career/builder/${cvId}`]) {
const begin = Date.now(); await page.goto(route);
if (route === '/dashboard') await expect(page.getByRole('link', { name: 'Tracked jobs: 250', exact: true })).toBeVisible();
else if (route.endsWith('board')) await expect(page.locator('[data-kanban-card-id]')).toHaveCount(250);
else if (route.endsWith('table')) await expect(page.locator('[data-job-row-id]').first()).toBeVisible();
else {
await expect(page.getByRole('region', { name: 'Live preview', exact: true })).toHaveAttribute('aria-busy', 'false');
const measured = await page.getByTitle('CV preview', { exact: true }).evaluate(element => {
const doc = (element as HTMLIFrameElement).contentDocument!;
const pages = Number(doc.documentElement.dataset.cvPreviewPages);
const width = Number(doc.documentElement.dataset.cvPreviewWidth);
const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT);
let node; let finalMarkerPage = 0;
while ((node = walker.nextNode())) {
const index = node.textContent?.indexOf('Evidence 7.5:') ?? -1;
if (index < 0) continue;
const range = doc.createRange(); range.setStart(node, index); range.setEnd(node, index + 'Evidence 7.5:'.length);
finalMarkerPage = Math.floor(range.getClientRects()[0].x / width) + 1;
}
return { pages, finalMarkerPage, ready: doc.documentElement.dataset.cvPreviewReady };
});
expect(measured.ready).toBe('true'); expect(measured.pages).toBeGreaterThan(1);
expect(measured.finalMarkerPage).toBe(measured.pages);
await expect(page.locator('[data-cv-page]')).toHaveCount(measured.pages);
await expect(page.getByTitle('CV preview page 1', { exact: true })).toBeVisible();
}
navigation.push({ cycle, route, readyMs: Date.now() - begin,
metrics: (await cdp.send('Performance.getMetrics')).metrics,
domElements: await page.locator('*').count() });
}
};
await Promise.all([readWorker(0), readWorker(1), interact()]);
const durationMs = Date.now() - started;
expect(durationMs).toBeGreaterThanOrEqual(60000);
expect(latency).toHaveLength(240);
expect((await (await page.request.get(`${api}/jobapplications/board`)).json())).toHaveLength(250);
expect((await (await page.request.get(`${api}/career/profile`)).json()).profile).toEqual(savedProfile);
const sorted = latency.map(row => row.ms).sort((a, b) => a - b);
await info.attach('phase9-sustained-performance', { body: JSON.stringify({ durationMs, fixtureJobs: 250, fixtureCareerRoles: 8,
readConcurrency: 2, reads: latency.length, p50Ms: sorted[Math.floor(sorted.length * .5)], p95Ms: sorted[Math.floor(sorted.length * .95)], maxMs: sorted.at(-1),
environment: { platform: os.platform(), cpus: os.cpus().length, totalMemoryBytes: os.totalmem(), browser: context.browser()?.version(), database: 'isolated SQLite', frontend: 'production static export' },
latency, navigation, limits: 'Finite paced two-reader workload plus 20 native navigations; no SLA/capacity, physical mobile, deployed Linux, model inference or server CPU attribution.' }, null, 2), contentType: 'application/json' });
} finally { await cdp.detach(); await admin.dispose(); }
});
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 891 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,71 @@
[
{
"id": "30685a6c0e3dbeec97fc-41d7ff2d700986d6de49",
"project": "chromium",
"file": "volume.spec.ts",
"title": "P9 volume: 100 CV revisions retain exact history, stale rejection and additive restore",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 1966,
"errors": [],
"attachments": [
{
"name": "phase9-volume-cv",
"contentType": "application/json",
"bytes": 183,
"sha256": "06ada1842930140b730f802849b79a75f3cab67cbc7b42f514224940b687fb53"
}
]
}
]
},
{
"id": "30685a6c0e3dbeec97fc-38eecc55ba78ad0862e8",
"project": "chromium",
"file": "volume.spec.ts",
"title": "P9 volume: 100 manual timeline messages retain exact membership and foreign-owner denial",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 1623,
"errors": [],
"attachments": [
{
"name": "phase9-volume-timeline",
"contentType": "application/json",
"bytes": 173,
"sha256": "c6cbc352b555858d0b7b7133e442381b417be48fe54c204b2f106afe6b007f85"
}
]
}
]
},
{
"id": "30685a6c0e3dbeec97fc-b9a8d42713cfaef64e77",
"project": "chromium",
"file": "volume.spec.ts",
"title": "P9 volume: 100 native cancellation notices preserve bounded lists, unread counts and ownership",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 16460,
"errors": [],
"attachments": [
{
"name": "phase9-volume-notifications",
"contentType": "application/json",
"bytes": 253,
"sha256": "66cebc8fb3824f74e7452f25482357f27695237b9f0f7ec63f8d090986aa05ba"
}
]
}
]
}
]
@@ -0,0 +1,33 @@
[
{
"name": "phase9-volume-cv",
"observation": {
"savedRevisions": 100,
"finalVersions": 101,
"staleStatus": 409,
"canonicalUnchanged": true,
"limits": "Native isolated SQLite API; no100-row history UI or MariaDB/long-term capacity claim."
}
},
{
"name": "phase9-volume-timeline",
"observation": {
"messages": 100,
"exactMembership": true,
"foreignRead": 404,
"limits": "Native persisted manual correspondence; no external mail delivery or100-message browser rendering claim."
}
},
{
"name": "phase9-volume-notifications",
"observation": {
"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."
}
}
]
@@ -0,0 +1,15 @@
# Bounded volume supplement
**3/3 passed**, zero failures/skips/flaky/retries, `volume-complete`, exit0 at00:27:14 UTC on23October. Full TypeScript checking also passed. An initial type-only import error was corrected; review then strengthened timeline preservation from a prefix check to exact content-by-ID comparison. The complete three-case successor passed on the final source. Earlier passes are retained as superseded evidence; no product code changed.
| Scenario | Actual native result | Limit |
|---|---|---|
| 100 CV revisions | Exact descending1–100 membership; stale99 save rejected409 without appending history; restoring revision2 appends101 with its original headline; canonical Career readback unchanged | Isolated SQLite API. No100-row history UI, MariaDB, long-term growth or real model claim |
| 100 long manual correspondence entries | All100 persisted IDs returned exactly; long content retained; second owner's job read404 | Manual timeline records, no external email delivery or100-message browser usability acceptance |
| 100 notifications | Existing guarded one-insert inert-operation helper + actual native cancellation generates100 distinct notices; default25/max100 list, limit101 rejected400; repeated Read counts99 once, unread Dismiss counts98, foreign mutation404 | No enabled-worker/provider/inference proof or100-item bell UI acceptance |
The separate config reuses the existing API fixture on **localhost5304**, with a unique `jobtracker-e2e-*` direct child of system temporary storage and reuse disabled. It does not share the ordinary browser database or start another frontend. The existing helper verifies actual temp path, schema and exact owner before permitting one inert operation insert; all notification creation/read/dismissal goes through native product APIs. No production data or new seeding framework is used.
[Portable observations](../volume-results.json), [cases](../volume-cases.json) and [validation](../../validation.json) retain outcomes. The two source hashes are separately recorded as `supplementalSources`; the original825-input browser/product manifest remains unchanged. This supplement is additional to the18-case diagnostics and the362-case ordinary suite, never a replacement for either.
From `job-tracker-ui`, use the existing pinned DOTNET environment and run `rtk proxy node node_modules/@playwright/test/cli.js test --config=../docs/redesign/phase-9/p9-05/volume/playwright.config.ts --retries=0 --reporter=list,json`, with its own `PLAYWRIGHT_JSON_OUTPUT_NAME`.
@@ -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: { 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(); }
});
+21
View File
@@ -0,0 +1,21 @@
# Phase 9 defect register
Status is evidence-specific. Historic acceptance records remain unchanged. A passing characterization of a known limitation does not make the limitation safe.
| ID | Severity / impact | Reproduction and disposition | Owner / closure | Phase 9 / production |
|---|---|---|---|---|
| P9-T01 | Medium test reliability: parser descendant test could time out before it had a descendant | Entry sidecar 55 pass/1 fail (missing PID); isolated run passes; explicit slow startup reproduces the race. Fixture now waits for its child PID before the unchanged 200 ms deadline. Real process-tree kill and HTTP 504 assertions retained. Focused green and full 56/56 successor. No parser product change. | QA; `.artifacts/phase9/sidecar-entry-failed.*`, `sidecar-fixture-red.*`, `sidecar-fixture-green.*`, `sidecar.xml` | Resolved in tested Windows environment; Linux run remains separate. |
| P9-L01 | Low localisation defect: Admin grid vendor controls appear in English in Bokmål | Sole DataGrid owner omitted localeText. New English desktop test passes while Bokmål fails to find “Rader per side:”. Reuse installed `nbNO` locale in AdminUsersPage. Focused 12/12 green; first integrated Jest919/104 and native desktop matrix green; final frozen successor recorded separately. | Frontend; `admin-users-page.test.tsx`, `AdminUsersPage.tsx`; retained RED/GREEN logs/JSON | Resolved in observed local integration; no authorisation, pagination or data contract change. |
| P9-V01 | Medium visual defect: wrapped public h2 lines overlap at320px in EN/NB | Four larger h2 owners inherited a fixed body line height. Original native geometry2/2 RED; explicit lineHeight1.4 now2/2 GREEN across16 width/theme/locale vectors; independent EN/light and NB/dark PNG inspection confirms separation. Intermediate1.2 still failed unchanged geometry assertions and was superseded. | Frontend; `LandingPage.tsx`, new `landing-presentation.spec.ts`; `landing-red`, `landing-qualified`, `landing-accepted` raw reports | Bounded fix verified by native geometry/build; complete frozen successor separately required. |
| RD21 | High data-integrity limitation: generic job/canonical Career stale saves and creation-intent idempotency lack the complete CV-style revision contract | Fresh independent two-client reproduction loses the first acknowledged summary/title; stale Career200 and job204 restore older fields. [Observed values](../p9-04/rd21.json). Creation idempotency remains separate and unclosed. | Domain owners; [separate issue](../p9-04/RD21_CONCURRENCY_ISSUE.md), all callers, atomic server concurrency and recovery tests. No silent architectural expansion in QA. | FAIL for observed stale-write safety; blocks unqualified Phase9 and production acceptance. |
| P9-L02 | Low linguistic residual: stored event type `Created` appears in Bokmål job history/audit | Rendered route comparison detects18 occurrences across the matrix; raw stored metadata is not a missing translation key. Do not translate authored/provider content indiscriminately. | UI/localisation owner; separately map known event enums with unknown-value fallback and history/audit tests; human wording review | Retained nonblocking development qualification; no data mutation proposed. |
| P9-T02 | Low test compatibility: existing Admin pagination fixture hard-coded the English vendor accessible name in Bokmål mode | First native shard97pass/1fail: no button named “Go to next page” in NB. The installed locale exposes “Gå til neste side”. Locator now uses installed enUS/nbNO pagination names; the six original width/locale/theme, long-identity, page-change, focus/reachability and no-write assertions remain. Focused1/1 green; full shard successor required. | QA; `phase7-admin-users.spec.ts`; original shard report/trace and `admin-grid-green` retained. Other English-name callers belong to the separate English JobTable owner and remain unchanged. | Test-only repair; no product or authorisation change. |
| P9-PERF-01 | Low duplicate report work: shell and Dashboard each initially read reminders | Phase 8 source/network diagnosis retained. Phase 9 request-count evidence must distinguish initial duplicate reads from additional reads during editing. | Shared reminder read owner; measured benefit and independent shell/dashboard failure/loading tests before consolidation. | Accepted existing development debt; no Phase 10 implementation here. |
Failed diagnostic fixtures are also retained: initial route matrix mistook “CV unavailable” alert text for a heading; correct page heading is “Public CV”. Initial sustained fixture compared submitted JSON directly with the canonical normalizer and used derived date fields; corrected fixture uses canonical `start`/`end`, distinct bullets and a verified saved readback before checking preservation. The initial drawer assertion inspected immediately after ARIA removal rather than waiting for the closing transition; settled CSS/keyboard proof is required. These are QA harness mistakes, not demonstrated product defects, and failed attempts are never counted as passes.
The ordinary run interrupted after 36 completed cases is not an accepted complete run. Native-command warnings were initially promoted to terminating PowerShell errors; successor wrappers preserve actual native exit codes. No assertion was suppressed, no configured retry added and no skip introduced.
A later frozen ordinary attempt stopped after96 completed cases with no final report/exit record and no live runner when inspected on23October; its cause is not established. Another restart was deliberately stopped while changing to native serial sharding. Neither attempt is counted as complete or as proof of a product failure. The final qualification uses four native Playwright shards, preserving connected files, isolated startup and every original assertion; all362 unique case IDs and all four successful process exits are required, with no skips or retries. Original logs remain hashed. This changes result checkpointing, not the acceptance assertions or membership.
The first sharded attempt exposed P9-T02 and is retained as97pass/1fail. Its completed native report is not accepted as a passing shard. After the causal locator correction and focused green, the entire98-case first shard is rerun as `ordinary-shard-1-final`, followed by shards2–4. [Exact manifest delta](../p9-00/admin-fixture-delta.json) proves the only change is the ordinary Admin test file; product/build/core/18diagnostic/volume inputs are unchanged. The original825-input manifest is retained beside the updated ordinary manifest. Discovery is regenerated and exact membership remains required; no failed case is filtered from an accepted run.
@@ -0,0 +1,17 @@
# Phase 10 eligibility handoff
**NO-GO for broad cleanup or deletion. Phase 10 was not started.** All 33 routes and 57 preservation contracts remain in scope; 56 PARTIAL and C11 DEFERRED are qualification states, not permission to remove functionality.
| Candidate | Eligibility / required proof | Preserve |
|---|---|---|
| Duplicate initial reminder read (P9-PERF-01) | Candidate for a separately scoped shared-owner change after measuring benefit and independently exercising shell/Dashboard loading, failure, refresh and account disposal | Notification counts, reminder rules, Dashboard widgets and failure recovery |
| Legacy `/kanban`, `/applications/:id`, `/correspondence/review` | Keep aliases. No deletion eligibility without reader/bookmark/extension migration evidence and agreed compatibility policy | Query/hash, target section and identity/ownership boundaries |
| Legacy Job/Application schema (RD26) | Ineligible until expand/verify/contract and intended-provider migration, all readers/writers, rollback/restore are proven | IDs, relations, submissions, binaries, historical records |
| Dashboard/report calculation or Board optimization | Candidate only after an agreed measured budget identifies a bottleneck; retain complete membership and accessible alternatives | All filters, sorts, statuses, report definitions, nine-widget catalogue and owner/revision settings |
| Shared UI consolidation | No demonstrated need for a new framework. Any extraction requires caller census and error/loading/dirty/focus/localisation preservation | MUI/theme/router/current state/rendering and fixed CV geometry |
| Old tests or evidence | No deletion based on passing new tests. Keep original failures, fixture semantics and historical acceptance | Original PDF oracle, limits, auth guards, no retries/skips replacing failures |
| C11 / P5-13 / new integrations | Ineligible for cleanup activation. Separate model/provider/product qualification remains required | Withheld endpoints, review-before-apply and canonical/variant boundaries |
RD21 needs a separate data-integrity work item before unqualified acceptance: [concurrent-save contract issue](../p9-04/RD21_CONCURRENCY_ISSUE.md). It spans server contracts, callers, transactions and recoverable conflicts; a last-minute client-only guard cannot provide atomic safety. Creation-intent idempotency and canonical-write/later-Identity partial commits must be assessed explicitly.
Before any future cleanup: establish a clean directly verified remote baseline, agree exact candidate scope, link affected preservation IDs and callers, reproduce the problem, retain a rollback path and run the relevant tests plus full regression. Actual human/provider/document/infrastructure gates in [RISKS](../RISKS.md) remain independent of cleanup eligibility. No production operation is authorised by this handoff.
+93
View File
@@ -0,0 +1,93 @@
"""Build final ledgers from accepted portable cases; never upgrade preservation gaps."""
import json
import re
from pathlib import Path
HERE = Path(__file__).resolve().parent
def read(name):
return json.loads((HERE / name).read_text(encoding='utf-8'))
def cell(value):
return str(value).replace('|', '/').replace('\n', ' ')
def main():
inventory = read('p9-00/inventory.json')
groups = inventory['preservation']
assert len(groups) == len({row['id'] for row in groups}) == 57
# Later reconciliation supersedes historic Phase2 gaps, without rewriting them.
p7 = (HERE.parent / 'phase-7/PRESERVATION.md').read_text(encoding='utf-8')
remaining = {}
for line in p7.splitlines():
if line.startswith('| **PRES-'):
cols = [part.strip() for part in line.strip('|').split('|')]
remaining[re.search(r'PRES-[A-Z]\d{2}', cols[0]).group()] = cols[3]
assert set(remaining) == {row['id'] for row in groups}
cases = read('p9-01/ordinary-cases.json')
diagnostics = read('p9-05/phase9-cases.json')
volume = read('p9-05/volume-cases.json')
assert len(cases) == 362 and len(diagnostics) == 18 and len(volume) == 3
assert len({(row['id'], row['project']) for row in cases}) == 362
assert all(row['status'] == 'expected' and len(row['results']) == 1 and row['results'][0]['status'] == 'passed' for row in cases + diagnostics + volume)
validation = read('validation.json')['lanes']
assert validation['ordinary']['membershipMatchesDiscovery']
for lane in ['ordinary', 'phase9', 'volume', 'ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences']:
record = validation[lane]
assert not record['fileFailures'] and not record['retries']
assert record['stats']['unexpected'] == record['stats']['flaky'] == record['stats']['skipped'] == 0
assert record['stats']['expected'] == record['cases']
assert sum(validation[lane]['cases'] for lane in ['ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences']) == 23
assert validation['backend']['passed'] == '1084' and validation['backend']['failed'] == '0'
assert validation['backend']['notExecuted'] == '0'
assert validation['frontend']['success'] and validation['frontend']['numPassedTests'] == 919
assert validation['frontend']['numFailedTests'] == validation['frontend']['numPendingTests'] == 0
assert validation['sidecar']['tests'] == '56' and validation['sidecar']['failures'] == validation['sidecar']['errors'] == '0'
assert validation['sidecar']['skipped'] == '0'
for lane in [*[f'ordinary-shard-{number}' for number in range(1, 5)], 'phase9-frozen', 'volume-qualified', 'ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences', 'backend', 'frontend', 'sidecar', 'build']:
assert validation[lane + 'Process']['exitCode'] == 0
rows = read('p9-02/route-results.json')
assert len(rows) == 396 and {row['pattern'] for row in rows} == set(inventory['routes'])
header = '# Phase 9 preservation reconciliation\n\nAll57 groups retain **56 PARTIAL / C11 DEFERRED**. Zero groups are promoted to PASS. These statuses retain mandatory human/provider/output obligations and are not57 defect findings. Phase9 adds finite executed evidence and two bounded UI fixes; it does not erase previous acceptance records. [Phase7](../phase-7/PRESERVATION.md) supplies the later residual obligations, superseding stale Phase2 gap descriptions (notably repaired P2-D01 and CV revision safety).\n\n'
header += 'Exact executed browser cases are in [ordinary-cases](p9-01/ordinary-cases.json); complete backend case results and frontend suite totals are linked from [validation](validation.json). The matches below use explicit IDs in test titles only; zero explicit matches means no direct title mapping, not absent unit/API coverage. A case may cover several groups; do not sum counts as independent tests.\n\n'
lines = [header, '| Group / owners | Entry → Phase9 | Direct native title matches | Current residual / closure |', '|---|---|---|---|']
portable = []
for group in groups:
identifier = group['id']
matches = [dict(file=c['file'], title=c['title']) for c in cases if identifier in c['title']]
residual = re.sub(r'\[([^]]+)\]\([^)]+\)', r'\1', remaining[identifier])
delta = 'Finite full regression retained; human/provider/output qualifications remain.'
if identifier in ['PRES-C01', 'PRES-W02', 'PRES-J06']:
delta += ' RD21 stale-write safety FAIL; see separate contract issue.'
if identifier == 'PRES-C11':
delta = 'P5-13 remains withheld; real model/semantic qualification not executed.'
if identifier == 'PRES-E01':
delta += ' P9-V01 wrapped heading fix and16-vector native geometry proof.'
if identifier in ['PRES-A01', 'PRES-E08']:
delta += ' P9-L01 installed vendor locale and2new Jest cases.'
if identifier == 'PRES-S02':
delta += ' Phase8 account-layout order/size/visibility/reset/conflict behaviour preserved.'
lines.append(f"| {cell(group['capability'])}; owners: {cell(group['owners'])} | {group['entryStatus']} → {group['entryStatus']} | {len(matches)} | {cell(delta)} {cell(residual)} |")
portable.append(dict(id=identifier, capability=group['capability'], owners=group['owners'], entry=group['entryStatus'], phase9=group['entryStatus'], evidence=matches, remaining=residual, delta=delta))
assert sum(row['phase9'] == 'PARTIAL' for row in portable) == 56
assert sum(row['phase9'] == 'DEFERRED' for row in portable) == 1
(HERE / 'PRESERVATION.md').write_text('\n'.join(lines) + '\n', encoding='utf-8')
(HERE / 'preservation.json').write_text(json.dumps(portable, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
lines = ['# Final route/workflow QA matrix', '', 'All33 concrete patterns are retained. Each has12 native samples:320/768/1440px × EN/NB × light/dark, with actual applied theme/locale, heading, expected owned read states where applicable and root-overflow assertions. The correspondence review alias deliberately expects409 for unavailable mailbox configuration. Public invalid-token/unpublished states are deliberately identified; they do not prove successful external delivery/publication. Screenshots were inspected within the scope in [visual report](p9-02/README.md).', '', 'Route presence/DOM PASS is separate from workflow acceptance PARTIAL. Consult [ordinary executed cases](p9-01/ordinary-cases.json) and per-group [preservation](PRESERVATION.md) for connected mutation/failure journeys; route screenshots alone are not end-to-end capability proof.', '', '| Route → workflow owners | Feature contracts | Executed route evidence | Known risks / acceptance |', '|---|---|---|---|']
for route, owners in inventory['routes'].items():
samples = [r for r in rows if r['pattern'] == route]
assert len(samples) == 12
assert all(r['scrollWidth'] <= r['viewport'] + 1 and r['effectiveTheme'] == r['theme'] for r in samples)
related = [g['id'] for g in groups if route != '/' and route in g['entry'] or route == '/' and '`/`' in g['entry']]
extra = 'RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification'
if route in ['/career', '/jobs/:id', '/applications/:id', '/jobs']:
extra += '; RD21 unsafe concurrent saves FAIL'
lines.append(f"| `{route}` → {cell(', '.join(owners))} | {', '.join(related) or 'Shared shell/nearest contracts; no invented group'} |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | {extra} |")
(HERE / 'QA_MATRIX.md').write_text('\n'.join(lines) + '\n', encoding='utf-8')
print('Reconciled33 routes and57 unchanged preservation dispositions')
if __name__ == '__main__':
main()
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,36 @@
import { test, expect } from '@playwright/test';
import { translations } from '../src/i18n/translations';
for (const language of ['en', 'nb'] as const) {
test(`[P9 PRES-E01 E08] ${language} wrapped landing headings keep separate text lines`, async ({ page, context }, info) => {
test.setTimeout(90000);
await context.route('**/*', route => {
const url = new URL(route.request().url());
return ['localhost', '127.0.0.1'].includes(url.hostname) || ['data:', 'blob:', 'about:'].includes(url.protocol) ? route.continue() : route.abort();
});
await context.addInitScript(language => localStorage.setItem('uiLanguage', language), language);
const observations = [];
for (const theme of ['light', 'dark']) for (const width of [320, 390, 768, 1440]) {
await page.setViewportSize({ width, height: 900 });
await page.goto('/');
await page.evaluate(theme => localStorage.setItem('jobtracker.themeMode', theme), theme);
await page.reload();
await expect(page.getByRole('heading', { name: translations[language].landingPreviewTitle, exact: true })).toBeVisible();
await page.evaluate(() => document.fonts.ready);
const headings = await page.locator('h2').evaluateAll(nodes => nodes.map(node => {
const range = document.createRange(); range.selectNodeContents(node);
const lines = [...range.getClientRects()].filter(rect => rect.width > 0).map(rect => ({ top: rect.top, bottom: rect.bottom }));
return { text: node.textContent, lineHeight: getComputedStyle(node).lineHeight, lines };
}));
expect(headings.length).toBeGreaterThanOrEqual(4);
if (width === 320) expect(headings.some(heading => heading.lines.length > 1)).toBe(true);
for (const heading of headings) for (let index = 1; index < heading.lines.length; index++) {
expect.soft(heading.lines[index].top, `${width}/${theme}: ${heading.text}`).toBeGreaterThanOrEqual(heading.lines[index - 1].bottom - 1);
}
expect(await page.evaluate(() => document.documentElement.scrollWidth)).toBeLessThanOrEqual(width + 1);
observations.push({ width, theme, language, headings });
if (width === 320) await info.attach(`landing-${language}-${theme}-${width}`, { body: await page.screenshot({ fullPage: true, animations: 'disabled' }), contentType: 'image/png' });
}
await info.attach('landing-line-geometry', { body: JSON.stringify(observations, null, 2), contentType: 'application/json' });
});
}
@@ -1,6 +1,7 @@
import AxeBuilder from '@axe-core/playwright';
import { expect, test as base, type APIRequestContext, type APIResponse, type Locator, type Page, type TestInfo } from '@playwright/test';
import { translations } from '../src/i18n/translations';
import { enUS, nbNO } from '@mui/x-data-grid/locales';
const apiUrl = 'http://localhost:5302/api';
const password = 'E2ePassword123!';
@@ -132,8 +133,9 @@ test('[P7-10 Users A01] finite bilingual light/dark widths retain long identitie
if (sample.width>=768) {
const grid=page.getByRole('grid');
await expect(grid.getByRole('row').nth(1)).toBeVisible();
const locale=(sample.language==='nb' ? nbNO : enUS).components.MuiDataGrid.defaultProps.localeText;
while (!await page.getByText(email, { exact: true }).first().isVisible()) {
const next=page.getByRole('button', { name: 'Go to next page', exact: true });
const next=page.getByRole('button', { name: locale.paginationItemAriaLabel!('next'), exact: true });
await expect(next).toBeEnabled();
const before=await grid.getByRole('row').nth(1).innerText();
await next.click();
@@ -55,6 +55,15 @@ beforeEach(() => {
function held<T>() { let resolve!: (value: T) => void; const promise=new Promise<T>(yes => { resolve=yes; }); return { promise, resolve }; }
function createDraft(email='new@example.test') { fireEvent.change(screen.getByLabelText('Email'), { target: { value: email } }); fireEvent.change(screen.getByLabelText('New password'), { target: { value: 'TestPassword123!' } }); }
test.each([['en', 'Rows per page:'], ['nb', 'Rader per side:']])('desktop user-grid pagination follows %s UI language', async (language, label) => {
window.localStorage.setItem('uiLanguage', language);
(window.matchMedia as jest.Mock).mockImplementation(() => ({ matches: false, addEventListener: jest.fn(), removeEventListener: jest.fn(), addListener: jest.fn(), removeListener: jest.fn() }));
renderPage([{ id: 'locale-user', email: 'locale@example.test', roles: [], emailConfirmed: true, isCurrentUser: false, canRemoveAdmin: true }]);
expect(await screen.findByText(label)).toBeInTheDocument();
expect(screen.getByLabelText(label)).toHaveTextContent('10');
expect(mockedApi.get).toHaveBeenCalledTimes(1);
});
test('failed users read stays unavailable and Retry only reads', async () => {
mockedApi.get.mockRejectedValueOnce(new Error('offline')); renderPage([]);
const retry=await screen.findByRole('button', { name: 'Retry' });
+3 -1
View File
@@ -15,6 +15,7 @@ import {
} from "@mui/material";
import useMediaQuery from "@mui/material/useMediaQuery";
import { DataGrid, GridColDef } from "@mui/x-data-grid";
import { nbNO } from "@mui/x-data-grid/locales";
import { api, getApiErrorMessage } from "../api";
import { useToast } from "../toast";
@@ -39,7 +40,7 @@ export default function AdminUsersPage() {
const isMobile = useMediaQuery("(max-width:767.95px)");
const { toast } = useToast();
const { confirmAction } = useDialogActions();
const { t } = useI18n();
const { t, language } = useI18n();
const [busy, setBusy] = useState(false);
const owner = useRef({ mounted: true, generation: 0, busy: false });
const body = useRef<HTMLDivElement>(null);
@@ -293,6 +294,7 @@ export default function AdminUsersPage() {
) : (
<Paper variant="outlined" role="region" aria-label={t("adminUsersTitle")} tabIndex={0} sx={{ borderRadius: 1, minWidth: 0, overflow: "auto" }}>
<DataGrid
localeText={language === "nb" ? nbNO.components.MuiDataGrid.defaultProps.localeText : undefined}
autoHeight
getRowHeight={() => "auto"}
rows={rows}
+4 -4
View File
@@ -140,7 +140,7 @@ export default function LandingPage() {
<Container maxWidth="lg" sx={{ py: { xs: 6, md: 9 } }}>
<Box sx={{ textAlign: "center", mb: 5 }}>
<Typography sx={{ color: "primary.main", fontWeight: 700, letterSpacing: 1, fontSize: 13 }}>{t("landingPreviewEyebrow")}</Typography>
<Typography component="h2" sx={{ fontWeight: 800, fontSize: { xs: 26, md: 34 }, mt: 1 }}>{t("landingPreviewTitle")}</Typography>
<Typography component="h2" sx={{ fontWeight: 800, fontSize: { xs: 26, md: 34 }, lineHeight: 1.4, mt: 1 }}>{t("landingPreviewTitle")}</Typography>
</Box>
<Box sx={{ borderRadius: 3, overflow: "hidden", border: "1px solid", borderColor: "divider", boxShadow: 10, mb: 3, bgcolor: "background.paper" }}>
<Box component="img" src="/mockups/dashboard.svg" alt={t("landingDashboardAlt")} sx={{ width: "100%", display: "block" }} />
@@ -160,7 +160,7 @@ export default function LandingPage() {
<Container id="features" maxWidth="lg" sx={{ py: { xs: 7, md: 10 } }}>
<Box sx={{ textAlign: "center", mb: 6 }}>
<Typography sx={{ color: "primary.main", fontWeight: 700, letterSpacing: 1, fontSize: 13 }}>{t("landingFeaturesEyebrow")}</Typography>
<Typography component="h2" sx={{ fontWeight: 800, fontSize: { xs: 28, md: 38 }, mt: 1 }}>{t("landingFeaturesTitle")}</Typography>
<Typography component="h2" sx={{ fontWeight: 800, fontSize: { xs: 28, md: 38 }, lineHeight: 1.4, mt: 1 }}>{t("landingFeaturesTitle")}</Typography>
<Typography sx={{ color: "text.secondary", fontSize: 18, mt: 1.5 }}>
{t("landingFeaturesBody")}
</Typography>
@@ -181,7 +181,7 @@ export default function LandingPage() {
<Container maxWidth="lg">
<Box sx={{ textAlign: "center", mb: 6 }}>
<Typography sx={{ color: "#a5b4fc", fontWeight: 700, letterSpacing: 1, fontSize: 13 }}>{t("landingHowEyebrow")}</Typography>
<Typography component="h2" sx={{ fontWeight: 800, fontSize: { xs: 28, md: 38 }, mt: 1 }}>{t("landingHowTitle")}</Typography>
<Typography component="h2" sx={{ fontWeight: 800, fontSize: { xs: 28, md: 38 }, lineHeight: 1.4, mt: 1 }}>{t("landingHowTitle")}</Typography>
</Box>
<Box sx={{ display: "grid", gridTemplateColumns: { xs: "1fr", sm: "1fr 1fr", md: "1fr 1fr 1fr" }, gap: 3 }}>
{STEPS.map((s) => (
@@ -199,7 +199,7 @@ export default function LandingPage() {
<Container id="plans" maxWidth="lg" sx={{ py: { xs: 7, md: 10 } }}>
<Box sx={{ textAlign: "center", mb: 6 }}>
<Typography sx={{ color: "primary.main", fontWeight: 700, letterSpacing: 1, fontSize: 13 }}>{t("landingPlansEyebrow")}</Typography>
<Typography component="h2" sx={{ fontWeight: 800, fontSize: { xs: 28, md: 38 }, mt: 1 }}>{t("landingPlansTitle")}</Typography>
<Typography component="h2" sx={{ fontWeight: 800, fontSize: { xs: 28, md: 38 }, lineHeight: 1.4, mt: 1 }}>{t("landingPlansTitle")}</Typography>
<Typography sx={{ color: "text.secondary", fontSize: 18, mt: 1.5 }}>
{t("landingPlansBody")}
</Typography>
+19
View File
@@ -5,6 +5,7 @@ import os
import subprocess
import sys
import textwrap
import time
import zipfile
from pathlib import Path
@@ -759,6 +760,7 @@ def test_parser_timeout_terminates_descendants(monkeypatch, tmp_path):
child.write_text(textwrap.dedent(f"""
import subprocess, sys, time
from pathlib import Path
time.sleep(0.3)
descendant = subprocess.Popen([sys.executable, '-c', 'import time; time.sleep(30)'])
Path({str(pid_path)!r}).write_text(str(descendant.pid), encoding='ascii')
time.sleep(30)
@@ -766,6 +768,23 @@ def test_parser_timeout_terminates_descendants(monkeypatch, tmp_path):
monkeypatch.setattr(module, "PARSER_CHILD_PATH", child)
monkeypatch.setattr(module, "PARSER_TIMEOUT_SECONDS", 0.2)
# Start the deadline only after this fixture has a descendant to terminate.
original_popen = subprocess.Popen
def ready_parser(*args, **kwargs):
process = original_popen(*args, **kwargs)
if len(args[0]) > 1 and args[0][1] == str(child):
deadline = time.monotonic() + 5
while not pid_path.exists() and process.poll() is None and time.monotonic() < deadline:
time.sleep(0.01)
if not pid_path.exists():
module._terminate_parser_process(process)
process.wait(timeout=5)
raise AssertionError("Parser fixture did not create its descendant")
return process
monkeypatch.setattr(module.subprocess, "Popen", ready_parser)
try:
module._run_parser_child(".txt", b"safe")
except module.HTTPException as exc: