# How Application Outcome Tracking and Follow-Up Drafting Works in AI-Job-Search

> Learn how AI-job-search application outcome tracking records results and drafts follow-up messages for stale applications using stored facts. Enhance your job search efficiency.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: how-to-guide
- Published: 2026-07-26

---

**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.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.md) file recording the application lifecycle

As specified in [`.claude/commands/outcome.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.md) file functions as the canonical ledger for each application. Its format is defined in [`documents/README.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.md) files and tracker CSVs. This bridges the gap between manual logging and inbox reality.

Conversely, the `/setup` command parses completed [`outcome.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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 `/outcome` command manages application outcome tracking through dedicated archives at `documents/applications/<company>_<role>/`.
- Each archive contains an [`outcome.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.md) file 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-sync` and `/setup` creates 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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.md) files. This ensures the outcome tracker reflects real-world responses without requiring manual data entry for every email.