Files
cesnimda b176a44627 docs: reorganize tree, restore architecture + research from archive, add Phase 0 reports
Active docs/ was stub scaffolding while the real docs sat in docs/_archive/.
Restore and correct them, and record the Phase 0 work.

- docs/architecture/current.md: verified system map (from archived SYSTEM_OVERVIEW,
  9 corrections against code).
- docs/research/competitors.md: sourced competitor analysis (from archived
  PRODUCT_RESEARCH, feature matrix corrected).
- docs/decisions/ADR-002-job-application-model.md: the Job/JobApplication split.
- docs/application-discovery-report.md, docs/implementation-roadmap.md,
  docs/phase-0-foundation-report.md, docs/career-workspace-branch-assessment.md.
- Remove 10 zero-byte placeholder files that advertised content that never existed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 17:04:32 +02:00

4.0 KiB
Raw Permalink Blame History

Merge Request — Wave 0 quick wins + Tier-1/Tier-2 features

Branch: chore/wave0-quick-winsmain Scope: 24 commits · 62 files · +3,165 / 489 Status: all tests green (backend 135, frontend 23 suites / 54 tests), production build compiles.

Prepared for human review. Do not auto-merge. One operator action is required after merge (DataProtection key rotation — see Known limitations).


Summary

Delivers the first two roadmap tiers plus the engineering-health groundwork, developed as small conventional commits. Two design principles run through it:

  1. Deterministic over "AI-guessy." Match scoring, status suggestions, and pipeline logic are pure/deterministic — instant, reproducible, and safe (the user confirms every state change). This directly answers the market's most common complaint (hallucinated/generic AI output).
  2. One pathway, not two. The bookmarklet and the PWA share-target feed a single /?add= capture flow rather than parallel implementations.

What's included

Engineering health (Wave 0)

  • security: untracked committed DataProtection keys + daily exports; removed dead legacy controllers.
  • feat: automated daily SQLite backups (VACUUM INTO, retention, startup catch-up) — prod previously had no automated backup on Linux.
  • ci: run the entire frontend suite (the old whitelist was hiding 3 broken suites, now fixed).
  • feat: dev-only OpenAPI at /openapi/v1.json; feat: structured salary fields.

Tier-1 features

  • Match score (GET /jobapplications/{id}/match-score) — deterministic CV↔job keyword coverage (0100) + matched/missing keywords + section coverage. Instant panel on the Candidate Fit tab.
  • Canonical pipelineJobPipeline single source of truth; status normalized on write (custom values preserved); UI deduped across 5 files; GET .../pipeline.
  • Analytics v2 — time-in-stage medians (from StatusChanged history) + funnel driven by the pipeline (fixes a bug that omitted the Waiting stage).
  • Status suggestions — deterministic email→status classifier surfaced as a human-confirmed banner.

Tier-2 features

  • Bookmarklet quick-capture (Settings) reusing jobimport/preview.
  • Installable PWA with a mobile share-target into the same capture flow.

Quality

  • Phase-6 security review (docs/SECURITY_REPORT.md): tenant isolation on new endpoints verified + regression-tested; no injection/ReDoS; dev-only OpenAPI.
  • Bug fixes: SkillTagger C#/.NET regex (silently missed those skills everywhere), a React stale-closure, a duplicated DB query, and 3 pre-existing hidden test failures.

Test coverage added

New pure/unit-tested services: JobCvMatchService (7), JobPipeline (14), StageAnalytics (4), EmailStatusClassifier (7). New endpoint integration + authorization tests (match-score, status-suggestion). New frontend tests: match-score panel, status-suggestion banner, pipeline, quick-capture, capture-url resolution.

Docs

New: docs/SYSTEM_OVERVIEW.md, docs/PRODUCT_RESEARCH.md, docs/ROADMAP.md, docs/SECURITY_REPORT.md. README updated with the new endpoints, backup/pipeline config, and quick-capture/PWA notes.

Known limitations / follow-ups

  • ACTION REQUIRED (security): the removed DataProtection key XMLs remain in git history. Rotate them on the production host after merge (see SECURITY_REPORT.md §6).
  • Per-user custom pipeline stages were deliberately deferred (unproven demand; large surface).
  • No offline service worker by design — the app deploys frequently and an aggressive cache would risk serving stale builds. The PWA is installable and share-capable without it.
  • Not yet done (future branches): interview hub (M3), contacts CRM (M4), god-controller decomposition, performance pass, Vite migration.

Reviewer notes

  • Repo quirk: controllers/services compile via the JobTrackerBackend library, not the JobTrackerApi host project (see docs/SYSTEM_OVERVIEW.md §2).
  • All AI-adjacent features are deterministic and make no model calls.