You paste a 4-page audit report into the prompt, say “fix everything in here,” and walk away. You come back to find: Claude fixed 3 of the 14 items, made up 2 new “improvements” not in the report, restructured a directory you didn’t ask about, and never touched the highest-severity issue. The report you spent an hour writing is now archeology.
Fastest fix: stop pasting the report as one blob. Save it as AUDIT.md, tell Claude to read it and create one Task per item with TaskCreate, then run them one at a time. Claude Code’s native Tasks system (default since v2.1.142, replacing the old TodoWrite todo list) tracks each item by ID, persists to disk, and surfaces what’s still pending — which is exactly the accountability a pasted blob lacks.
The root cause: Claude treats a long unstructured input as context — background to inform decisions — not as a contract to execute. Without explicit binding (“execute item N from AUDIT.md”), it reads the report, forms its own plan, and your original list silently becomes a “suggestion.” The fix is to make the list a structured, addressable artifact and bind execution to each item.
Which bucket are you in?
| Symptom | Most likely cause | Jump to |
|---|---|---|
| Some items just never got done | Report too long, Claude summarized it | Cause 1, Step 1 + 3 |
| Claude reprioritized on its own | Prompt didn’t bind to item numbers | Cause 2, Step 2 |
| One bullet half-done | Bullet packed multiple tasks | Cause 3, Step 1 |
| Claude picked a direction you didn’t choose | Report contradicts itself | Cause 4, Step 4 |
| Done items re-touched, todos skipped | Status vs todo sections blurred | Cause 5, Step 1 |
| Generic fix instead of the real one | Item referenced a ticket/URL Claude can’t open | Cause 6, Step 6 |
Common causes
Ordered by hit rate, highest first.
1. The report is long; Claude skimmed and formed its own summary
Once a report exceeds ~2 pages, Claude can’t hold every item with full fidelity in working attention. It summarizes the input and works from that summary — the same lossy-summary problem as a compacted context window, except self-inflicted from the first turn.
How to spot it: Ask Claude to “list every item in the report, numbered.” Compare to the actual report. Missing items reveal what got summarized away.
2. The prompt said “use this report” without binding to specific items
“Use this report” tells Claude what the report is, not what to do with each item. Claude makes its own plan, prioritizes by its own heuristics, and doesn’t flag deviation from your list.
How to spot it: Re-read your prompt. If it doesn’t say “execute item 1, then 2, then 3,” Claude was free to pick.
3. Report items aren’t clearly separable
“Improve error handling and add tests and update docs” is one bullet with three tasks. Claude does one of them and considers the bullet complete.
How to spot it: Bullets that contain “and” or multiple verbs. Each conjunction is a hidden sub-item Claude may skip.
4. Conflicting items in the report
Item 5 says “use async/await”; item 11 says “convert to Promise chains for IE compatibility.” Claude silently picked one direction. The conflict was the bug.
How to spot it: Read your own report for contradictions. If you find them, Claude found them too — and chose without telling you.
5. Report mixes status (already done) and todos
The report has a “current state” section and a “changes needed” section. Claude misreads which is which, skips items it thinks are already done, or “fixes” things that are already correct.
How to spot it: Some “done” items got re-touched, some “todo” items got skipped. Structural confusion.
6. The report invokes domain knowledge Claude doesn’t have
“Improve the billing reconciliation accuracy per the spec in Linear ticket BIL-42” — Claude has no access to Linear, can’t look up BIL-42, and proceeds with a generic “billing improvement.” Items that reference context Claude can’t reach get filled in with guesses.
How to spot it: Items reference URLs, ticket IDs, Slack threads, or private docs. Claude treated those as opaque.
Shortest path to fix
Ordered by ROI. Step 1 alone fixes “Claude ignored my report” in most cases.
Step 1: Turn the report into a numbered checklist file
Save the report as AUDIT.md with a strict numbered format. Don’t paste it inline — a file on disk is something Claude can re-read verbatim, and a file is what the Tasks system will index against.
# Audit 2026-06-15
Each item is independently executable. Status starts as TODO.
## 1. Replace `==` with `crypto.timingSafeEqual` in password comparison
- File: src/api/auth/login.ts:42
- Severity: P0
- Acceptance: function uses constant-time comparison; one test verifies timing-attack resistance.
- Status: TODO
## 2. Lower password reset token TTL from 24h to 1h
- File: src/api/auth/reset.ts:23 (constant `TOKEN_TTL`)
- Severity: P1
- Acceptance: constant is 3600; existing tokens older than 1h fail validation.
- Status: TODO
[... etc, items 3-14]
The “Acceptance” line is what Claude binds completion to. Without it, “done” is fuzzy.
Step 2: Create one Task per item, then execute one at a time
Claude Code’s Tasks system (introduced in v2.1.16, January 2026; the default execution-tracking layer since v2.1.142, replacing the old TodoWrite todo list) is the right primitive here. Each item becomes an addressable Task with its own pending / in_progress / completed status, so nothing silently drops off the list.
Read AUDIT.md. Do not start fixing anything yet.
Create one Task per item (1-14) with TaskCreate, using the item's title as the subject
and its acceptance criteria in the description.
Then run TaskList and quote all 14 back to me so I can confirm none were merged or dropped.
Then execute Task 1 only. Mark it completed when its acceptance criteria pass.
Stop and wait for me to say "next" before starting Task 2.
One item at a time means no skipping and no inventing. Because Tasks persist to ~/.claude/tasks/ on disk (and survive a /compact or even closing the terminal), the list is still intact mid-way through — you can resume a half-finished audit in a fresh session and ask TaskList what’s still pending.
If you’re orchestrating with subagents, set CLAUDE_CODE_TASK_LIST_ID to a shared value so every session and subagent reads and writes the same task file; otherwise each session keeps a private list and they won’t see each other’s progress.
Step 3: Verify the read before delegating
After Claude reads the report, confirm the read was complete before you spend a session on execution:
List every item by number and one-line title. No paraphrasing.
If you can't quote item 7 verbatim, your read was incomplete — re-read AUDIT.md.
This catches “Claude summarized” before it costs you a session.
Step 4: Resolve contradictions before delegating
When you spot contradictions in your own report, fix them before Claude does silently:
Items 5 and 11 conflict. The correct direction is: async/await everywhere.
Drop item 11 from AUDIT.md (and its Task) or rewrite it. Do not pick a direction yourself.
Step 5: After execution, diff against the original list
Run TaskList. For every item:
1. Confirm its status is completed.
2. Paste the actual diff that addressed it.
3. Flag any item where the diff doesn't satisfy the acceptance criteria in AUDIT.md.
You’ll see immediately which items were genuinely done versus claimed done. Status drift between AUDIT.md and the Task list is your bug detector.
Step 6: For items needing external context, fetch it first
If item 8 references “ticket BIL-42”:
You don't have Linear access. Before working on item 8, ask me to paste BIL-42's content.
Don't fill the gap with your own interpretation.
Make external context explicit, not assumed.
How to confirm it’s fixed
- Run
TaskList(or ask “show all tasks and their status”). The count must equal your audit’s item count — 14 tasks for 14 items. A smaller number means items were merged or never created. - Every task shows
completed, and each one’s diff matches the acceptance line inAUDIT.md. - No edits exist that don’t map back to a numbered item. If Claude touched files outside the audit’s scope, that’s the “invented improvements” failure mode — revert and re-scope.
For non-trivial audits, run the planning pass in plan mode first: press Shift+Tab twice (or type /plan) so Claude builds the Task list and execution order read-only, and you approve it before a single file changes.
Prevention
- Reports for agents are numbered checklist files with explicit acceptance criteria, not pasted prose.
- Create one Task per item and reference items by number (“execute Task 7”), never “the part about X.”
- One item per session step; verify the acceptance criteria before marking a task
completed. - Resolve conflicts and ambiguity in the report yourself — Claude shouldn’t pick silently.
- Make external references explicit (paste ticket contents) instead of trusting Claude to fetch them.
- Diff the Task list against the original
AUDIT.mdat session end; status drift is the bug detector.
Related
- Claude Code plan mode diverges
- Claude Code output does not match the prompt
- Claude Code asks too many questions
- Claude Code beginner guide
- Claude Code workflow
- Claude Code project setup
External references: