How Application Outcome Tracking and Follow-Up Drafting Works in AI-Job-Search
The /outcome command in the MadsLorentzen/ai-job-search repository records job application results in structured per-application archives and drafts personalized follow-up messages for stale applications using only previously stored facts.
Application outcome tracking and follow-up drafting in this repository operate through an archive-first pattern that maintains immutable records for every job application. The system stores all artifacts—job postings, CV drafts, cover letters, and results—within a dedicated folder structure, enabling both manual status updates and automated follow-up generation based on configurable silence thresholds.
Archive-First Architecture
The foundation of the tracking system rests on a strict folder convention that isolates each application’s data. When you submit an application, the system creates a dedicated archive under documents/applications/<company>_<role>/.
Per-Application Folder Structure
The archive path derives automatically by lower-casing the company and role names and replacing spaces with underscores. For example, applying to "Acme Corp" for a "ML Engineer" position creates documents/applications/acme_corp_ml_engineer/. This folder contains:
- The original job posting
- CV and cover-letter drafts
- An
outcome.mdfile recording the application lifecycle
As specified in .claude/commands/outcome.md, this convention ensures that every downstream command—from interview preparation to HTML reporting—reads from a single source of truth.
The outcome.md Schema
The outcome.md file functions as the canonical ledger for each application. Its format is defined in documents/README.md and enforces structured logging of every stage in the hiring process.
Status Tracking
The file records a Status field that begins as in_progress and resolves to one of five final values: hired, offer_declined, rejected, no_response, or interview_only. This categorization enables the system to distinguish between active pipelines and concluded applications when scanning for follow-up candidates.
Interview Stages and Notes
The schema includes a checklist of interview stages, where each completion tick is automatically stamped with the date reached. Additionally, a Notes section captures free-form, date-prefixed entries for context such as recruiter conversations or technical assessment details. This append-only structure preserves a complete audit trail without modifying historical entries.
Updating vs. Creating Application Records
When invoking /outcome, the command first checks for the existence of the target archive folder and its outcome.md file. If found, it updates the existing record—adding new check-boxes, appending notes, or changing the status. If absent, it initializes the folder structure and creates a fresh outcome.md template.
This logic ensures that repeated interactions with the same application accumulate rather than overwrite data. For example, running /outcome acme ml_engineer after a second-round interview adds a new timestamped check-box without erasing the initial phone screen date.
Automated Follow-Up Drafting
The follow-up sub-command within /outcome addresses the critical gap between submission and response. Rather than relying on manual memory, the system surfaces stale applications and generates draft messages in the user’s established writing style.
Stale Application Detection
The follow-up branch scans all archives for applications whose last activity—whether derived from tracker row dates or outcome.md note timestamps—exceeds a configurable threshold. The default threshold is 10 days, though users can override this per invocation.
When you run /outcome followup 14, the system identifies all in_progress applications with 14 or more days of silence. Alternatively, /outcome followup acme targets a specific company immediately, bypassing the threshold check.
Draft Generation Constraints
The drafting logic operates under strict constraints to maintain authenticity:
- Fact-bound generation: The draft pulls exclusively from stored CVs, cover letters, and job postings. It never invents qualifications or experiences not present in the archive.
- User review required: The system displays the draft for manual review and editing; it never auto-sends communications.
- Volume cap: The command limits each application to a maximum of two follow-up drafts, preventing excessive outreach.
This implementation resides in the same /outcome command logic defined in .claude/commands/outcome.md, ensuring that follow-up attempts and final resolutions remain collocated in the application archive.
Integration with External Signals
The outcome tracking system does not operate in isolation. It ingests external data through companion commands to maintain accurate status records.
The /gmail-sync command reads real email signals—such as rejection notices or interview invitations—and proposes updates to the corresponding outcome.md files and tracker CSVs. This bridges the gap between manual logging and inbox reality.
Conversely, the /setup command parses completed outcome.md files to calibrate the repository’s fit-framework and generate STAR-style interview examples. This feedback loop transforms historical application data into preparation assets for future opportunities.
Summary
- The
/outcomecommand manages application outcome tracking through dedicated archives atdocuments/applications/<company>_<role>/. - Each archive contains an
outcome.mdfile that records status, interview stages with date stamps, and chronological notes. - The follow-up sub-command detects stale applications (default >10 days) and drafts messages using only verified facts from stored documents.
- Drafts are capped at two per application and require manual review before sending.
- Integration with
/gmail-syncand/setupcreates a bidirectional flow between email signals, outcome records, and interview preparation tools.
Frequently Asked Questions
How does the /outcome command determine the archive folder name?
The command derives the folder name by concatenating the company and role, converting to lowercase, and replacing spaces with underscores. For example, "Data Scientist" at "OpenAI" becomes openai_data_scientist. This convention is documented in .claude/commands/outcome.md and ensures consistent path resolution across all repository commands.
What is the maximum number of follow-up drafts per application?
The system enforces a hard limit of two drafts per application. This prevents repetitive outreach while still allowing a polite initial check-in and a final closure message. The cap is implemented within the follow-up branch logic to maintain professional communication standards.
How does the follow-up feature avoid generating inaccurate information?
The drafting engine restricts itself to stored facts only. It analyzes the existing CV, cover letter, and job posting within the application archive to construct the message. It explicitly avoids hallucinating new skills, experiences, or timeline claims that could misrepresent the candidate’s background.
Can /outcome integrate with email to update statuses automatically?
While /outcome itself requires manual invocation, the companion /gmail-sync command provides automated email integration. It scans your inbox for application-related communications and proposes updates to the appropriate outcome.md files. This ensures the outcome tracker reflects real-world responses without requiring manual data entry for every email.
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 →