# Claude Code auto mode denials, 2026-08-16 to 2026-09-28

Companion data for [I Counted Every Time Claude Code Auto Mode Said No](https://launchwithben.com/learn/research/claude-code-auto-mode-denials).

One operator, one machine, 10 project checkouts, 110,629 tool calls, 251 denials.

| File | Holds |
|---|---|
| `count-denials.py` | The parser. Run it on your own `~/.claude/projects` |
| `summary.json` | Totals, the window, the rate, and counts per category |
| `by-category.csv` | Denials per reason tag, first and last seen, number of projects |
| `by-day.csv` | Untagged and tagged denials per day, and tool calls per day (the denominator) |
| `by-version.csv` | Untagged and tagged denials per Claude Code client version |

## Method

Every transcript line is parsed as JSON. A denial is a `tool_result` block with
`is_error: true` whose text **opens** with `Permission for this action was denied by the
Claude Code auto mode classifier`. The reason is the bracketed tag after `Reason:`; a
denial reading `Reason: Blocked by classifier` has no tag and is counted as `untagged`.

The denominator is every assistant `tool_use` block timestamped inside the window. Not
every one of those calls reached the classifier: narrow allow rules and read-only tools
resolve first. So the rate is denials per tool call made, not per call classified.

## What was withheld

Project names. A category reports how many distinct project folders it appeared in, not
which ones, because some checkouts on this machine belong to clients.

## Regenerate

```sh
python3 count-denials.py --csv .
```

The corpus keeps growing, so a later run will not match these files exactly. These are
the figures as of 2026-09-28.
