pulse-cv / docs /validation-report.md
qyam23's picture
Deploy PulseCV Docker Space
192ba94 verified
|
Raw
History Blame Contribute Delete
3.86 kB
# Validation Report
## Scope
This validation report covers the first evidence-based pivot release for the manufacturing vertical.
## Checked in this release
- Typed requirement extraction from pasted JD text
- Typed requirement extraction from LinkedIn job pages
- Requirement-by-requirement evidence mapping from CV text
- Grouped result rendering in the public UI
- Evidence Map rendering
- JD Quality Review rendering
- Manufacturing benchmark scaffolding and starter fixtures
- Product and quality telemetry capture
- New parse endpoints:
- `/api/jd/parse`
- `/api/cv/parse`
- `/api/jd/lint`
- `/api/analytics/summary`
- Backward-compatible fields still present in `/api/analyze`
## What the release now proves
- The product no longer depends on flat keyword matching as its primary output model.
- Requirements are grouped and typed.
- Each requirement can carry evidence, support level, and confidence.
- The final score is decomposed and secondary.
- The UI exposes uncertainty and JD quality warnings.
## Commands executed successfully
- `npm run lint`
- `npm run build`
- `npm run benchmark:manufacturing`
- `POST /api/analyze` against a pasted Hebrew factory-engineer JD
- `POST /api/scrape` against LinkedIn job URL `https://www.linkedin.com/jobs/view/4398015632/`
## Local runtime checks
- `GET /health`
- returned `product=Pulse CV - Evidence-Based Hiring Intelligence`
- returned `scoringMode=evidence-based-deterministic`
- returned `vertical=manufacturing`
- `GET /`
- returned HTTP 200 locally
- `POST /api/jd/parse`
- returned typed requirement groups for a manufacturing JD
- `POST /api/analyze`
- returned decomposed scoring, evidence map, JD quality warnings, and candidate/recruiter recommendations
- `GET /api/analytics/summary`
- returned telemetry summary JSON
## Behavior checks confirmed
- Strong manufacturing-fit sample produced:
- explicit tool matches (`AutoCAD`, `SolidWorks`)
- explicit methods/domain matches (`Continuous Improvement`, `Quality Management`, `Manufacturing`)
- decomposed score instead of flat ATS-only output
- Partial-fit industrial leader sample stayed meaningfully lower than the strong-fit case
- Maintenance-heavy sample against manufacturing-engineer JD stayed low-fit and exposed real tool/domain gaps
- Seniority extraction no longer emits a flat `individual_contributor` requirement for non-leadership roles
- Must-have calibration is stricter:
- role title and years-experience remain mandatory by default
- tools, education, and language only become must-haves when the JD wording actually marks them as required
- broad domain/methodology signals are no longer auto-promoted to must-have unless the source line carries explicit requirement context
- AI no longer overrides deterministic recommendations or bullet rewrites
- AI no longer overrides the deterministic profile summary / tailored bio in the main payload
## Remaining weaknesses
- Manufacturing pack is curated and useful, but still compact rather than benchmark-complete.
- Recruiter and hiring manager views are beta-level surfaces, not separate polished products yet.
- AI rewrite quality still depends on provider availability.
- Benchmark scaffolding now exists, but a full human-reviewed corpus is still a next-step task.
## Benchmark harness
- Script: `npm run benchmark:manufacturing`
- Fixtures: `benchmark/manufacturing/cases.json`
- Current benchmark asserts:
- primary domain detection
- expected role family where relevant
- score range guardrails
- matched requirement expectations
- missing requirement expectations
## Telemetry added
- Product events:
- `analysis.started`
- `jd.parse`
- `cv.parse`
- `feedback.correction`
- Quality events:
- `analysis.completed`
- `analysis.fallback`
- `jd.lint`
- Summary endpoint:
- `GET /api/analytics/summary`