16 KiB
JobTracker master programme progress
Updated: 2026-08-29
2026-08-29 audit implementation programme
Completed
- Introduced shared application spacing tokens for 16px mobile gutters, 24px tablet/desktop gutters, 32px wide-screen gutters, 24px section rhythm, and 16–20px card padding.
AppShelland the first redesigned surfaces consume these tokens. - Reworked the Dashboard around today's prioritized actions. Empty accounts no longer render zero-value metrics, ten empty funnel stages, empty time-in-stage, company, skill, or activity panels. The activity SVG now scales to its container instead of requiring a clipped fixed-width mobile canvas.
- Made onboarding dismissible per account/browser while preserving the checklist until it is completed or dismissed.
- Made Settings use a compact section selector at mobile widths, kept tabs for larger screens, narrowed the content column, and removed its duplicate in-page title. Newly touched settings copy is localized in English and Norwegian Bokmål.
- Replaced the ordinary-user Google configuration variable instruction with a human-readable unavailable state.
- Made Playwright independent of nested
npmcalls and accidental system.NETordering. The E2E launcher resolvesDOTNET_HOST_PATH,DOTNET_ROOT, or the user-local SDK before falling back to PATH and invokes Next/Playwright through the current Node runtime. - Made application CV matching language-aware. It detects/normalizes the advert and linked-CV languages, uses an already-saved English advert translation for an English CV when available, never starts a translation or mutates either document during a match read, and tells the user when a cross-language comparison is translated or limited.
- Expanded the shared deterministic keyword filter to remove Norwegian recruitment filler including
både,del,dnbs,faglig,får,god,hos, andutviklinginstead of presenting those words as CV gaps. - Split the Career Workspace into Overview, Career Profile, and Import Review destinations. Navigation is URL-backed, uses tabs above mobile widths and a labelled select at 375px, and preserves unsaved editor state while changing sections. Import diagnostics no longer force users to scroll through the normal profile editor.
- Removed the duplicate Career Workspace title inside the Overview content; the shared application shell remains the single page-level heading.
- Forced local Next development and Playwright's non-export server onto webpack after reproducing a Next 16 Turbopack panic (
Next.js package not found) with the bundled portable Node runtime. - Localized the Job Workspace recruiter-status suggestion and strategy snapshot end to end, including status labels, action buttons, empty/loading outcomes, queued-operation feedback, and both English and Norwegian Bokmål copy.
- Improved the Job Workspace overview card grid so compact screens use one readable column, tablets use two, and wide screens use five without leaving a cramped orphan card.
- Moved the remaining shared shell navigation labels into the global locale catalogue so sidebar and mobile-navigation controls announce themselves in the selected language.
- Localized the application checklist from stable system keys rather than persisted English text. Categories, generated tasks, descriptions, progress, errors, tooltips, and accessible reorder/delete names now switch between English and Bokmål while user-authored task text remains untouched.
- Localized Cover Letter, CV attachment, application-draft, and Interview Prep failure states and document-language selectors. Interview categories now derive from stable category keys while user-authored questions and answers remain unchanged.
- Reused the checklist's stable system-key translation mapping for the Overview's recommended next action, preventing the English backend seed text from leaking into a Bokmål workspace.
- Corrected the CV Match source caption to interpolate the selected CV name once, localized known match bands, and made intelligence/timeline load failures and dates respect the selected UI locale.
- Finished the Career Profile import/review localization pass: queue, cancel, retry, diff, confidence, destructive, save-state, completeness, link-editor, language-selector, and version-history controls now use the global English/Bokmål catalogue while imported CV values remain unchanged.
- Localized backend-owned career completeness labels through one shared UI mapping so Overview and Profile display Bokmål without changing the API contract or stored profile data.
- Removed the remaining mojibake from the translation catalogue, including account email, Microsoft relink, account-deletion, and learning-path messages.
- Localized the Operations and Notifications activity page controls, dates, progress accessibility labels, empty/error/loading states, cancellation feedback, and retry/dismiss actions in English and Norwegian Bokmål.
In progress
- P0 deployment and production health revalidation. Commit
4d4af47is pushed and Gitea Actions run 696 exists, but the run remained queued while the public health endpoint returned 502 during the first check. - Shared UI foundation rollout to remaining screens and standardized loading/empty/error copy.
- Shared loading/empty/error-state consolidation is the next active UI package.
Remaining
- Finish production deployment/health verification and revalidate the production-only blockers.
- Continue shared hierarchy/responsive work across Career Workspace, Job Workspace, Profile, Admin, Jobs tables, Kanban, and CV Builder.
- Add a real frontend lint dependency/configuration once package-index access is explicitly authorized; the current lockfile contains no ESLint packages.
- Continue maintainability packages, accessibility automation, mobile regression coverage, and the prioritized product-value roadmap after the foundations are stable.
Blocked
- ESLint installation is blocked by the repository rule requiring explicit permission before package-index/internet access.
- Production rollout remains dependent on an online Gitea runner matching
ubuntu-latestand the deployment host becoming healthy. - Existing external/provider/retention decisions remain listed in
BLOCKERS.mdand are not silently reclassified here.
Discovered during implementation
- The prior E2E command relied on both
dotnetand nestednpmbeing discoverable through ambient PATH. This reproduced the audit's tooling failure on the current workstation. - The 375px Settings regression test still expected desktop tabs. It now verifies the responsive section selector instead.
- The previous Dashboard rendered its time-in-stage empty state using the unrelated “No tags yet” copy. Empty analytical panels are now suppressed instead of presenting mismatched messages.
- The Application Analysis match previously ignored both
JobApplication.DescriptionLanguage/TranslatedDescriptionand the linked CV's language setting. This could under-score an English CV against a Norwegian advert even when import had already stored a usable English translation. - The bundled portable Node runtime starts Next 16 successfully, but Turbopack repeatedly panicked while emitting
/page; the webpack development path serves the same route correctly and is now the documented/scripted default.
Verification
-
Focused frontend: 2 suites, 6 tests passed.
-
Full frontend: 62 suites, 256 tests passed.
-
Next production build and TypeScript: passed.
-
Portable Playwright launcher: resolved the user-local .NET 9 SDK; backend Release build passed with 0 warnings/errors.
-
Playwright: initial full run 9/10 exposed the intentional mobile Settings control change; updated focused rerun passed 1/1. A final complete browser rerun remains in the end-of-batch gate.
-
Focused backend match/intelligence verification: 34/34 passed.
-
Focused frontend application-intelligence verification: 11/11 passed.
-
Career/Profile focused verification: 2 suites, 19/19 passed, including the final navigation/state-preservation regression; final full-suite/E2E gates remain pending.
-
Job Workspace focused verification: 2 suites, 9/9 passed; TypeScript passed.
-
Checklist localization verification: 7/7 passed, including a Bokmål regression that preserves user-authored content.
-
Cover Letter/CV assets and Interview Prep focused verification: 2 suites, 27/27 passed, including Bokmål category rendering that preserves user content.
-
Workspace/checklist integration verification: 2 suites, 14/14 passed, including localized system-derived next actions.
-
Application intelligence focused verification: 11/11 passed; TypeScript passed after the creation-tab/localization batch.
-
Career Profile and Operations focused verification: 2 suites, 16/16 passed, including Bokmål completeness/confidence and operations empty-state regressions.
-
Full frontend after the Career/Operations localization batch: 62 suites, 260/260 tests passed.
-
Next optimized production build and its integrated TypeScript check passed after the Career/Operations localization batch.
-
Backend matcher/intelligence focused verification: 35/35 passed, including detection of a manually created Norwegian advert with no saved translation.
-
Full backend: 712/712 tests passed on .NET 9.
-
Next optimized production build and TypeScript: passed after the Job Workspace/checklist batch.
-
Playwright: 8/10 passed on the first complete run; both failures were ambiguous selectors in the newly responsive Career selector, not product failures. Both corrected focused regressions now pass (2/2); final full rerun remains in the end-of-batch gate.
-
Manual desktop browser review: webpack development server rendered the new Career navigation and Overview correctly in dark mode; API-dependent profile status remained unavailable because the backend was not running for that isolated UI review.
-
Overall programme status: Active but externally blocked. Eight packages are locally verified and twenty-five are implemented with verification incomplete. The prioritized admin-only version indicator, every immediate repository/browser item, SEC-009, the PROD-001 read-only inventory, and the PROD-003 safe benchmark harness are complete on the release branch.
-
Current work package: None. Every remaining package now requires a user/operator decision, authorized production mutation/restore/provider action, or explicit package-index access.
-
Completed work packages: None are
DONE; all repository security/AI packages still have applicable browser, provider and/or production gates. -
Locally verified work: SEC-001, SEC-002, SEC-003, SEC-005A, CORE-001, PROD-002, DEP-001 and VER-001 (
VERIFIED LOCALLY). -
Implemented, verification incomplete: SEC-004, SEC-005B, SEC-008, SEC-009, CORE-002, BG-001, OPS-001A/B/C, POL-001/002, AI-001/002/003/004, UX-001/002/003, QA-001, CAREER-001/002, MAIL-001, JOBS-001/002 and PRODUCT-001 (
IMPLEMENTED — NOT VERIFIED). Their safe repository/browser scope is implemented; production/native-device/provider/retention gates remain where recorded. -
Production-verified work: None.
-
Blocked work: SEC-006 parser upgrades remain outside the scoped frontend advisory permission; PROD-001/003/004 and REL-001 require network/backup/model/deployment authority and unfinished dependencies. Real provider and live deletion/restore checks remain gated; DEP-001 awaits approved merge/live verification.
-
Deferred work: None. Conditional multi-replica coordination, model deletion, realtime operation delivery and unrelated production changes remain outside current packages.
-
Immediate order: all sixteen immediate repository items are complete locally, including the original UI/release queue plus SEC-009 cache/tombstone safety, worker restart clocks, universal AI accounting, email-token/Stripe lifecycle tests, exhaustive Job email selectors, the repaired migration chain, CV/public-edge hardening and measured admin/mail scaling. PROD-001 read-only evidence and the PROD-003 plan-only harness are also complete. The final audit is checking tooling/documentation before declaring only external blockers remain.
-
Status counts: 8
VERIFIED LOCALLY; 25IMPLEMENTED — NOT VERIFIED; 0IN PROGRESS; 1NOT STARTED; 5BLOCKED; 0DONE; 0DEFERRED. -
Test status: backend 683/683; frontend 58/58 suites and 239/239 tests; AI sidecar 23/23; Ollama benchmark harness 5/5 plus safe dry-run; optimized production build/TypeScript; EF model parity; SQLite/MariaDB migration scripts; blank/idempotent/populated SQLite migration-chain tests; disposable fresh/restarted MariaDB 11.8 application startup; Docker Compose config; safe-failure deployment preflight; and Playwright 9/9. npm audit 0 evidence remains current because the lockfile did not change. Jest's slow/open-handle behavior remains recorded.
-
Deployment status: Gitea pull-request run 609 passed the complete CI job in 4m20s. Deploy was intentionally skipped because the workflow deploys only a
pushtomain; live remains unchanged. No merge/deployment was performed directly, no production migrations were run and the AI operation worker remains disabled by default. -
Production status: State unchanged. Sanitized read-only SSH inventory was performed; no logs, prompts, private rows/content or secret values were read, and no provider/model call, model pull, service restart, file/config change, backup, restore, migration or deployment occurred. It confirmed all-interface Ollama/frontend listeners and stale database-only backups as rollout blockers.
-
Known regressions: None found by automated/local browser checks. Jest still needs
--forceExitand reports its existing open-handle notice. Email-provider/send tests are fake/local only; real delivery is not claimed. Current MAIL browser evidence is 1280×720 only because the browser surface could not resize or perform native Tab traversal. Interrupted attempts are aged after 15 minutes and notified without retry; the five-minute scan is unmeasured on a large ledger. The direct clean EF-only SQLite defect and synchronous AI accounting gap are closed; migration/reconciler dual ownership remains architectural debt. -
Outstanding security findings: JT-001 repository ownership remains High deployment risk until migration/inventory/provider checks; production portion of JT-002; JT-006 and SEC-009 production retention/restore plus JT-011/JT-012/JT-022 prerequisites. JT-005 foundations are implemented; AI worker activation awaits controlled rollout. Production still exposes ports contrary to the release-branch contract, and JT-007/JT-008/JT-010 lack provider/production verification.
Current evidence
docs/audits/audit-remediation-backlog.mddocs/audits/verification-log.mddocs/verification/sec-001-canonical-origin.mddocs/verification/sec-002-ingress-compose.mddocs/verification/sec-003-microsoft-tenant.mddocs/verification/sec-004-microsoft-identity.mddocs/verification/sec-005a-session-revocation.mddocs/verification/sec-005b-email-ownership.mddocs/verification/core-001-sqlite-provider-parity.mddocs/verification/core-002-route-uniqueness.mddocs/verification/sec-008-attachment-consistency.mddocs/verification/sec-009-account-lifecycle.mddocs/verification/bg-001-tenant-workers.mddocs/verification/ops-001a-durable-operations.mddocs/verification/ops-001b-notifications.mddocs/verification/ops-001c-operation-ui.mddocs/verification/pol-001-free-pro-entitlements.mddocs/verification/pol-002-ai-privacy.mddocs/verification/ai-001-durable-ai-queue.mddocs/verification/ai-002-provider-routing.mddocs/verification/ai-003-strategy-snapshot-queue.mddocs/verification/ai-004-cv-processing-queue.mddocs/verification/ux-001-unified-authentication.mddocs/verification/ux-002-deterministic-theme-state.mddocs/verification/qa-001-job-term-quality.mddocs/verification/career-001-career-workspace.mddocs/verification/career-002-cv-builder.mddocs/verification/mail-001-job-email-hub.mddocs/verification/jobs-001-job-discovery.mddocs/verification/ux-003-kanban-theme.mddocs/verification/product-001-honest-plans.mddocs/verification/ver-001-complete-regression.mddocs/verification/prod-002-ai-evaluation.mddocs/production/production-ai-hardware-assessment.mddocs/production/production-ai-rollout-and-rollback.mddocs/production/ollama-model-benchmark.mddocs/work-programmes/master-work-plan.md