# resume-scorer (engines/adapters/domain/resume-scorer)

Resume / CV parsing and candidate-matching microservice for recruiters and ATS pipelines: parse raw resume text into structured {contact, skills, experience, education, links, summary}; score a...


Intelligent resume/CV parsing and candidate-matching microservice — the **read** side of hiring.
Parses raw resume text into structured fields and scores candidates against a job description. Hybrid:
every tool has a deterministic heuristic core (regex + token overlap + a skills lexicon) that runs fully
offline; `parse` optionally enriches via a reachable LLM and tags results `mode: 'heuristic' | 'llm'`.
Never requires a model; a down model never throws.

## Tools

| tool | input | what it does |
|------|-------|--------------|
| `parse` | `{ resume }` | `{ contact{name,email,phone}, links, summary, skills, experience{totalYears,titles,periods}, education{degrees} }`. |
| `scoreVsJd` | `{ resume, jd }` | 0–100 match %, verdict, skills/keywords/years breakdown, matched & missing lists. |
| `skillsGap` | `{ resume, skills }` | have / missing / extra skills + coverage % vs a required set. |
| `atsCheck` | `{ resume }` | Flags ATS parsing hazards (columns/tables, headers/footers, emoji, missing sections) + 0–100 ATS score. |
| `keywordMatch` | `{ resume, keywords }` | Per-keyword count/density, coverage %, matched & missing. |
| `seniorityEstimate` | `{ resume }` | Infers level (intern→vp) from years, titles and leadership signals with a confidence. |

## Usage

```js
import rs from './index.js';
rs.adapters.scoreVsJd({ resume, jd });
rs.adapters.skillsGap({ resume, skills: ['python', 'aws', 'kubernetes'] });
rs.adapters.atsCheck({ resume });
```

## DRY boundaries

- This is the **read** side (parse & score candidates); `jd-writer` is the **write** side (author the
  posting); `interview-kit` is the **assess** side (questions/scorecards).
- Skill/keyword extraction is **hiring-domain** (a curated skills lexicon), not the generic tokenizer of
  `nlp` / `a-text`.
- Self-contained: no cross-pack imports except `../_shared/llm.js` for the optional AI mode.


---
Source: shared/engines/adapters/domain/resume-scorer/README.md
Canonical: https://docs.leumas.tech/p/adapters/domain/resume-scorer
