# Resume Pipeline QA and Recruiter-Outreach Patterns

Condensed reusable detail from the 2026-07-23 Business Analyst and Celigo Campaign Manager runs.

## Role-specific ATS scoring

Do not use the bundled Pantheon/RevOps defaults as the primary score for every JD.

Create two JSON files per role:

- `clusters.json`: 6–8 semantic groups using mostly single-token concepts. Keep tool/platform terms separate from role outcomes so a platform gap does not erase evidence of transferable skill.
- `phrases.json`: exact multi-word JD language and named platforms.

Report both:

1. cluster coverage (breadth), and
2. direct-phrase coverage (specificity).

List intentional misses explicitly. Never insert an unverified platform, certification, employer, metric, or domain claim to improve either score.

### Truth checks worth automating

Before delivery, assert:

- all verified master-resume employers remain present;
- known fabricated employers are absent;
- `familiar` tools have not been promoted to expert/deep hands-on;
- unverified required tools/certifications are absent;
- ecommerce or vertical evidence remains tied to the employer/client where it occurred;
- dates and locations appear in the correct fields after DOCX generation.

## DOCX renderer smoke test

The active JSON schema uses:

`Title | Company | Location | Dates`

The renderer must place:

- title + dates on the role line;
- company + location on the next line.

After touching `parse_header()`, render one fixture and inspect DOCX text before running a real application.

## Layout verification loop

1. Save the DOCX to the synced vault.
2. Read it back with `python-docx`; verify paragraph count and key role lines.
3. Convert to PDF.
4. Confirm page count.
5. Render every page to PNG.
6. Visually inspect every page for clipping, overlap, orphaned headings, broken title/date placement, unreadable density, or a nearly empty spill page.
7. Tighten spacing/font size or add keep-with-next settings, rebuild, and repeat.

Useful pagination controls:

- section headings: `keep_with_next = True`;
- role line: keep with company line;
- company line: keep with first bullet;
- compacting from 11 pt/13 pt line spacing to 10.5 pt/12 pt can eliminate a third page without dropping jobs.

On hosts where `/root` is read-only, run LibreOffice with writable profile/cache/config paths, for example:

```bash
HOME=/root/.hermes \
XDG_CACHE_HOME=/root/.hermes/lo-cache \
XDG_CONFIG_HOME=/root/.hermes/lo-config \
libreoffice -env:UserInstallation=file:///root/.hermes/lo-profile \
  --headless --convert-to pdf --outdir <pdf-dir> <resume.docx>
```

## Recruiter DM distinction

- "Draft the DM" means prepare text.
- "Send the DM" is an external side effect and requires an authenticated LinkedIn/messaging tool plus a verifiable success response.
- Without that tool, save the draft to the vault, identify the exact attachment, and say the send remains manual. Never imply that saving a draft or producing a reply equals sending.

For recruiter-supplied roles with undisclosed terms, ask for client, rate/compensation, employment type, duration, benefits, hours/time zone, and exact remote/onsite expectations before authorizing submission.
