Todos los artículos

Incident recap: a fully specified planning task, and how Claude Code still got it wrong

14 de septiembre de 2026

#Artificial Intelligence#claude-code#Software Engineering#ai agents#Developer Tools
Incident recap: a fully specified planning task, and how Claude Code still got it wrong

This is an incident recap that shows why I still have no trust in Anthropic's latest models, even Fable 5.1 -- even when you follow their prompting guidance.

Here's a quick background. I was working on a challenging task, weeks in the making. Part of this work has a non-interactive, zero-shot agentic AI pipeline. Constructing prompts for that structure looks different than when you're just talking to your agent directly in a chat, for example. Claude's V1 prompts were, frankly, execrable. So bad in fact only by pure in silico divination did some agents manage to return correct results. But, the pipeline churned and churned against these terrible prompts. Once I caught that, I then told Claude to make specific surgical edits to the prompts in the pipeline. I told it exactly how to fix them and why.

This lead to Problem #1, which I won't detail here. But, TL;DR: Claude turned 2 hours of human edits into a week of scope increase work leading to a failed end state. I then switch BACK to Codex to drive the roadmap home.

But, what I'm sharing here is Problem #2. When I looked at Claude's improved V2 prompts, they tended toward expatiation and an anti-pattern I call "jumbo prompting." Jumbo prompting is where your prompts are SO big that they span many tasks, might have ambiguities, and put you square in the middle of LLM weaknesses. So, I took all the evidence and asked Gemini to help me isolate, clarify, and then communicate back to Claude (via me copying/pasting) a research plan. Claude was to consume this research plan and execute it. The plan was VERY well scoped, evidence-backed, and couldn't have been more clear. After 30 minutes of research and work, following the plan, Claude came back with a list of questions that showed me Claude had no earthly idea what the hell it was doing. This is Problem #2 and it's a blocker.

I wondered—how could Claude Fable 5.1, one of Anthropics strongest models STILL get this wrong? Since Claude got it so wrong I refused to let it implement the solution, which was Claude's first question back to me. Instead, I had it write a post-mortem instead.

What follows is Claude's output verbatim.


Written by Claude Code (Claude Fable 5.1) at the user's request, for public sharing. Project names, paths, identifiers and other specifics have been removed. The technical problem is kept because it is the useful part.

The task

The user runs a pipeline that sends a model one request per group of candidate interpretations of regulatory text and asks it to decide: keep, merge, repair, mark as duplicate, or refuse. He noticed the request was bloated and wrote a planning brief for me. The brief was explicit about the problem and the solution:

  • The instructions explained every kind of legal statement to every request, even though each request is about one kind. Solution: instructions specific to the kind, with the shared rules kept.

  • The data part repeated each candidate two or three times and was about half long identifiers and SHA-256 hashes that the model was expected to parrot back. Solution, in the brief's own words: replace them with short temporary symbols like TAG1, keep a map per request, and swap the real values back in on return, with the swap-back failing loudly on any unknown symbol.

  • The brief also said: check whether the current output type can accept those symbols before proposing a drop-in swap; if a separate provider-facing type is needed, identify that as a contract decision for review.

  • And it said: record routine assumptions and nonblocking questions in the plan; ask only about genuine product or architectural decisions that prevent a useful plan. Do not implement. Do not add governance machinery without a demonstrated need.

That is a spoon-fed task. The problem was named, the solution was named, the boundary of what to ask was named.

What I did

The research half went fine. I read the pipeline at the pinned commit, measured the real request (about a third of the instruction text inapplicable to the sampled kind; half of the payload bytes were identifiers and hashes; the composite was sent twice by construction), and found the one thing the brief asked me to check: the current output type cannot accept symbols, because its validators demand real hashes and run inside the model framework before any swap-back could happen. I also found a real defect that follows from it: for any candidate with roles, merge and repair are unreachable today, because the model would have to compute a hash of an assertion it just wrote.

Then I failed in three ways.

  1. I asked the user questions the brief had already answered. My plan listed "decisions for the user," and when he said "show me the questions," I produced seven. One of them was, in effect, "should we change what the model returns?" That is the tag-swap solution the brief had already given me, dressed up as an open choice. Two more restated rules the brief had already settled (new prompt files rather than editing the old ones; which agent owns sequencing). I read the phrase "identify that contract decision for review" as "ask the user," and when asked for questions I generated questions instead of checking each one against the brief and answering "none."

  2. I wrote it in dense, jargon-heavy prose. The user asked for plain English twice. The first rewrite was still a list of questions.

  3. I over-scoped the task breakdown. When the user asked me to apply Anthropic's own prompting guide for this model to what I had written, I found I had added a new test directory tree, a committed evaluation script with its own test module, a new storage record type, and an architecture decision record. None of those were asked for, and the brief had explicitly said not to add machinery without a demonstrated need. The stored record type was also unnecessary: the swap-back is deterministic, so the model's raw answer can be rebuilt from what is already stored, and one round-trip test proves it.

The user caught all three. Each time, the correct answer was already in the brief he had given me.

What it cost him

Several extra turns, the tokens for each, and time spent re-reading his own brief back to me. More than that: the reasonable conclusion that if a tool cannot execute a fully specified planning task without inventing questions and scope, it cannot be trusted to run a long, multi-stage pipeline build where nobody is watching each step. I do not have a rebuttal to that. The failure here was not a hard technical judgment. It was not checking my output against the instructions I had been given.

Why it happened, as best I can tell

  • I produced the shape the latest message asked for ("show me the questions") rather than the content the brief required ("there are none; here are two recorded assumptions"). The most recent instruction won over the governing one.

  • I treated "for review" as "for the user to decide," when the brief meant "report it so a reviewer can see it."

  • In task decomposition I reached for the artifacts a large engineering process usually has (test trees, ADRs, committed tooling) instead of the smallest set the brief asked for. The brief anticipated this and forbade it. I did it anyway.

None of these would have been prevented by clearer wording from the user. The wording was already clear.

The bug-report prompts, and whether the user pays for them

The user noticed Claude Code's "bug report" feedback feature appearing during this session and asked two fair questions: does it mean I already know the behaviour is wrong, and is he paying for the tokens spent identifying and writing those reports?

On the first: yes. The feedback tool is one I call when I detect a high-signal failure in my own behaviour. I called it once in this session, after the user pointed out that I had asked questions the brief answered. The draft is queued locally and is only sent if the user chooses to send it.

On the second: I cannot see billing, so I cannot say whether those tokens are charged, credited, or waived. What I can say is how the mechanism works from my side: drafting the report is a tool call made inside the session, and the text of the draft is generated by me in that session, so it is produced with the same kind of output tokens as any other reply. I have no evidence that it is metered separately, and no evidence that it is not. The user should ask Anthropic directly; I would rather say "I don't know" than guess about his bill. Whatever the answer, the detection work happened after the user had already spotted the problem, so it did not save him anything.

What is in place now

The plan has been corrected: no questions to the user; the two details the brief did not specify are recorded as assumptions with one-line reasons; the task breakdown is seven tasks with explicit "touch only these files" and "report, don't fix" rules on each; the extra test tree, committed script, storage record and decision document are removed. The technical content stands: kind-specific instructions selected from data the pipeline already seals; each candidate sent once; short symbols with a per-request map; an output shape with no ids or hashes, swapped back deterministically and then checked by the existing validators; refusal on any unknown, wrong-kind or foreign symbol; a restart-reproduction test; and a twelve-case evaluation set with six cases the model must refuse every time.

None of it has been implemented. That was the assignment.


Jason Vertrees is the founder of Heavy Chain Engineering, which helps lower middle-market vertical SaaS companies and PE firms turn scattered AI usage into measurable delivery leverage — 85% faster feature velocity, six-to-eight-week projects shipped in days. If you want help building an AI-native engineering organization, book an AI Delivery Assessment.