How the Drafter-Reviewer Agent Workflow Evaluates and Critiques Job Applications
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 and 04-job-evaluation.md to build a required-keyword list and eligibility checklist. According to .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, 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 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, 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, andnew_stringfields 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 (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 follows this execution pattern:
# 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: Defines the rubric for extracting requirements and keywords from job postings03-writing-style.md: Mandates tone guidelines, verification requirements, and the "honest gaps" rule for both agents01-candidate-profile.md: Contains the candidate's background data used by the drafter for initial matching
Security constraints defined in 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 - 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.mdsafety protocols - The workflow enforces content standards from
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 protocols and 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.
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 →