Files
jobtrackingapp/docs/verification/qa-001-job-term-quality.md
T
cesnimda 3143568df0
CI and Deploy / test (pull_request) Failing after 1m33s
CI and Deploy / deploy (pull_request) Has been skipped
docs(match): record term-quality evidence
2026-08-09 18:49:41 +02:00

53 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.