{
  "schema": "leumas.docs.page/1",
  "id": "adapter:domain/resume-scorer",
  "slug": "adapters/domain/resume-scorer",
  "kind": "capabilities",
  "bucket": "package",
  "title": "resume-scorer (engines/adapters/domain/resume-scorer)",
  "name": "resume-scorer",
  "eyebrow": "engines/adapters/domain/resume-scorer",
  "chip": null,
  "summary": "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...",
  "keywords": [
    "resume-scorer",
    "candidate-matching",
    "scorevsjd",
    "skillsgap",
    "atscheck",
    "hazards",
    "footers",
    "keywordmatch"
  ],
  "audience": "both",
  "funnel": {
    "product": null,
    "cta": null
  },
  "body": "# resume-scorer (`engines/adapters/domain/resume-scorer`)\n\nIntelligent resume/CV parsing and candidate-matching microservice — the **read** side of hiring.\nParses raw resume text into structured fields and scores candidates against a job description. Hybrid:\nevery tool has a deterministic heuristic core (regex + token overlap + a skills lexicon) that runs fully\noffline; `parse` optionally enriches via a reachable LLM and tags results `mode: 'heuristic' | 'llm'`.\nNever requires a model; a down model never throws.\n\n## Tools\n\n| tool | input | what it does |\n|------|-------|--------------|\n| `parse` | `{ resume }` | `{ contact{name,email,phone}, links, summary, skills, experience{totalYears,titles,periods}, education{degrees} }`. |\n| `scoreVsJd` | `{ resume, jd }` | 0–100 match %, verdict, skills/keywords/years breakdown, matched & missing lists. |\n| `skillsGap` | `{ resume, skills }` | have / missing / extra skills + coverage % vs a required set. |\n| `atsCheck` | `{ resume }` | Flags ATS parsing hazards (columns/tables, headers/footers, emoji, missing sections) + 0–100 ATS score. |\n| `keywordMatch` | `{ resume, keywords }` | Per-keyword count/density, coverage %, matched & missing. |\n| `seniorityEstimate` | `{ resume }` | Infers level (intern→vp) from years, titles and leadership signals with a confidence. |\n\n## Usage\n\n```js\nimport rs from './index.js';\nrs.adapters.scoreVsJd({ resume, jd });\nrs.adapters.skillsGap({ resume, skills: ['python', 'aws', 'kubernetes'] });\nrs.adapters.atsCheck({ resume });\n```\n\n## DRY boundaries\n\n- This is the **read** side (parse & score candidates); `jd-writer` is the **write** side (author the\n  posting); `interview-kit` is the **assess** side (questions/scorecards).\n- Skill/keyword extraction is **hiring-domain** (a curated skills lexicon), not the generic tokenizer of\n  `nlp` / `a-text`.\n- Self-contained: no cross-pack imports except `../_shared/llm.js` for the optional AI mode.\n",
  "source": {
    "path": "shared/engines/adapters/domain/resume-scorer/README.md",
    "blobSha": "",
    "commit": "",
    "committedAt": "",
    "provenance": "no-git",
    "bytes": 2143,
    "hash": "e60b82a2051ffe4b23d13b798212b10a6e8a36a7"
  },
  "urls": {
    "html": "/p/adapters/domain/resume-scorer",
    "json": "/docs/adapters/domain/resume-scorer.json",
    "md": "/docs/adapters/domain/resume-scorer.md"
  },
  "links": {
    "composes": [],
    "usedBy": [],
    "product": [],
    "howTo": [],
    "skills": []
  }
}
