# Drafter-Reviewer Separation in AI Job Search: A Two-Agent Workflow for Better Applications

> Learn about Drafter-Reviewer Separation in AI Job Search. This two-agent workflow uses distinct AI models to draft and refine your applications for improved accuracy and impact.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: internals
- Published: 2026-08-29

---

**The Drafter-Reviewer Separation principle splits job application creation into two distinct AI agents—a Drafter that generates initial CVs and cover letters, and a Reviewer with fresh context that critiques and refines them—to catch missed keywords, strengthen company-specific framing, and enforce factual accuracy.**

The **MadsLorentzen/ai-job-search** repository implements a sophisticated multi-agent architecture designed to automate and optimize job applications using Claude AI. At the core of this system lies the **Drafter-Reviewer Separation** principle, an architectural pattern that deliberately separates content generation from critical review to eliminate the blind spots inherent in single-pass AI generation. This two-stage workflow ensures every application is both meticulously tailored and rigorously fact-checked before submission.

## What Is the Drafter-Reviewer Separation Principle?

The **Drafter-Reviewer Separation** principle is a deliberate architectural pattern that partitions the job-application workflow into two specialized agents with distinct responsibilities. Rather than allowing a single AI instance to both write and judge content—which often results in overlooked errors and missed optimization opportunities—the system orchestrates a structured handoff between creation and critique phases.

### The Drafter Agent

The **Drafter** serves as the initial content creator. According to the repository's command structure in [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md), this agent performs two primary functions: evaluating candidate fit against job requirements and generating the initial LaTeX documents. The Drafter reads the evaluation framework ([`.claude/skills/job-application-assistant/04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/04-job-evaluation.md)), the candidate profile ([`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md)), and active templates to produce `cv/main_<company>_<role>.tex` and `cover_letters/cover_<company>_<role>.tex`.

### The Reviewer Agent

The **Reviewer** operates as an independent quality assurance layer. The system explicitly spawns a fresh Claude agent with a clean context—ensuring no carryover from the drafting phase—to research the target company and critique the generated documents. This fresh context is critical because it prevents the confirmation bias that occurs when the same model instance evaluates its own output.

## Why Two Agents Outperform a Single Pass

The separation creates a feedback loop that addresses three critical failure modes of automated job application systems:

- **Keyword Recovery**: The reviewer re-examines the job posting against the drafts to identify missing required terms—such as specific technical skills or certifications—that the drafter omitted.

- **Strategic Framing**: By conducting fresh company research, the reviewer suggests company-specific angles and tone adjustments that align the application with organizational culture and values.

- **Factual Grounding**: The reviewer validates every date, metric, and claim against the three sources of truth: [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md), the master CV template, and [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md).

## Implementation in the AI Job Search Repository

The workflow is implemented as a six-step cycle defined in [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md), with clear boundaries between drafting and review phases.

### Step 1: The Drafter Evaluates Fit and Creates Initial Drafts

The process begins with the Drafter agent executing evaluation and content generation:

```markdown

## Step 1: DRAFTER – Evaluate Fit

Read evaluation framework (.claude/skills/job-application-assistant/04-job-evaluation.md)
and candidate profile (01-candidate-profile.md).  Present a fit score.

## Step 2: DRAFTER – Draft CV + Cover Letter

Use the active template (05-cv-templates.md, 06-cover-letter-templates.md)  
to produce `cv/main_<company>_<role>.tex` and `cover_letters/cover_<company>_<role>.tex`.

```

### Step 2: The Reviewer Researches and Critiques

Step 3 introduces the Reviewer agent with explicit instructions to isolate context:

```markdown

## Step 3: REVIEWER – Research & Critique

Spawn a fresh reviewer agent.  
Pass the drafts inline (do **not** read the files again) and include the job posting.

→ Produce **Part A**: JSON-structured edits (exact old → new strings).  
→ Produce **Part B**: Narrative suggestions (missing keywords, tone, company angles).

```

The Reviewer outputs structured feedback as JSON edits:

```json
[
  {
    "file": "cv/main_acme_inc_data_scientist.tex",
    "old_string": "Experienced with Python",
    "new_string": "Experienced with Python (specifically pandas, numpy)",
    "reason": "keyword match"
  }
]

```

### Step 3: The Drafter Revises and Finalizes

The Drafter returns to apply the Reviewer's structured edits and narrative suggestions:

```markdown

## Step 4: DRAFTER – Revise Based on Feedback

Apply Part A edits directly, then address Part B suggestions.

## Step 5-6: PDF & ATS Verification

Compile PDFs, run `pdftotext` checks, and finalize the application.

```

## Key Source Files and Configuration

The Drafter-Reviewer Separation principle relies on specific configuration files that serve as the system's grounding truth:

- **[`README.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/README.md)**: Contains the high-level architectural description of the drafter-reviewer separation principle (described at line 257)
- **[`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md)**: Implements the full six-step workflow with explicit agent spawning instructions
- **[`.claude/skills/job-application-assistant/01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/01-candidate-profile.md)**: Serves as the primary source of factual data for both agents
- **[`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md)**: Provides additional candidate context used for factual validation
- **`cv/main_example.tex`**: Master template referenced by the Drafter for consistent formatting

## Summary

- The **Drafter-Reviewer Separation** principle divides job application generation between two specialized AI agents to prevent single-pass errors.
- The **Drafter** creates initial drafts using candidate profiles and job evaluations, while the **Reviewer** spawns with fresh context to critique and research.
- This architecture specifically addresses **keyword optimization**, **company-specific framing**, and **factual accuracy** through structured feedback loops.
- The implementation in `MadsLorentzen/ai-job-search` uses JSON-structured edits and narrative suggestions to facilitate precise revisions.
- The workflow completes with automated PDF compilation and ATS validation checks.

## Frequently Asked Questions

### How does the Reviewer agent avoid bias from the drafting process?

The system explicitly spawns a fresh Claude agent with a clean context for the Reviewer role, ensuring no memory of the drafting conversation persists. According to the implementation in [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md), the Reviewer receives drafts inline rather than reading the files again, preventing any prior assumptions from influencing the critique.

### What are the three sources of truth used for factual grounding?

The Reviewer validates all claims against three canonical documents: [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md) (the candidate's structured profile), the master CV template, and [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) (additional candidate information). This triangulation ensures dates, metrics, and qualifications remain accurate across all generated documents.

### Can the Drafter-Reviewer cycle run multiple times?

While the standard workflow in [`apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/apply.md) specifies a single review cycle (Step 3) followed by revision (Step 4), the architecture supports iterative refinement. The structured JSON output format allows the Drafter to apply changes deterministically, and the process could theoretically loop until the Reviewer finds no further improvements, though the current implementation optimizes for a single high-quality pass to minimize API costs and processing time.

### How is the Reviewer's feedback structured for the Drafter?

The Reviewer produces two distinct output formats: **Part A** contains machine-readable JSON arrays with `file`, `old_string`, `new_string`, and `reason` fields for precise text replacement; **Part B** provides narrative suggestions covering missing keywords, tone adjustments, and company-specific angles. This dual-format approach enables both automated edits and qualitative improvements.