.agents/skills/application-logger/SKILL.md
Log anything about a job application — new application, status change, email received/sent, phone call, note, artifact updated. Use this whenever Mason mentions a job he saw, applied to, heard back from, or wants to track. Natural language in, validated events out. Wraps the pnpm log write gate so the data layer stays correct.
npx skillsauth add MLGalusha/job-tracker application-loggerInstall 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 only correct way to mutate the job tracker's state. It takes natural-language intent from Mason and produces one or more validated event-log commands via the pnpm log write gate.
Never edit data/events.jsonl, data/applications.json, data/communications.json, or any derived file directly. Never ask the user to. Every mutation flows through pnpm log.
Use it whenever Mason says anything that implies a state change on an application. Examples:
If Mason is just talking about a role without implying a state change ("I'm thinking about applying to X" is fine to discuss without logging — "track X" or "I applied to X" is not), don't log. When in doubt, ask.
Parse Mason's message into one or more of the nine event types. Never invent a new type. The closed vocabulary is:
| Event type | When to use it | Required flags |
|---|---|---|
| application_created | First time Mason mentions a role with intent to track it (not just "interesting") | --company, --role, (optional) --url, --source, --status |
| status_changed | Mason says he applied / got a screen / did an interview / got an offer / got rejected / withdrew / hasn't heard back in >2 weeks (ghosted) | --app_id, --to (optional --from, --reason) |
| communication_received | Recruiter/hiring manager/someone at the company contacted Mason | --app_id, --channel, --summary (optional --from, --message_ref) |
| communication_sent | Mason sent them something | --app_id, --channel, --summary (optional --to, --message_ref) |
| note_added | Free-form observation that doesn't fit another type | --app_id, --note |
| resume_updated | A tailored resume was written/updated | --app_id, --path (optional --summary) |
| cover_letter_updated | A tailored cover letter was written/updated | --app_id, --path (optional --summary) |
| research_completed | Company research file was written | --app_id, --path |
| study_guide_generated | Interview-prep study guide was written | --app_id, --path |
app_idEvery event except application_created needs an app_id.
app_id by reading data/applications.json and fuzzy-matching on company + role. If exactly one match, use it. If multiple, ask Mason to disambiguate.application_created event first, capture the resulting app_id from the command output, then emit any follow-up events against that app_id.Never guess an app_id that isn't in data/applications.json.
--to and --from): interested | applied | screening | interview | offer | rejected | withdrawn | ghosted. Nothing else.--channel): email | linkedin | phone | sms | in_person | other. Nothing else.--source): keep it short and consistent. Examples: workatastartup, hn, linkedin, direct, referral, twitter.Use Bash to run the log command from the repo root:
cd ~/Workspace/job && pnpm log <event_type> --flag=value --flag=value
Quote any value that contains spaces or special characters:
cd ~/Workspace/job && pnpm log application_created --company="Cognition" --role="Founding Engineer" --source=hn --url="https://news.ycombinator.com/..."
If pnpm log errors, read the error message and fix the input — don't retry blindly. Common fixes:
cannot resolve current status on a status_changed → run application_created first, or pass --from explicitlyapplication_created: scaffold the folderWhen you create a new application, also create the applications/<app_id>/ folder with an empty role.md starter:
cd ~/Workspace/job && mkdir -p applications/<app_id> && touch applications/<app_id>/role.md
The role-intake skill will fill in role.md later. You are just creating the directory so the path exists.
After every successful invocation, report:
app_id if it's newKeep the report short. Mason should be able to correct you in one reply if you got anything wrong.
One natural-language message often implies multiple events. Handle them as a single atomic-looking batch:
"I just applied to the Cognition founding engineer role I saw on HN."
This is two events:
application_created with --company=Cognition --role="Founding Engineer" --source=hnstatus_changed --to=applied on the new app_idRun them in sequence. If event 1 fails, do not run event 2.
Mason: "Saw a founding eng role at Cognition on HN, track it"
cd ~/Workspace/job && pnpm log application_created --company="Cognition" --role="Founding Engineer" --source=hn --status=interested
Then scaffold the folder. Report: "Tracked Cognition — Founding Engineer (app_id: 2026-04-09-cognition-founding-engineer). Status: interested. Folder created at applications/2026-04-09-cognition-founding-engineer/."
Mason: "I just applied to the Anthropic FDE job — https://jobs.ashbyhq.com/anthropic/..."
Two events:
cd ~/Workspace/job && pnpm log application_created --company="Anthropic" --role="Forward Deployed Engineer" --url="https://jobs.ashbyhq.com/anthropic/..." --source=direct
cd ~/Workspace/job && pnpm log status_changed --app_id=<from step 1> --to=applied
Mason: "Recruiter from Pryon emailed me, they want to know availability for next week"
Resolve app_id via fuzzy match against data/applications.json. If found:
cd ~/Workspace/job && pnpm log communication_received --app_id=<matched id> --channel=email --summary="Pryon recruiter asking for availability next week"
If not found, ask: "I don't see a Pryon application in the tracker yet — should I create one first?"
Mason: "The Cognition one is in screening now"
cd ~/Workspace/job && pnpm log status_changed --app_id=<matched id> --to=screening
(The write gate will auto-resolve --from from the current state.)
Mason: "Heard back from them"
Ask: "Heard back from which application? I see Cognition, Anthropic, and Pryon in the tracker right now." Do not guess.
resume-tailor, cover-letter-writer, company-research, interview-prep). This skill only logs that those things happened once they exist on disk.data/ files directly. Only pnpm log.role.md contents — that is the role-intake skill's job. This skill only creates the empty folder.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.