Claude Code Ignores Your Audit Report

You fed Claude Code a detailed audit and it did its own thing. The report is context, not a contract — convert it to numbered Tasks, execute one at a time, and diff progress against the original list.

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?

SymptomMost likely causeJump to
Some items just never got doneReport too long, Claude summarized itCause 1, Step 1 + 3
Claude reprioritized on its ownPrompt didn’t bind to item numbersCause 2, Step 2
One bullet half-doneBullet packed multiple tasksCause 3, Step 1
Claude picked a direction you didn’t chooseReport contradicts itselfCause 4, Step 4
Done items re-touched, todos skippedStatus vs todo sections blurredCause 5, Step 1
Generic fix instead of the real oneItem referenced a ticket/URL Claude can’t openCause 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

  1. 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.
  2. Every task shows completed, and each one’s diff matches the acceptance line in AUDIT.md.
  3. 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.md at session end; status drift is the bug detector.

External references:

Tags: #Troubleshooting #Claude Code #Debug #Audit report