# CV pack validation — 2026-09-16

**Implementation validated locally; publication and production checks remain pending.** No universal ATS score, third-party hiring-platform compatibility or interview outcome is promised.

## Source and ownership

The maintained website/resume-builder is `aiescu/geek-bye-landing`. The canonical portable renderer, strict parser and candidate schema live in `aiescu/agent-skills/skills/geekbye-cv-kit`; `SOURCE.json` pins the website snapshot to a committed revision and file hashes. The existing backend parser/scorer is reused, not replaced by a competing scoring product.

Issue #291's verified project dates, technologies and links fit the same data model. This does not implement its separate proposed portfolio generator. The retired standalone resume-builder checkout contains sunset redirects; deployment of those redirects is not inferred from its source.

## Acceptance protocol

The original thresholds were **ATS compatibility >=80 and parse-rate >=88**, plus the stricter **100% recovery of required candidate fields**, exact role/date associations and no unresolved template-caused errors. Overall/job-match results are informational.

Before the new run, the protocol was corrected explicitly: the original scoring prompt demanded artificial minimum problems, penalized honest nonnumeric outcomes and estimated unseen PDF layout/parsing from text. The corrected backend rubric marks geometry, file format and measured parsing as unassessed. Its remaining ATS score is a **text-model estimate**, with the >=80 threshold unchanged. The >=88 parse-rate threshold now applies to **measured exact fixture-field recovery** (scalar values plus array cardinality); the stricter 100% issue requirement also remains. A recovery rate of 88–99 therefore still fails overall acceptance. This is a measurement correction, not a claim that the old failed run passed. Historical reports remain under `evidence/legacy-rubric/`. The initial v2 results are also retained under `evidence/v2-before-neutral-education-label/`; the current run uses the neutral “Education date” caption so a date never implies degree completion.

All variants use the same two fictional candidates and `target-job.txt`. PDF hashes bind extraction, service results and both controlled-form paths to the shipped bytes. Expected JSON is opened only after extraction/model execution, and after form readback for browser comparison. No real application is submitted.

## Current measured results

Actual existing `ResumeAIService` + formatter, backend revision `f36a0af0d589a9ab3f866682635176677f0ef68e`, model `gemini-3.1-flash-lite`. Each `geekbye-ai.json` records the precise rubric hash, date, target job, source revision, raw result and limitations. Recognized kit text uses the backend's strict grammar adapter; ordinary CVs retain generic AI fallback. This proves the emitted kit contract, not lossless generic AI extraction.

| Layout   | Fixture      | Pages | Overall estimate | ATS text estimate | Exact recovery | Controlled form: independent / backend |
| -------- | ------------ | ----- | ---------------- | ----------------- | -------------- | -------------------------------------- |
| Research | Early career | 1     | 92               | 95                | 100%           | 29/29 / 29/29                          |
| Research | Senior       | 2     | 92               | 95                | 100%           | 53/53 / 53/53                          |
| Compact  | Early career | 1     | 92               | 95                | 100%           | 29/29 / 29/29                          |
| Compact  | Senior       | 1     | 92               | 95                | 100%           | 53/53 / 53/53                          |
| Extended | Early career | 1     | 92               | 95                | 100%           | 29/29 / 29/29                          |
| Extended | Senior       | 2     | 92               | 95                | 100%           | 53/53 / 53/53                          |

All six pass the stated gates. Model variation is not interpreted as proof that one layout is better. The strict comparison includes 35 assertions for early-career and 59 for senior records, including empty collections/cardinality. Poppler and pypdf independently preserve every field; controlled forms use only their PDF-derived parser output or the backend's PDF-text-derived candidate, never expected values to fill fields.

The installed skill additionally compiles eight CV/letter cases across layouts, English/Romanian narratives, A4/Letter, Unicode, year-only dates, partial data and an actual synthetic publication. Both extractors match the CV JSON exactly. Ambiguous wording remains unresolved rather than becoming an invented month. See the skills repository's `runtime-evidence.json` and paired drafting evaluation; deterministic rendering is not model-behavior evidence.

Visual inspection covered template previews, the worked letter and Unicode publication page: readable text, visible URLs, no clipping or missing glyphs. Tectonic reports no overfull boxes for accepted artifacts. Latin Modern's common ligatures/kerning are disabled where needed for reliable extraction. Other writing systems are not validated by Latin-script examples.

## Historical results retained

The original rubric produced ATS estimates 75/88 (research early/senior), 75/88 (compact), and 80/88 (extended), and invented parse-rate opinions of 85–92. Its extraction schema lost fields and could paraphrase descriptions. Those failures remain in the historical JSON and are not relabeled as passing. The corrected schema/adapter, source-preserving formatter and transparent rubric address their causes without adding fictional metrics or changing fixture content.

No Greenhouse or other vendor account/import was tested. [Greenhouse parsing guidance](https://support.greenhouse.io/hc/en-us/articles/200989175-Unsuccessful-resume-parse) informed layout checks but is not evidence of an actual vendor import. Human factual review remains necessary for rewritten prose.

## Reproduce

Use Tectonic 0.16.9, Poppler, and the pinned Python packages in `scripts/cv-templates/requirements.txt`.

```sh
python -m unittest discover -s scripts/cv-templates -p 'test_*.py'
python scripts/cv-templates/sync_skill.py --source /path/to/committed/agent-skills
python scripts/cv-templates/build.py
python scripts/cv-templates/validate.py
node scripts/cv-templates/autofill.mjs
# Run from an existing backend configuration with authorized provider credentials:
/path/to/backend/node_modules/.bin/tsx /path/to/landing/scripts/cv-templates/score.ts /path/to/backend /path/to/landing
# Back in landing, with Playwright/Chromium installed:
CV_AUTOFILL_PARSER=backend node scripts/cv-templates/autofill.mjs
python scripts/cv-templates/package.py
```

`PLAYWRIGHT_MODULE` can point to an installed module; `PLAYWRIGHT_CHANNEL=chrome` uses installed Chrome. Rebuilding invalidates ZIPs. Packaging refuses missing/stale/failed independent extraction, backend recovery, model-score or controlled-form evidence. Empty templates have no invented score.

## Delivery, analytics and release limits

[Landing PR296](https://github.com/aiescu/geek-bye-landing/pull/296), [skills PR13](https://github.com/aiescu/agent-skills/pull/13), [backend PR267](https://github.com/aiescu/geek-bye-backend/pull/267). The companion route is `/tools/resume-builder/templates`, with fictional template examples and a complete fictional CV/letter ZIP. All 33 supported page languages have localized copy, self-referencing canonicals and sitemap entries. Downloadable example documents remain in their original language. Local build/browser checks do not prove a production deployment.

Deploy landing's visible text-estimate limits, optional-score guards and intact skill-array request **before** the backend stops returning unmeasured score dimensions. Install the skill from the verified public feature branch until main is published; main install and Skills.sh visibility must be checked independently after release.

Existing consent-aware page views plus `cv_template_action` use only fixed action/layout labels for downloads, previews, ATS starts and rehearsal links. No CV content, job description, personal contact or destination URL enters these events. ATS completion uses the existing tool funnel where available, with no guaranteed connection back to a download. Repository-to-signup/paid attribution and stripped-UTM behavior remain coordinated with PR295/#288; this work does not duplicate that lane or claim measured revenue. No live traffic, ranking, seven-day referral or 28-day indexing outcome exists yet. The employee handoff names these post-release checks explicitly.
