---
title: Verifying changes
description: "Build finished. You're about to run ana run verify. This guide covers what Verify does, what the report means, and what to do when it comes back FAIL."
readingTime: 8
---

## What Verify does

Verify reads the spec and the code — never the build report. Eight steps:

1. **Seal check** — confirms the contract wasn't modified after sealing
2. **Run tests, build, lint** — establishes the baseline
3. **Predict** — writes predictions before reading code, to resist confirmation bias
4. **Read code and evaluate assertions** — finds each `@ana` tag, verifies the test actually satisfies the contract
5. **Check for over-building** — flags code not in the spec
6. **Resolve predictions** — confirmed, not found, or surprised
7. **Walk acceptance criteria** — each one gets PASS, FAIL, PARTIAL, or UNVERIFIABLE
8. **Write findings and verdict** — PASS or FAIL, one word

## The asymmetry

Both agents read the same planning artifacts and project config. The difference is one file: `build_report.md`. Only the developer sees both reports.

<div style={{background:"var(--bg-card)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",margin:"8px 0 18px",fontFamily:"var(--font-mono)",fontSize:"12.5px",lineHeight:1.65,overflow:"hidden"}}>
<div style={{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 14px",borderBottom:"1px solid var(--hairline)",background:"var(--bg-elev)",fontSize:"11px",color:"var(--ink-60)"}}>
<span style={{color:"var(--ink-45)",textTransform:"uppercase",letterSpacing:"0.06em",fontSize:"10px"}}>yaml</span>
</div>
<pre style={{padding:"14px 16px",color:"var(--ink-75)",overflowX:"auto",whiteSpace:"pre",margin:0,background:"transparent",fontSize:"inherit",lineHeight:"inherit",fontFamily:"inherit"}}>
<span style={{color:"var(--ink-45)"}}>{"# ana-build reads:"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>spec.md</span>{"           "}<span style={{color:"var(--ink-45)"}}>{"# how to build it"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>contract.yaml</span>{"     "}<span style={{color:"var(--ink-45)"}}>{"# what done means (sealed)"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>plan.md</span>{"           "}<span style={{color:"var(--ink-45)"}}>{"# sequencing and phasing"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>ana.json</span>{"          "}<span style={{color:"var(--ink-45)"}}>{"# build/test/lint commands"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>scan.json</span>{"         "}<span style={{color:"var(--ink-45)"}}>{"# stack awareness"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>the codebase</span>{"      "}<span style={{color:"var(--ink-45)"}}>{"# current state"}</span>{"\n\n"}<span style={{color:"var(--ink-45)"}}>{"# ana-verify reads:"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>spec.md</span>{"           "}<span style={{color:"var(--ink-45)"}}>{"# same"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>contract.yaml</span>{"     "}<span style={{color:"var(--ink-45)"}}>{"# same"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>plan.md</span>{"           "}<span style={{color:"var(--ink-45)"}}>{"# same"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>ana.json</span>{"          "}<span style={{color:"var(--ink-45)"}}>{"# same"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>scan.json</span>{"         "}<span style={{color:"var(--ink-45)"}}>{"# same"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--info)"}}>the codebase</span>{"      "}<span style={{color:"var(--ink-45)"}}>{"# the diff at HEAD"}</span>{"\n"}<span style={{color:"var(--brand-light)"}}>-</span>{" "}<span style={{color:"var(--ink-45)"}}>{"❌ build_report.md  # forbidden"}</span>
</pre>
</div>

## The verify report

Verify produces two files: a markdown report for the developer and a YAML companion (`verify_data.yaml`) for the proof chain. The report's key section is **Contract Compliance** — a per-assertion ledger:

```markdown
## Contract Compliance

| ID   | Says                                        | Status        | Evidence                          |
|------|---------------------------------------------|---------------|-----------------------------------|
| A001 | Slugs with shell injection are rejected     | ✅ SATISFIED | test line 42, rejects "; rm -rf"  |
| A003 | Valid kebab-case slugs pass validation      | ✅ SATISFIED | test line 58, passes "my-feature" |
| A023 | No direct execSync calls remain in commands | ✅ SATISFIED | grep confirms zero matches        |
```

After the ledger: **Findings** (categorized observations with severity and suggested actions — these enter the proof chain), **AC Walkthrough** (each acceptance criterion: PASS, FAIL, PARTIAL, or UNVERIFIABLE), **Blockers**, **Deployer Handoff**, and the **Verdict**. On re-verification, a **Previous Findings Resolution** section shows how each prior issue was addressed.

## PASS and FAIL

<div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"16px",marginBottom:"16px"}}>
<div style={{padding:"14px 16px",borderRadius:"var(--radius-sm)",border:"1px solid var(--pass-border)",background:"var(--pass-bg)"}}>
<div style={{fontWeight:600,fontSize:"13px",color:"var(--pass)",marginBottom:"6px"}}>PASS</div>
<div style={{fontSize:"13px",color:"var(--ink-75)",lineHeight:1.5}}>Every assertion SATISFIED. Every AC passing. Tests green. Findings are informational — a PASS with 10 findings is normal.</div>
</div>
<div style={{padding:"14px 16px",borderRadius:"var(--radius-sm)",border:"1px solid rgba(248,113,113,0.25)",background:"var(--fail-bg)"}}>
<div style={{fontWeight:600,fontSize:"13px",color:"var(--fail)",marginBottom:"6px"}}>FAIL</div>
<div style={{fontSize:"13px",color:"var(--ink-75)",lineHeight:1.5}}>Any assertion UNSATISFIED. Any AC failed. Test failures or regressions. One unsatisfied assertion is enough.</div>
</div>
</div>

<p style={{fontSize:"13px",color:"var(--ink-60)",margin:"0 0 16px"}}>Findings measure depth of review. The verdict measures contract compliance. They're independent.</p>

## When Verify fails

FAIL sends the work back to Build. <DocsStat value="rejections" /> of Anatomia's own <DocsStat value="proofCount" /> proofs had rejection cycles.

1. Read the verify report. It lists every UNSATISFIED assertion and every finding.
2. Run `ana run build`. Build reads the verify report and fixes exactly what failed.
3. Run `ana run verify` again. On re-verification, Verify reads its own previous report and addresses each prior issue explicitly in a **Previous Findings Resolution** section.

Re-verification is a full pass. Every assertion is re-evaluated. The previous report provides a checklist, not a shortcut.

<p style={{fontSize:"13px",color:"var(--ink-60)",margin:"0 0 16px"}}>If the failure isn't obvious from the report, see [Troubleshooting](/docs/guides/troubleshooting).</p>

## Running verify

Verify runs in the worktree Build created — no branch switching or setup needed.

<div style={{background:"var(--bg-card)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",margin:"8px 0 18px",fontFamily:"var(--font-mono)",fontSize:"12.5px",lineHeight:1.65,overflow:"hidden"}}>
<div style={{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 14px",borderBottom:"1px solid var(--hairline)",background:"var(--bg-elev)",fontSize:"11px",color:"var(--ink-60)"}}>
<span style={{color:"var(--ink-45)",textTransform:"uppercase",letterSpacing:"0.06em",fontSize:"10px"}}>bash</span>
</div>
<pre style={{padding:"14px 16px",color:"var(--ink-75)",overflowX:"auto",whiteSpace:"pre",margin:0,background:"transparent",fontSize:"inherit",lineHeight:"inherit",fontFamily:"inherit"}}>
<span style={{color:"var(--ink-45)"}}>{"# After Build finishes, open a new session:"}</span>{"\n$ "}<span style={{color:"var(--pass)"}}>ana run verify</span>{"\n\n"}<span style={{color:"var(--ink-45)"}}>{"# Verify finds the work item, enters the worktree,"}</span>{"\n"}<span style={{color:"var(--ink-45)"}}>{"# runs the 8-step process, writes the report."}</span>{"\n"}<span style={{color:"var(--ink-45)"}}>{"# On PASS, it creates a PR for review."}</span>
</pre>
</div>

<p style={{fontSize:"13px",color:"var(--ink-60)",margin:"12px 0 16px"}}>Under the hood: `ana work status` → `ana work start` → `ana verify pre-check` → verification → `ana artifact save verify-report` → `ana pr create`. The save runs the seal check again — tampered contracts are blocked.</p>

After the PR is created: read both reports, merge, then `ana work complete` to archive and record the proof chain entry.

## Comparing the two reports

After PASS, you have `build_report.md` and `verify_report.md`. Read both before merging. Where to look:

- **Assertion status.** Build claims 27/27 SATISFIED. Verify also says 27/27. If they disagree — Build says SATISFIED but Verify says UNSATISFIED — that's the highest-value signal. Read both evidence columns.
- **Test quality.** Build reports test counts. Verify reports whether those tests actually prove anything. A test tagged `@ana A003` that uses `toBeDefined()` passes on both correct and incorrect implementations — Verify catches that.
- **Open issues vs findings.** Build's "Open Issues" are honest admissions. Verify's "Findings" are independent observations. Overlap means the issue is real. A finding that Build didn't mention means Build missed something.
- **Over-building.** Verify flags code that exists but wasn't in the spec. Build's report won't mention it because Build wrote it intentionally. The gap itself is the signal.

<NextCards cards={[
  {
    eyebrow: "Next guide",
    title: "Reading a proof",
    href: "/docs/guides/reading-a-proof",
    description: "What the proof page shows after Verify passes."
  },
  {
    eyebrow: "Real example",
    title: "security-hardening",
    href: "/docs/proof/security-hardening",
    description: "See the verify report that produced a PASS."
  }
]} />
