Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add commands/madslorentzen/ai-job-search/outcomegit clone --depth 1 https://github.com/MadsLorentzen/ai-job-searchWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00000 | $0.04040 |
| Opus 5 | $0.00000 | $0.02020 |
| Sonnet 5 | $0.00000 | $0.00808 |
| Haiku 4.5 | $0.00000 | $0.00404 |
Grade A, and why
outcome scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 196 lines — stays where its author put it; the contents beside it link to each section on GitHub.
/outcome - Record the Result of an Application
You are recording what happened to a job application: progress updates (interview invitations, stages completed, offers) and final resolutions (hired, rejected, no response). The data lands in two places the framework already reads but nothing systematically writes:
job_search_tracker.csv- the status column that/scrapeand/rankuse for dedup and exclusiondocuments/applications/<company>_<role>/- the per-application archive (posting, submitted drafts,outcome.md) that/setupPath A mines to calibrate04-job-evaluation.mdand surface STAR candidates
/outcome writes the data; /setup interprets it. This command never edits the evaluation framework or profile files itself.
The command also owns the stretch before there is an outcome to record: the follow-up branch (Step 2b) surfaces open applications that have gone quiet, drafts a brief follow-up note in the user's voice, and logs it - so the chase and the resolution it eventually leads to live in one flow.
Follow these steps in order.
Step 0: Parse Input
$ARGUMENTS may contain:
- Nothing → list open applications and ask which one to update
- A company name (optionally with a role), e.g.
/outcome acmeor/outcome acme ml engineer→ target that application followup→ enter the follow-up branch (Step 2b) over every quiet open application, using the default threshold of 10 daysfollowup <N>, e.g./outcome followup 14→ follow-up branch with an N-day thresholdfollowup <company>, e.g./outcome followup acme→ draft a follow-up for that application now, regardless of threshold
Step 1: Load State and Identify the Application
- Read
job_search_tracker.csv. If it does not exist, create it with the standard header:
If the file exists and its header does not end indate,company,sector,role,role_type,channel,status,contact_person,fit_rating,notes,cv_file,cover_letter_file,source,deadline,deadline, append,deadlineto the header line only - no data row is touched. Legacy rows then read as an empty deadline. This is the one edit to an existing tracker this command may make outside a matched row, and Step 4's "never restructure the CSV" governs that row, not this header line. - With an argument: match rows case-insensitively on company (and role, if given). One match → proceed. Several → list them and ask. None → the application was made outside the workflow; collect company, role, date applied, channel, and posting URL from the user and add a tracker row.
- Without an argument: list all rows whose status is not final (see Tracker status vocabulary below) as a numbered table (company, role, date applied, current status, deadline, days quiet, follow-ups sent) and ask which to update. The two derived columns come straight from existing data: days quiet counts from the row's
dateor the latest dated entry innotes, whichever is more recent; follow-ups sent counts thefollowed up YYYY-MM-DDmarkers innotes. If any open row is 10+ days quiet with fewer than two follow-ups sent, add one line under the table: "Some of these have gone quiet - want a follow-up draft? (Step 2b)". If every row is resolved, say so and stop.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 196 lines · 0 tokens per session scan A 351cb7a5a23f
outcome is a command published in the GitHub repository MadsLorentzen/ai-job-search (39,400 stars, last pushed today), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 4,040 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other commands, from other repositories
resume
Generate a tailored resume and cover letter from a job description, score both, create DOCX files, and update the tracker.
resume-team
Run the role-separated, fail-closed Resume Team workflow against a job description.
writing-coach
Human-voice writing coach — rewrite resumes and cover letters with brevity, burstiness, plain language, and authentic impact. Blocks AI-sounding prose.
cover-letter
Create a one-page cover letter for a job description and generate the final DOCX.
find-jobs
Search live job boards for roles that match the master resume, then rank them by fit.
job-fit
Run the deterministic, digest-bound candidate-fit gate before any resume tailoring.