# 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`