.claude/skills/job-sourcer/SKILL.md
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.
npx skillsauth add MLGalusha/job-tracker job-sourcerInstall 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 is the top of the application funnel. Its job is to turn "Mason wakes up and wants to know if any of the ~30 companies he cares about posted a new role in his lanes" into a one command answer. It does not apply to jobs. It does not run role-intake. It only surfaces candidates and queues them for Mason to triage.
This is a spec-only skill at initial build. The scraping step is stubbed until Mason picks a strategy (manual paste, RSS where available, headless browser, or a hosted scraper). The skill's contract and data model are the stable parts; the fetch layer is swappable.
target-companies.md is edited and Mason wants an immediate refreshDo not run this skill if:
profile/target-companies.md does not exist or is emptyprofile/target-companies.md — the list of companies to watch, with their job board URLsprofile/preferences.md — lane preferences, skip lanes, comp floor, location rulesdata/sourced-jobs.jsonl — append-only queue (created on first run if missing)data/sourced-jobs.jsonl is one JSON object per line, append-only. Each line:
{
"id": "<ulid>",
"t": "<ISO-8601>",
"company": "<name>",
"company_slug": "<slug>",
"role_title": "<title>",
"role_url": "<url>",
"source": "<careers_page | greenhouse | lever | ashby | workatastartup | manual>",
"first_seen_at": "<ISO-8601>",
"lane_guess": "<founding | ai-engineer | fde | fullstack-ai | local-raleigh | off-lane | unknown>",
"triage_status": "new",
"notes": "<optional>"
}
triage_status is a closed vocabulary:
new — surfaced, not yet reviewedqueued — Mason wants to apply, needs role-intakeskipped — Mason looked and passedapplied — already has an applications/<app_id>/ entryThe sourcer only ever writes new entries. Status transitions happen via a separate triage step (not in this skill).
Parse profile/target-companies.md into a structured list. Each company entry should surface:
Read profile/preferences.md for:
For each company, fetch the current job listings. The fetch layer is abstracted:
fetch plus a light HTML parser. Brittle but works.Initial implementation: manual mode only. The skill prompts Mason to paste the listings for each company that is due for a scan, and parses the paste into structured entries. Other modes are TODO.
For each candidate role, check if an entry with the same role_url already exists in data/sourced-jobs.jsonl. If so, skip. If not, it's new.
Also check data/applications.json for any app_id whose role_url matches. If so, mark the candidate as applied and do not append a new new entry.
Use simple keyword heuristics on the role title and (if fetched) the first paragraph of the JD:
foundingai-engineerfdefullstack-ailocal-raleighunknownThis is intentionally dumb. The real classification happens in role-intake when Mason triages.
Drop any candidate whose lane_guess is in Mason's skip lanes from preferences.md. Keep everything else, even if the lane is unknown.
For each surviving candidate, append a line to data/sourced-jobs.jsonl. Use a ULID for id, ISO-8601 for timestamps.
Write a short markdown digest to stdout (and optionally to applications/_digests/<date>.md):
# Sourced jobs — <date>
**New since last run: <n>**
## By lane
- founding: <n>
- ai-engineer: <n>
- fullstack-ai: <n>
- ...
## Top candidates (hand-picked)
1. **<Company> — <Role>** ([link](<url>)) — <one sentence why it looks good>
2. ...
## Full list
<company>:
- <role title> — <url>
<company>:
- ...
"Top candidates" are the three roles most likely to be worth Mason's time, picked by:
Optionally touch profile/target-companies.md with a "last_scanned" date per company, or write to a sibling data/scan-state.json if editing the profile file feels too heavy.
Print the digest. Under 300 words. Mason should be able to skim it in 30 seconds and decide which ones get role-intake'd.
role-intake from inside this skill. The sourcer's only job is to surface. Mason decides what gets intake'd.new will corrupt Mason's trust in the queue.new. Status transitions happen in triage, not sourcing.data/sourced-jobs.jsonl is append-only. Never rewrite it. If a candidate needs updating (e.g., the role URL changed), append a new entry with a note referencing the old id.new to queued or skipped. Probably a small CLI or a web view. Until then, edit the JSONL by hand.role-intake. That's a separate decision.profile/target-companies.md except for optional last-scanned timestamps.data/sourced-jobs.jsonl. Append only.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
Generate a focused interview study plan for a specific application by combining role.md, company.md, resume.md, and resume-gaps.md into a prioritized study guide with concrete drills, defensibility notes, and a question bank. Produces applications/<app_id>/study-guide.md. Use after a company confirms an interview loop or when Mason says he wants to prep for one.