# How the Drafter-Reviewer Agent Workflow Evaluates and Critiques Job Applications

> Discover how the drafter-reviewer agent workflow evaluates job applications. Learn about its two-stage pipeline for crafting and refining CVs and cover letters.

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

---

**The drafter-reviewer agent workflow evaluates job applications through a two-stage pipeline where a drafter creates initial CV and cover letter drafts from candidate profiles, passes them inline to an independent reviewer agent that conducts company research and returns structured JSON edits, which the drafter applies before running a final verification pass.**

This system implements a sophisticated dual-agent architecture in the `MadsLorentzen/ai-job-search` repository. The **drafter-reviewer agent workflow** separates content generation from critical evaluation, ensuring job applications are both factually verified and compellingly written while maintaining token efficiency.

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

The workflow begins when the `/apply` command loads [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md) and [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md) to build a required-keyword list and eligibility checklist. According to [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md) (lines 70-72), the drafter must ensure "every requirement the posting states gets addressed – matched or honestly gapped." The drafter then generates `cv_draft.tex` and `cover_letter.tex` containing the initial LaTeX content.

## Step 2: Inline Draft Passing via Agent Tool

Rather than writing drafts to disk for the reviewer to read, the drafter keeps draft strings in memory and passes them **inline** when spawning the reviewer. Using the **Agent tool**, the drafter creates a fresh `general-purpose` reviewer agent with a prompt containing the full text of both drafts directly embedded. This approach follows the specification: "When dispatching the reviewer agent, pass draft content **inline** in the agent prompt" ([`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md), lines 9-10), eliminating redundant file reads and reducing token consumption.

## Step 3: Reviewer Conducts Independent Research and Content Critique

The reviewer receives only the draft content and a fresh context, then performs safe web searches to gather verified company facts. Following [`SECURITY.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/SECURITY.md) guidelines, the reviewer never follows links embedded in job postings, ensuring **untrusted input** is handled safely. Focusing strictly on **content quality** rather than LaTeX layout, the reviewer validates drafts against [`03-writing-style.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/03-writing-style.md), identifying missing keywords, weak framing, unverified claims, and tone inconsistencies.

The reviewer outputs two distinct artifacts:

- A **JSON array of concrete edits** containing `file`, `old_string`, and `new_string` fields for automated application
- **Narrative feedback** providing company-specific angles, action-oriented reframing suggestions, and guidance on handling qualification gaps

## Step 4: Drafter Applies Structured Edits and Revisions

The drafter processes the reviewer's output by first applying structured changes automatically using the **Edit tool**. As specified in [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md) (lines 180-183), the drafter executes "Part A (structured edits) directly with the Edit tool" without re-reading files. For narrative suggestions, the drafter manually revises content while respecting the **"honest gaps" rule**—explicitly acknowledging missing qualifications rather than **keyword stuffing** to match job requirements artificially.

## Step 5: Single Verification Pass

After incorporating all revisions, the workflow runs the **verification checklist** exactly once to compile LaTeX, fix PDF layout issues, verify ATS keyword coverage, and produce the final submission-ready documents. This token-efficient design ensures the reviewer never re-reads files and resource-intensive verification occurs only after content is finalized.

## Implementation Structure from apply.md

The logic defined in [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md) follows this execution pattern:

```python

# Drafter creates initial drafts from profile and evaluation rubric

cv_text, cover_text = drafter.create_drafts(profile, job_evaluation)

# Spawn reviewer with inline content via Agent tool

review_prompt = f"""
You are a reviewer. Evaluate the following drafts and provide:
- A JSON array of concrete edits (file, old_string, new_string)
- Narrative suggestions for improvement.

CV Draft:
{cv_text}

Cover Letter Draft:
{cover_text}
"""
review_result = agent_tool.spawn(
    name="general-purpose",
    prompt=review_prompt,
    read_scope="content-critique essentials only"
)

# Apply structured edits automatically

for edit in review_result["json_edits"]:
    edit_tool.apply(
        file=edit["file"],
        old_string=edit["old_string"],
        new_string=edit["new_string"]
    )

# Incorporate narrative feedback and run final verification

drafter.apply_narrative_suggestions(review_result["suggestions"])
verifier.run_full_check(cv_path, cover_path)

```

## Security and Configuration Files

The workflow enforces strict content standards through several configuration files in `.claude/skills/job-application-assistant/`:

- **[`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md)**: Defines the rubric for extracting requirements and keywords from job postings
- **[`03-writing-style.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/03-writing-style.md)**: Mandates tone guidelines, verification requirements, and the "honest gaps" rule for both agents
- **[`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md)**: Contains the candidate's background data used by the drafter for initial matching

Security constraints defined in [`SECURITY.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/SECURITY.md) require the reviewer to perform independent research using WebFetch or WebSearch, explicitly prohibiting the use of URLs embedded in job postings to prevent exposure to untrusted external content.

## Summary

- The **drafter-reviewer agent workflow** separates content generation from critical evaluation through a two-agent pipeline defined in [`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md)
- Drafts are passed **inline** to the reviewer via the Agent tool, eliminating redundant file reads and optimizing token usage
- Reviewers return **structured JSON edits** (`file`, `old_string`, `new_string`) applied automatically via the Edit tool, plus narrative feedback for manual refinement
- All company claims are verified through independent web searches following [`SECURITY.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/SECURITY.md) safety protocols
- The workflow enforces content standards from [`03-writing-style.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/03-writing-style.md), including the prohibition against keyword stuffing ("honest gaps" rule)
- **Single-pass verification** compiles LaTeX, checks ATS compatibility, and validates layout only after all revisions are complete

## Frequently Asked Questions

### How does the reviewer agent access the draft content without reading files?

The drafter passes draft content **inline** within the agent prompt itself. When spawning the reviewer via the Agent tool, the full text of `cv_draft.tex` and `cover_letter.tex` is embedded directly in the prompt rather than written to disk. This token-efficient approach eliminates file I/O overhead and ensures the reviewer receives the exact content without re-reading context.

### What format does the reviewer use to suggest specific text changes?

The reviewer returns a **JSON array of concrete edits** where each object contains three fields: `file` (the target filename), `old_string` (the exact text to replace), and `new_string` (the replacement text). The drafter then applies these changes automatically using the Edit tool, while narrative suggestions for structural improvements are incorporated manually by the drafter.

### Why does the workflow perform verification only once at the end?

Running the verification checklist—including LaTeX compilation, PDF layout fixes, and ATS keyword coverage checks—exactly once at the end of the process minimizes token consumption and computational overhead. The architecture assumes that content critique and revision happen first, and layout verification validates the final output only when content is finalized.

### How does the system prevent the inclusion of unverified claims?

Both agents adhere to [`SECURITY.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/SECURITY.md) protocols and [`03-writing-style.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/03-writing-style.md) standards. The reviewer performs independent web searches (WebFetch/WebSearch) to verify company facts, explicitly avoiding links embedded in job postings. The drafter respects the "honest gaps" rule, acknowledging missing qualifications rather than fabricating matches, ensuring all final claims are factually grounded.