# jd-writer (engines/adapters/domain/jd-writer)

Job-description authoring microservice for recruiters, hiring managers and HR: generate a complete JD (summary, responsibilities, requirements, benefits, equal-opportunity statement) from {role...


Intelligent job-description authoring microservice. Turns `{role, level, company}` into a complete,
inclusive job post — and audits existing ones. Hybrid: every tool has a deterministic heuristic/template
core that runs fully offline; generative tools optionally enrich via a reachable LLM and tag results
`mode: 'heuristic' | 'llm'` (never require a model, never throw on a down model).

## Tools

| tool | input | what it does |
|------|-------|--------------|
| `write` | `{ role, level?, company?, remote?, industry? }` | Full JD: title, summary, experience range, responsibilities, requirements, nice-to-haves, benefits, EEO statement. |
| `optimize` | `{ text }` | Readability (Flesch + grade level), bias flag count, concrete fix list, 0–100 score. |
| `inclusivityCheck` | `{ text }` | Flags gendered / ageist / ableist / exclusionary / hype wording with neutral rewrites + an auto-rewritten draft and inclusivity score. |
| `seniorityCalibrate` | `{ role, level }` | Recommends title, years range, scope, autonomy, leadership expectation for the level. |
| `requirements` | `{ role, level }` | Must-have vs nice-to-have + a competency matrix with expected proficiency. |
| `benefitsList` | `{ remote?, count? }` | Competitive, categorized benefits/perks list (health/time/money/growth/flexibility/culture/perks). |

Levels: `intern, junior, mid, senior, lead, staff, principal, manager, director, vp` (aliases: entry→junior, sr→senior, jr→junior, mgr→manager…).

## Usage

```js
import jd from './index.js';
await jd.adapters.write({ role: 'Backend Engineer', level: 'senior', company: 'Acme', remote: true });
jd.adapters.inclusivityCheck({ text: 'We want a young rockstar ninja who is a great culture fit.' });
jd.adapters.seniorityCalibrate({ role: 'Product Manager', level: 'lead' });
```

## DRY boundaries

- Bias/inclusivity here is **JD-domain** (biased job wording + rewrites) — not the generic text stats
  of `a-text` / `nlp`.
- `jd-writer` is the **write** side (author the posting); `resume-scorer` is the **read** side (score
  candidates against a JD) and `interview-kit` is the **assess** side.
- Self-contained: no cross-pack imports except `../_shared/llm.js` for the optional AI mode.


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