factcheck-subagent-needs-complete-sources · v1.1.0 · 2026-07-08 · sha256 abe000b2f60d39cf

factcheck-subagent-needs-complete-sources v1.1.0A

Immutable. This exact content is served forever at /api/v1/blob/abe000b2f60d39cf.

---
name: factcheck-subagent-needs-complete-sources
description: |
  When dispatching a subagent to fact-check or verify a document/report/claims
  against source material, hand it COMPLETE primary sources — never your own
  abridged summary or partial dump. Use when: (1) you are about to launch an
  Agent/Task subagent to "fact-check", "verify", "independently check",
  "stress-test", or "review the claims in" a document against sources;
  (2) you are assembling the source bundle or writing the prompt for that
  agent; (3) a verification subagent returns a verdict like "claim X is
  unsupported / appears in no source / looks fabricated" — before accepting it,
  check whether the gap is in a source YOU abridged. An agent fed a partial
  source reports confident FALSE-POSITIVE "unsupported" verdicts on exactly the
  regions you trimmed out. (4) you are FANNING OUT several verifiers, each
  scoped to a DIFFERENT SUBSET of sources matched to a doc section — a claim
  anchored to a source outside one verifier's slice gets false-flagged by that
  verifier even though every source is complete (see Variant).
author: Claude Code
version: 1.1.0
date: 2026-06-25
---

# Fact-check subagents need complete primary sources

## Problem

You dispatch a subagent to independently fact-check a document against its
sources. To save context or tokens, you pass the agent a summary or partial
dump of one source instead of the full original. The agent then reports a
**false positive**: "Claim X is unsupported — the term appears in no source."
The claim was actually fine; the supporting text was in the part of the source
you abridged away.

The failure is asymmetric and dangerous: a missing source region does not make
the agent say "I can't tell." It makes the agent confidently say "unsupported"
or "fabricated" — because absence-of-evidence reads as evidence-of-absence when
the agent believes it holds the complete source.

## Context / Trigger Conditions

- About to launch an Agent/Task subagent to "fact-check", "verify",
  "independently check", "stress-test", or "review the claims in" a document.
- Assembling the source bundle / writing the prompt for that agent.
- A verification subagent returns "claim X unsupported / appears nowhere /
  fabricated / not in any source" — especially for one specific claim while
  everything else verifies cleanly.

## Solution

**Prevention — when assembling the agent's sources:**

1. Pass the agent the COMPLETE primary source (full file, full document dump,
   full repo clone), not a hand-written summary of it. If a source is large,
   give it the real artifact and let the agent read what it needs — do not
   pre-digest.
2. If you genuinely must abridge, say so explicitly in the prompt: name which
   sources are partial and which sections were cut, and instruct the agent to
   mark any verdict touching those sections UNVERIFIABLE rather than INACCURATE.
3. Prefer pointing the agent at retrievable originals (a cloned repo, a file
   path, a document ID it can fetch itself) over your transcription of them.

**Response — when the agent flags a claim as unsupported:**

4. Before accepting an "unsupported / fabricated" verdict, read the agent's own
   report for hedges — a good agent will say "the dump I was given is partial"
   or "this section was not in my sources." That hedge is the tell.
5. Reconcile the flagged claim against the COMPLETE source yourself. If the
   supporting text is in a region you abridged, the verdict is a false
   positive — keep the original claim; do not "correct" the document.
6. Treat genuine errors and source-gap false positives separately: apply the
   real corrections, reject the false positive, and state plainly why each.

## Verification

After reconciling: every accepted correction traces to the agent finding a real
discrepancy against COMPLETE source text; every rejected flag traces to a
source region the agent never received. No document claim is changed on the
strength of a source the agent only saw partially.

## Example

A planning-review document was fact-checked by a dispatched subagent against
three sources: two cloned repos (complete) and a Google Doc supplied as a
hand-written Markdown dump. The dump reproduced one section verbatim but
abridged another. The agent verified almost everything, but flagged one
claim — "feature X is mentioned in the source" — as "X appears nowhere in any
source, likely fabricated." The agent honestly noted its dump was partial.
Checking the full Google Doc showed the abridged-out section did contain X. The
claim was correct; the false positive came entirely from the abridged dump. Fix
applied: the document claim stood, and the lesson was to attach the real
document next time, not a transcription.

## Variant — partitioned source sets across PARALLEL verifiers (fan-out)

A second, sneakier trigger: every source file is **complete**, but you fan out
N verifiers and give each one a **different subset** of sources (e.g. one
verifier per doc section, each handed only the sources that section draws on).
A claim that is **anchored to a source in a different verifier's slice** then
gets a confident FALSE-POSITIVE "unsupported / no basis in any source" from the
verifier whose slice excludes it — even though nothing was abridged. This is
common when the consolidated/summary doc reconciles numbers across *multiple*
analyses (e.g. a value from anchor-A re-used in a section the verifier only got
anchor-B sources for).

**Tells:** the flag says "appears nowhere" for a number you KNOW you sourced;
the flagged value is one that legitimately came from a *cross-cutting* or
*earlier-round* source (a prior sweep, a sibling night, a different anchor) that
this particular verifier wasn't handed.

**Mitigations (cheapest first):**
1. When the doc reconciles across rounds, give EVERY verifier the full
   provenance set for cross-cutting claims (or a shared "provenance index"),
   even if each verifier's deep-read is scoped to its section.
2. Tag load-bearing numbers in the doc with their source anchor inline, so a
   scoped verifier can see "this is from source X (not in my slice)" and mark it
   UNVERIFIABLE rather than INACCURATE.
3. On receipt: before deleting a flagged number, grep the FULL source set (not
   just that verifier's slice) for it. If it traces to an out-of-slice source,
   the verdict is a scope false-positive — keep the number, and *sharpen its
   provenance* in the doc (cite the anchor) rather than removing it.

The discriminator vs a real error: a real error means the number matches NO
source at any anchor; a scope false-positive means it matches a source the
verifier simply wasn't given.

## Notes

- A well-built verification agent self-flags incomplete sources. Read the
  agent's caveats, not just its verdicts.
- This is the subagent-dispatch analogue of "absence of evidence is not
  evidence of absence" — scoped to: the absence may be in YOUR source bundle,
  not the world.
- See also: `review-panel-pre-dispatch-claim-recheck` (re-derive the
  load-bearing claim before dispatching reviewers);
  `parallel-rewrite-with-claims-inventory-factcheck` (fact-check a rewrite
  against source DATA, not a derived inventory).