cd ~ / blog

Zero Fabrication by Construction: A Multi-Agent Resume Tailor on Google ADK

July 7, 2026 · 1 min read

My resume-tailoring agent is structurally incapable of lying about me. Not discouraged — incapable.

A tailoring agent's entire incentive gradient points toward embellishment: the "helpful" move is always to invent the missing skill. The interesting engineering is refusing that gradient. Skills I genuinely lack are never written into bullets — they surface in the UI as honest gaps, front and center.

flowchart LR
    up[Upload] --> g1{Magic bytes?} -->|fail| e415[415]
    g1 -->|ok| g2{Under 10 MB?} -->|fail| e413[413]
    g2 -->|ok| g3{Scanned or encrypted?} -->|fail| e422[422]
    g3 -->|ok| intake
    subgraph seq [SequentialAgent: resume_tailor]
        subgraph intake [ParallelAgent: intake]
            jd[jd_parser — flash-lite]
            rp[resume_parser — flash-lite]
        end
        intake -->|session state, Pydantic-validated| ma[match_analyzer — flash-lite]
        ma -->|output_key handoff| t[tailor — flash]
    end
Not a token is spent until three free checks pass. Parsers run in parallel; everything after is a fan-in.
agents.py
jd_parser = LlmAgent(
    model="gemini-2.5-flash-lite",
    instruction="Extract requirements from: {job_description}",
    output_schema=JDParsed,   # Pydantic — downstream agents get structured data, never free text
    output_key="jd_parsed",   # written to session state, not stuffed into the next prompt
)

The tripwire

The no-fabrication guarantee isn't a prompt instruction — it's an acceptance gate. An eval harness runs labelled resume/JD pairs and reports covered recall, missing recall, and fabrication failures. The input guards exist to protect this invariant: a scanned or encrypted PDF is rejected with a 422 before any model call, because the guarantee can't survive garbage extraction.

eval.py
report = run_eval(labelled_cases)
print(f"covered recall:      {report.covered_recall:.2f}")
print(f"missing recall:      {report.missing_recall:.2f}")
print(f"fabrication failures: {report.fabrication_failures}")

# The acceptance gate. Not low - zero.
assert report.fabrication_failures == 0, "fabricated skill in a tailored bullet"

The system can't make me look better than I am. That's the feature.