# How the `/outcome` Command Tracks Application Results and Archives Materials in AI-Job-Search

> Discover how the /outcome command in ai-job-search tracks application results, updates a central CSV, and archives essential files like your CV and job posting for efficient record-keeping.

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

---

**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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/job_posting.md), and [`outcome.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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](https://github.com/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/outcome.md) (lines 30-34, 124-125), this update involves:

- Modifying the **`status`** column to reflect the new state (e.g., `interview`, `offer`, `hired`, `rejected`)
- Appending a dated entry to the **`notes`** column

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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/job_posting.md) | Saved job posting text |
| [`outcome.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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:

1. Paths recorded in the tracker (`cv_file` and `cover_letter_file` columns)
2. Fallback locations: `cv/main_<company>*.tex` and `cover_letters/cover_<company>_*.tex`

Existing files remain untouched to prevent accidental overwrites.

### Fetching Job Postings

The **[`job_posting.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.md)** file follows a strict markdown schema defined in [`documents/README.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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:

1. It drafts a polite follow-up note (80-120 words) using the archived `cover_letter.tex` and [`job_posting.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/job_posting.md) as style and context references
2. Upon user approval, it:
   - Appends `followed up YYYY-MM-DD` to the CSV's `notes` column (line 80)
   - Saves the draft as [`followup_YYYY-MM-DD.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/followup_YYYY-MM-DD.md) in the archive folder (line 81)

```bash

# 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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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

```bash

# 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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/documents/applications/acme_software_engineer/job_posting.md) | Fetched from tracker URL or user-provided |

### Adding an Application Outside the Workflow

```bash

# 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/main/.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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/documents/README.md) | Defines the markdown schema for [`outcome.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.md) |

## Summary

- **`/outcome` uses dual-write architecture**: updates `job_search_tracker.csv` and populates `documents/applications/<company>_<role>/` folders
- **Four archived files per application**: `cv_draft.tex`, `cover_letter.tex`, [`job_posting.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/job_posting.md), and structured [`outcome.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.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 `/setup` when 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`](https://github.com/MadsLorentzen/ai-job-search/blob/main/job_posting.md) to maintain context (lines 70-76).

### What interview stages appear in [`outcome.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/outcome.md)?

The checklist schema in [`documents/README.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/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.