The coworker now knows the project's deterministic helpers for the stages it already performs.
Added
- A loop-stage helper map in the persona. The project ships ~70 npm scripts; the persona documented 6, and none covered stages it explicitly claims to run — so it was reasoning from raw files where a zero-token CLI already existed. Each stage now names its helper:
| Stage | Helper |
|---|---|
| Scan | check-liveness.mjs, archive-posting.mjs |
| Score | jd-skill-gap.mjs, jd-similarity.mjs |
| Tailor | verify-ats.mjs |
| Track | dedup-tracker.mjs, normalize-statuses.mjs, check-table-freshness.mjs |
| Follow up | followup-cadence.mjs |
| Review | weekly-digest.mjs, stats.mjs, salary-gap.mjs, company-history.mjs |
verify-ats.mjsruns alongsidecv:verify-facts, not instead of it — facts checks whether a claim is TRUE, ATS whether a résumé parser can READ it. Two different gates on the same document.followup-cadence.mjsis named as the single source of truth for who is due. The persona is now explicit that due-ness comes from itsurgencyfield (urgent/overdue/waiting/cold) and never from the trackerstatus(applied/responded/interview), which answers a different question. That exact confusion caused a real bug downstream incareer-ops-ui.- Help ×17 gains both facts in §5 "The workflow, stage by stage". Heading structure untouched — the 17-locale parity gate stays green.
Verified
Full re-audit against the live projects found no stale claims — this release adds capability rather than correcting drift. All 6 documented npm run scripts and their .mjs targets exist; every scan.mjs flag the persona lists (--dry-run, --company, --since, --posted-after, --verify, --quiet) is real; web-ui/bin/start.sh and port 4317 are current; every user-layer path resolves; the 12 newly-referenced helpers all exist. All six external URLs and the install.sh raw URL return 200.
scripts/validate-persona.py — INSTALLABLE ✓ · Help parity ×17 (12 H2) ✓
career-ops-coworker.zip attached for OpenWorker → Install a coworker → .zip.