Drafter-Reviewer Separation in AI Job Search: A Two-Agent Workflow for Better Applications
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, 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), the candidate profile (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, the master CV template, andCLAUDE.md.
Implementation in the AI Job Search Repository
The workflow is implemented as a six-step cycle defined in .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:
## 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:
## 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:
[
{
"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:
## 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: Contains the high-level architectural description of the drafter-reviewer separation principle (described at line 257).claude/commands/apply.md: Implements the full six-step workflow with explicit agent spawning instructions.claude/skills/job-application-assistant/01-candidate-profile.md: Serves as the primary source of factual data for both agentsCLAUDE.md: Provides additional candidate context used for factual validationcv/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-searchuses 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, 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 (the candidate's structured profile), the master CV template, and 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 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.
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 →