docs(match): record term-quality evidence
CI and Deploy / test (pull_request) Failing after 1m33s
CI and Deploy / deploy (pull_request) Has been skipped

This commit is contained in:
cesnimda
2026-08-09 18:49:41 +02:00
parent da1aa8bb2a
commit 3143568df0
8 changed files with 100 additions and 24 deletions
@@ -45,5 +45,6 @@ This is the rolling action-level evidence index. `PASS (automated/runtime)` is n
| CV processing | retry provenance, durable refresh state and cancel/retry controls | PASS (backend + component tests) | BLOCKED | NOT RUN | `ai-004-cv-processing-queue.md` |
| Authentication UI | unified username/password and provider alternatives; invalid/cancel/return behavior | PASS (components; mocked providers) | PARTIAL — local dark-theme form at 375/768/1440 | NOT RUN | `ux-001-unified-authentication.md` |
| Theme state | Light/Dark/System precedence, login/logout scope, refresh/navigation and two-tab synchronization | PASS (state/provider/bootstrap tests) | PASS/PARTIAL — anonymous local browser at 375/768/1440 | NOT RUN | `ux-002-deterministic-theme-state.md` |
| Job match terms | bilingual/noisy/short/technology-heavy/filler extraction and honest labels | PASS (seven fixtures + component tests) | NOT RUN | NOT RUN | `qa-001-job-term-quality.md` |
Remaining product actions are `NOT STARTED` in the master plan and will be added as their work packages enter verification. The in-app browser is available for local UI checks; configured/real-provider and production access are not documented/configured.
@@ -0,0 +1,52 @@
# QA-001 job-analysis and important-term quality
Updated: 2026-08-09
Status: `IMPLEMENTED — NOT VERIFIED`. Deterministic fixtures, backend/frontend regressions and production build pass. Browser and production presentation checks remain.
## Revalidated execution path
- URL imports already convert structured job-posting HTML to text and run lightweight Norwegian/English language detection plus `SkillTagger`. Manual descriptions and notes can still contain HTML/noise.
- The visible problematic terms originate in `JobCvMatchService`: curated skills are combined with frequency-ranked single tokens from description, translated description and notes. Its stop list was English-only and did not clean raw HTML at this boundary.
- The separate application-analysis endpoint exposes only curated tags in its `Keywords` field, and the current Analysis UI does not render that field. No AI prompt produces the deterministic match terms.
- Match output is recomputed on every request; there is no stored analysis/result row or version to migrate. Missing-term learning items are derived through `SyncLearningRecommendationsAsync`, which preserves user-completed/dismissed decisions and auto-completes only obsolete pending generated items.
## Implemented contract
- The shared matcher removes script/style/navigation/header/footer blocks, remaining tags and decoded source chrome before analysis while preserving line boundaries.
- English and Norwegian function words, generic recruitment filler and common consent/navigation text are suppressed by category, not only by the reported examples.
- Stop words split bounded phrase runs. Useful two-to-four-word responsibility/domain phrases are ranked ahead of remaining single terms; tokens already represented by a phrase are not repeated as isolated advice.
- Curated, canonical tags now preserve C++, ASP.NET Core, Entity Framework Core, Go/Golang context, Next.js, Terraform, Azure DevOps, Kafka, Redis and Linux. Existing C#, .NET, Node.js and CI/CD punctuation remains intact.
- The UI says “important terms” rather than implying opaque SEO-style keywords, with equivalent Norwegian copy.
- Deterministic processing remains local and free; no model or external provider was added.
## Verification
- Seven required fixtures pass: Norwegian, English, mixed, short, noisy HTML, technology-heavy and repeated recruitment filler.
- Final focused matcher: 15/15. Wider affected backend set: 54/54.
- Full backend: 601/601.
- Focused match/analysis UI: 13/13; final label test 3/3.
- Full frontend: 48/48 suites and 172/172 tests.
- Production frontend build/TypeScript and `git diff --check`: pass.
## Version and regeneration behavior
There are no historical analysis blobs to silently rewrite. The next GET recomputes from current job/CV text. When the missing-term set changes, existing sync logic creates new generated learning items, auto-completes obsolete pending generated items, and leaves explicit user decisions intact. No schema or data migration is required.
## Remaining gates
- The browser session had already been finalized after UX-002; QA-001 label/chip presentation, empty/error/long Norwegian content and 375/768/1440 Light/Dark browser checks were not run in this package.
- Synthetic production comparison and rollout monitoring remain unavailable without deployment access.
- The curated vocabulary is intentionally bounded. New technologies should be added with representative false-positive tests rather than learned from private job data.
## Evidence
- Evidence index: `docs/audits/evidence/qa-001/README.md`
- Commands/results: `docs/audits/verification-log.md` V-114V-116
- Backend fixtures: `JobTrackerApi.Tests/JobCvMatchServiceTests.cs`
- Frontend label coverage: `job-tracker-ui/src/match-score-panel.test.tsx`
- Implementation commit: `da1aa8b`
## Rollback
Revert `da1aa8b`. No database downgrade, dependency rollback or cache purge is required. Existing generated learning decisions remain in history; the next request will derive the older term set again.