An unexpected Anthropic bill sent me looking for where an API key was actually being used in a codebase I hadn't touched in weeks. I asked Claude Haiku to find every reference to ANTHROPIC_API_KEY. It came back confident: the string did not appear anywhere.
That answer was technically true and functionally wrong. The @ai-sdk/anthropic SDK reads the variable implicitly — there is no literal string to grep for, because the code never needed to name it. A quick runtime experiment proved the smaller model wrong: the calls were happening, the key was being read, it just wasn't visible to a text search.
Escalating to Opus with extended thinking got the real answer: the key was used at runtime only, never touched at build time or in CI. Case closed, in the narrow sense.
The part that stuck with me wasn't the bill. It was realizing the assistant had no memory of a decision I'd made weeks earlier — migrating this same code path from OpenAI to Claude. The commit history documented it clearly. The new session still treated the codebase like unfamiliar territory and had to reconstruct, from scratch, context it had itself helped create.
Two lessons
Lookup work and forensic work are different jobs. Finding something that's already written down — a config value, a function definition, a known fact — is lookup work, and a small fast model handles it fine. Reconstructing something that isn't written down — proving a negative, mapping an implicit surface, explaining why a search came back empty — is forensic work. That needs a larger model with room to reason, not a faster one.
The amnesia is architectural, not a bug you'll patch away. Every new session starts from zero. The model that helped you make a decision has no record of having made it with you. If the decision matters, the memory of it has to live somewhere the next session can find — a commit message, an architecture log, a README note — because it will not live in the model.
What I actually do differently now
- Treat a confident negative answer as a hypothesis, not a fact, when the cost of being wrong is nonzero. A ten-second runtime check is cheap insurance.
- Keep a short-form architecture log for decisions an AI assistant helped make, so the next session — mine or the model's — doesn't have to re-derive them.
- Route anything that smells like forensic work (prove it's absent, map the full surface, explain why the obvious search failed) to a bigger model with extended thinking on, by default.
- When a model tells me something isn't there, I ask what it would look like if it were there but hidden. That question alone catches most of the false negatives.
Model selection isn't just a cost-optimization question. It's a question of which class of task you're actually handing off.