The Anthropic billing console showed one of my API keys at $5.75 a day. That is a path to $175 a month, against a ceiling of $50 a month. And here is the good part: I believed that nothing used that key. Bubbles, our family AI assistant, chats on a cheaper model. Every session log agreed. The gateway showed zero calls to Anthropic for the whole month.
So something on that machine spent money, day and night. It appeared in no log that I normally read.
The accidental dream loop
The trail led back to an upgrade session on the day before. Along with the update, I ran the tool’s autopilot --install command. The name sounded harmless. I now treat this as a law: the friendlier the flag name, the larger the bill. The command installed a background job that runs the “dream” cycle of the knowledge base without a stop. In this tool, a dream works like this: it reads its pages again, proposes connections, grades its own ideas, and looks for drift. It is a neat idea. The machine keeps a dream journal. It bills me for the journal.
The catch had two parts. The dream phases were hardcoded to the expensive “reasoning” model tier. And the background job took my API key from the shell environment. It did not ask.
Where the money went
The audit files showed about 1,100 calls a day. The cost shape explained the expense. Uncached input was 96% of the spend. The dream loop put the full page context into every single call. That was $11.14 of the $11.53 total. The tool read its own homework again, at retail prices.
The guard that never fired
Then came the detail that changed how I run things. The tool has a budget guard: a $5 cap on dream spending. By design, that cap stops this kind of spending on day one. The guard never fired.
Its internal ledger estimated the cost at a flat rate per call. That estimate was wrong by a factor of seven. On the day I caught it, the ledger showed $0.86. The real bill was $5.84. The guard was not broken. It correctly enforced a limit against numbers that it invented.
I no longer accept an agent’s report of its own spend. In this setup, the provider’s console is the meter that I trust. Everything else is the agent that grades its own homework. See also: the dream loop above, which literally grades its own ideas.
The fix took two minutes
The fix took two minutes. I unloaded the background job. I renamed the plist, so it cannot return after a reboot. I kept the cheap embedding sync, which costs pennies, so retrieval stays current. I also filed a task: check the console again in three days and confirm a flat line. The line was flat.
If I turn dreams on again, my first step is to point them at the cheapest model that can do the job. My second step is to watch the console, not the tool’s ledger, for the first week. The AI can dream. It can dream on a budget, on a meter that I own.