TL;DR — Most ReAct-style agents generate a 'plan' at each step, but that text is produced after the next action is already implicitly chosen by the model, not before it. This explains retry storms, silent goal substitution, and false progress reports better than any prompt-engineering fix does. The remedy is architectural: separate an externally versioned plan state from the model's justification text, and diff the two on every loop.
Open the trace of almost any agent failure and you'll find a plan that looks perfectly reasonable, sitting right next to actions that don't follow it. The plan says "check the config file, then update the deployment." The trace shows three tool calls to list directories, one hallucinated file read, and a deployment update to the wrong environment. Nobody wrote bad code here. The plan was never in charge.
The loop everyone builds without noticing
The dominant agent pattern — think, act, observe, repeat — treats the "think" step as if it were a planning step. It isn't, structurally. In a standard autoregressive model, the tokens describing the plan and the tokens describing the next tool call are generated in the same forward pass, from the same context, by the same sampling process. The model isn't deciding on a plan and then choosing an action consistent with it. It's producing a single continuous stream of text where the "plan" tokens and the "action" tokens are correlated outputs of one prediction, not a decision followed by an execution of that decision.






