.agents/skills/cover-letter-writer/SKILL.md
Generate a tailored cover letter for a specific job application by combining role.md, company.md, resume.md, the cover-letter-base template, and profile/voice.md. Produces applications/<app_id>/cover-letter.md. Runs after company-research. Enforces the One-Take Rule and per-lane on/off logic — will refuse to generate for lanes where a cover letter is negative signal.
npx skillsauth add MLGalusha/job-tracker cover-letter-writerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill produces applications/<app_id>/cover-letter.md. It is the highest voice-risk skill in the system — a cover letter that sounds generic or AI-drafted is strictly worse than no cover letter at all. This version is rebuilt on notes/research/cover-letter-research.md, notes/research/2026-ai-hiring-shift.md, and notes/research/SYNTHESIS.md.
Core reframes (from research):
Read role.md's lane and the target company's engineering culture signals from company.md. Then:
| Lane + company type | Cover letter? |
|---|---|
| founding at engineer-led startup (Zed, Cursor, Cognition, most YC) | OFF — recommend outreach + application-artifact instead |
| ai-engineer at AI lab (Anthropic, OpenAI) | ON — high-value, reviewer reads them carefully |
| ai-engineer at YC startup | OFF unless company explicitly requests one |
| fde at Anthropic / OpenAI / larger employer | ON |
| fullstack-ai at series-A+ with formal hiring loop | ON |
| fullstack-ai at small engineer-led startup | OFF |
| local-raleigh (any size) | ON — slightly more formal, follows local-employer conventions |
| off-lane | OFF — do not draft, question whether Mason should apply |
If the lane is OFF: stop before drafting. Report to Mason: "Cover letter is OFF for this lane/company combo per the research. Recommended path: outreach skill (cold email) + application-artifact if company.md scored artifact_fit: strong. Want to proceed that way, or override and draft a cover letter anyway?" Then wait for input.
If Mason overrides, draft the letter but flag it in the report as "drafted against the lane recommendation."
Do not run this skill if:
role.md does not exist → run role-intake firstresume.md does not exist → run resume-tailor firstcompany.md does not exist → run company-research first. The letter cannot pass the One-Take check without grounded decisions from company.md.role.md has recommended_action: skipcover-letter.md has visible Mason hand edits and he hasn't said to overwriteapplications/<app_id>/role.mdapplications/<app_id>/resume.mdapplications/<app_id>/company.md with at least one grounded decision (hard requirement)profile/voice.md, profile/wins.md, profile/story.mdtemplates/cover-letter-base.mdEvery sentence must pass every applicable rule in profile/voice.md. The blocking ones for this skill:
Read in this order:
applications/<app_id>/role.md — whole fileapplications/<app_id>/company.md — whole file. The decisions[] section is the gold; the artifact_fit and people[] also feed the letter.applications/<app_id>/resume.md — to align lead project with what the resume leads withprofile/voice.md — whole file, you will audit against itprofile/wins.md — for quotable linesprofile/story.md — for narrative arctemplates/cover-letter-base.md — structural skeletonprofile/projects/<name>.md for the one or two projects you plan to lead withApply the table above. If OFF, stop and report. If ON or override, continue.
| Lane | Formality (1-6 scale) | Tone |
|---|---|---|
| founding (override) | 4 | Confident, fast-shipping, thesis-forward |
| ai-engineer (Anthropic / OpenAI) | 5 | Confident, production-AI-forward, concrete on the pipeline |
| fde | 5 | Confident, customer-translation-forward |
| fullstack-ai | 4-5 | Confident, shipping-velocity-forward |
| local-raleigh | 5-6 | Slightly more formal, may include local context |
Never above 6.
Default: VTR. Exceptions:
Lead project in the cover letter should match or intentionally complement the lead project in the resume.
From company.md's decisions[] section, pick the one grounded decision that Mason has the strongest opinion on. The One-Take is a sentence (or two) that:
If no decisions[] entry is tagged grounded, the skill refuses to draft the letter. Report: "Cannot write a cover letter that passes the One-Take check. company.md has zero grounded decisions. Need to rerun company-research with additional primary-source attempts (run the product, read the source, read founder writing), or pick a different target."
Follow cover-letter-base.md skeleton but compressed. The old 450-word budget is retired.
Paragraph 1 — the hook. Story-driven or thesis-driven opener. Two or three sentences. Land the connection to the role.
Paragraph 2 — the lead project with numbers. One project, concrete verbs, at least one real number, one sentence bridge to the role.
Paragraph 3 — the One-Take. This is the new requirement. State Mason's opinion on the specific decision from step 5, grounded in something he'd actually touched or read. This paragraph is the reason the letter exists.
Paragraph 4 — the ask. Two or three sentences. State the ask. End with forward momentum. No "thank you for your time." No "I hope this finds you well."
Sign-off per cover-letter-base.md.
company.md decisionScan the draft against profile/voice.md. Blocking violations:
—)~)→)Blocking absences:
When you find a violation, rewrite the whole sentence, don't patch. Voice is rhythm.
After the voice audit, do a dedicated One-Take pass. Ask these questions about paragraph 3:
decisions[] entry from company.md tagged grounded? If no, fail.If any fail, rewrite the paragraph. If after two rewrites it still fails, stop and tell Mason: "Can't produce a passing One-Take from the current company.md. The grounded decision at index N isn't specific enough, or Mason doesn't have an opinion on it. Options: rerun company-research for different decisions, give me a decision you have an opinion on directly, or skip the cover letter for this target."
Write to applications/<app_id>/cover-letter.md. Markdown. Plain text that could paste cleanly into a web form.
cd ~/Workspace/job && pnpm log cover_letter_updated --app_id=<app_id> --path=applications/<app_id>/cover-letter.md --summary="Initial draft for <role>"
Under 250 words. Include:
company.md made strong or weak about the lettercover-letter-base.md. Template is skeleton, not script.company.md, it doesn't go in the letter.resume-tailor.company-research.data/ files directly. Uses pnpm log cover_letter_updated.cover-letter.md with hand edits without asking.outreach skill.application-artifact.data-ai
Turn a job posting URL or pasted JD into a structured role.md file inside applications/<app_id>/. Extracts company, role, JD text, inferred lane (founding/AI eng/FDE/full-stack/local), required vs nice-to-have skills, fit notes against Mason's profile, and an honest truthfulness-gap list. Use whenever Mason shares a job link, pastes a JD, or asks "is this worth applying to?".
testing
Generate a tailored resume for a specific job application by combining Mason's profile, the role.md analysis, and the resume-base template. Every claim must trace back to profile/skills.md (Tier A/B), profile/projects/*.md, or profile/wins.md. Use whenever Mason wants a resume for a specific role he's decided to apply to.
testing
Draft a cold email or warm-intro-request message to a specific person at a target company. Produces applications/<app_id>/outreach/<slug>.md and logs a communication_sent event. Runs after company-research. Enforces the One-Take Rule — refuses to draft without a grounded decision from company.md. This is the highest-payoff channel per 2026 hiring research.
testing
Periodically scan a curated list of target company job boards for new postings that match Mason's lanes, and append candidate roles to a sourced-jobs queue for triage. Reads profile/target-companies.md and profile/preferences.md. Produces data/sourced-jobs.jsonl and a short daily digest. Use when Mason says "check for new jobs" or when running on a schedule.