How the `/outcome` Command Tracks Application Results and Archives Materials in AI-Job-Search
The /outcome command records application results by simultaneously updating a central tracker CSV and creating a per-application archive folder with four preserved files: cv_draft.tex, cover_letter.tex, job_posting.md, and outcome.md.
The /outcome command serves as the central hub for tracking what happens after a job application is submitted in the MadsLorentzen/ai-job-search framework. It maintains a complete audit trail by writing to two distinct locations: a master spreadsheet that drives other workflows and a dedicated archive folder for each application. This dual-write approach ensures that application results remain queryable for analysis while preserving every submission artifact for future reference.
Dual Destination Architecture
The /outcome command writes to two destination locations whenever a user records an application result.
The Master Tracker: job_search_tracker.csv
The command updates job_search_tracker.csv—the same spreadsheet that powers the /scrape and /rank workflows. According to the source code in .claude/commands/outcome.md (lines 30-34, 124-125), this update involves:
- Modifying the
statuscolumn to reflect the new state (e.g.,interview,offer,hired,rejected) - Appending a dated entry to the
notescolumn
The command reads the CSV first; if it does not exist, it creates the file with a standard header (lines 30-33). Row matching uses case-insensitive company and role names. No rows are reordered or removed, guaranteeing idempotent behavior (lines 124-125, 162-166).
The Per-Application Archive: documents/applications/<company>_<role>/
Each application gets its own folder under documents/applications/. The folder name follows a strict convention: lowercase company and role with underscores replacing spaces, derived in Step 1.3 (line 36). Inside this folder, the command creates or updates four files (lines 89-97):
| File | Purpose |
|---|---|
cv_draft.tex |
Archived copy of the submitted CV |
cover_letter.tex |
Archived copy of the submitted cover letter |
job_posting.md |
Saved job posting text |
outcome.md |
Structured outcome record with status, dates, and notes |
How Archive Materials Are Captured
Preserving Application Documents
The cv_draft.tex and cover_letter.tex files are copied, never moved from their source locations (line 93). The command resolves source paths in priority order:
- Paths recorded in the tracker (
cv_fileandcover_letter_filecolumns) - Fallback locations:
cv/main_<company>*.texandcover_letters/cover_<company>_*.tex
Existing files remain untouched to prevent accidental overwrites.
Fetching Job Postings
The job_posting.md file is populated using the repository's WebFetch logic to retrieve content from the URL stored in the tracker's source column. If fetching fails, the command either prompts the user to paste the posting or creates a stub noting unavailability (lines 94-95).
Structured Outcome Documentation
The outcome.md file follows a strict markdown schema defined in documents/README.md. The command writes (lines 97-115):
- Current status
- Optional resolution date
- Interview-stage checklist (e.g., phone screen, technical interview, final round)
- Free-form "Notes" section
Subsequent runs only tick new stages and append notes, preserving complete history (lines 166-168).
Automated Follow-Up Branch
When invoked with followup, the command enters a dedicated follow-up mode (lines 70-81). It scans the tracker for open applications that have been quiet longer than the default 10-day threshold (or a user-specified value). For qualifying applications:
- It drafts a polite follow-up note (80-120 words) using the archived
cover_letter.texandjob_posting.mdas style and context references - Upon user approval, it:
- Appends
followed up YYYY-MM-DDto the CSV'snotescolumn (line 80) - Saves the draft as
followup_YYYY-MM-DD.mdin the archive folder (line 81)
- Appends
# Trigger follow-up mode for all quiet applications
$outcome followup
# Use custom threshold (e.g., 14 days)
$outcome followup --threshold 14
Calibration Hand-Off to /setup
After recording an outcome, the command performs a calibration check (lines 30-31). It counts how many outcome.md files have reached a final status. If enough resolved applications exist, it suggests running /setup (Path A) so the framework can:
- Calibrate fit scoring parameters
- Mine STAR-type interview examples from archived materials
The command never edits evaluation files directly, preserving the single-source-of-truth principle (lines 34-35).
Usage Examples
Recording a Simple Resolution
# Mark as hired (interactive prompts for dates and notes)
$outcome acme "hired"
Resulting changes:
| File | Change |
|---|---|
job_search_tracker.csv |
status → hired; dated note appended to notes |
documents/applications/acme_software_engineer/outcome.md |
Status set, resolution date added, interview checklist updated, notes appended |
documents/applications/acme_software_engineer/cv_draft.tex |
Copied from original cv_file |
documents/applications/acme_software_engineer/cover_letter.tex |
Copied from original cover_letter_file |
documents/applications/acme_software_engineer/job_posting.md |
Fetched from tracker URL or user-provided |
Adding an Application Outside the Workflow
# Interactive mode for manually submitted applications
$outcome
# → prompts for company, role, date, channel, source URL, etc.
# → appends new row to tracker
# → creates empty archive folder for future material
Key Implementation Files
| File | Role |
|---|---|
[.claude/commands/outcome.md](https://github.com/MadsLorentzen/ai-job-search/blob/master/.claude/commands/outcome.md) |
Full command specification with steps, CSV handling, and archiving logic |
job_search_tracker.csv (generated) |
Central CSV storing status, dates, and notes for every application |
documents/applications/<company>_<role>/outcome.md |
Per-application outcome record; parsed by /setup for calibration |
documents/applications/<company>_<role>/cv_draft.tex |
Archived submitted CV |
documents/applications/<company>_<role>/cover_letter.tex |
Archived submitted cover letter |
documents/applications/<company>_<role>/job_posting.md |
Saved job posting text |
documents/README.md |
Defines the markdown schema for outcome.md |
Summary
/outcomeuses dual-write architecture: updatesjob_search_tracker.csvand populatesdocuments/applications/<company>_<role>/folders- Four archived files per application:
cv_draft.tex,cover_letter.tex,job_posting.md, and structuredoutcome.md - Idempotent CSV updates: rows are never reordered or removed, only modified in place
- Follow-up automation: scans for quiet applications, drafts context-aware notes, and logs actions
- Calibration trigger: suggests
/setupwhen enough resolved outcomes exist for model refinement - Single-source-of-truth preserved: evaluation files remain read-only for this command
Frequently Asked Questions
What happens if the tracker CSV doesn't exist?
The command creates job_search_tracker.csv with a standard header (lines 30-33). This ensures first-time users can immediately start recording outcomes without manual setup.
Can I overwrite archived files like cv_draft.tex?
No. The command copies files using a preserve-existing strategy (line 93). Once an application document is archived, it remains immutable to maintain historical accuracy.
How does the follow-up mode determine which applications need attention?
It filters the tracker for rows where status indicates an open application and the last activity exceeds the threshold—default 10 days or user-specified. The logic draws exclusively from archived cover_letter.tex and job_posting.md to maintain context (lines 70-76).
What interview stages appear in outcome.md?
The checklist schema in documents/README.md typically includes: phone screen, technical interview, take-home assignment, behavioral interview, final round, and reference check. The command ticks stages as you update outcomes, building a complete timeline.
Does /outcome modify my evaluation or scoring configuration?
No. The command only reads evaluation files and suggests running /setup for calibration. It never writes to fit-scoring parameters or interview example databases (lines 34-35), ensuring clean separation between data collection and model training.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →