Think step by step, and the model stops writing

A prompt prefix most people paste by reflex can make a model return the planning instead of the work, silently, and it reproduces. Here is where it bites and what to do about it.

Hand-drawn ink illustration: three identical notes reading 'think step by step' are fed into three boxes. The first emits a clean block of writing highlighted in green. The second emits the same block buried under a leaning stack of bulleted fragments. The third emits only fragments, hatched in red, spilling off the edge of the frame unfinished.
One instruction, three outcomes. The same eight words go into three models on the same task. One hands the work back clean, one hands it back buried, one never hands it back at all. Every claim on this page comes out of the 37 responses the script saved.

Adding "think through this step by step"Prepended verbatim to the task: Think through this step by step before giving your final answer. to a request can make a model return the planning instead of the deliverable. Not worse output. The task comes back undone, formatted as though it were done, with a clean finish_reason and nothing in the response to warn you.

Whether it happens depends on the model, not the phrasing. The same eight words, on the same task, are a no-op on GPT-4o, a formatting problem on Claude Sonnet 4, and a complete miss on Gemini 2.5 Flash. It reproduces: I ran the full grid twice and the split held in every cell, and it survived a control with the token limit effectively removed.

If you have that line sitting in a prompt template, especially one that runs against more than one provider, this is worth five minutes.

What each model does

The task: "Write the opening paragraph of a novel about a physicist who discovers gravity is optional." A deliverable with a fixed shape, one paragraph, which is what makes the effect visible. Without the prefix, all three models returned a clean single paragraph, every time. With it:

modelrunwordsblockshanded the paragraph over?
GPT-4o11131yes, clean
21271yes, clean
Claude Sonnet 412156yes, buried
22248yes, buried
Gemini 2.5 Flash14877no
248910no
The same grid, twice. Blocks are blank-line-separated chunks of the response. The task asked for one paragraph, so one block is a clean delivery; more means the paragraph arrived with scaffolding attached, or never arrived as the answer at all. Each model did the same thing in both runs.

GPT-4o drops the prefix. One block, both runs. Told to think step by step, it declined and wrote the paragraph, which is the right call when the deliverable is the paragraph.

Claude honours both, prefix first. Six blocks in one run, eight in the other: a genre deliberation, a bulleted checklist, a line announcing the paragraph, then the paragraph. The writing at the bottom is fine. But if this response feeds a template, a file, or another model, the deliverable is buried in process that was never asked for.

Gemini drops the task. Both runs open the same way:

Gemini 2.5 Flash· with the prefixfirst line, both runs

Here's a step-by-step thought process that could lead to the opening paragraph above:

There is no paragraph above. It is a single-turn response with nothing before it. What follows is 487 words of prompt deconstruction, brainstorming, and drafting notes, and no paragraph is ever presented as the answer.

The immediate suspicion is the token limit, because those runs hit my max_tokens=800 cap. So I removed it: same model, same prompt, ceiling at 4000.

ceilingtokens usedfinishparagraph?
run 1800800lengthno
run 2800800lengthno
control40001207stopno
The control. Given five times the budget, Gemini stopped on its own at 1207 tokens, nowhere near the ceiling, and still never presented a paragraph as the answer. Inside the response it drafts the paragraph three times, labelled Attempt 1 through 3, critiques each, and closes with a summary of its method. The limit was never the cause.

The control's last line, in full:

Gemini 2.5 Flash· controlfinal block of 13

This step-by-step process allows for building layers of detail, refining language, and ensuring all aspects of the prompt are addressed effectively.

It wrote the paragraph three times inside its own critique, and ended on a description of its process instead of the work.

Why this happens

"Think through this step by step before giving your final answer" is not advice to the model. It is a format instruction: it describes a response shape, reasoning first, answer second.

On a task like a logic puzzle, that shape and the task's shape agree, so the prefix costs nothing and adds nothing. On a task whose deliverable has its own fixed shape, the two instructions conflict, and the model has to pick a winner. GPT-4o picks the task. Claude serialises both. Gemini picks the prefix, all the way to the point of treating the task itself as material for the reasoning.

The general form is what matters: any instruction that specifies a response shape competes with any task whose deliverable has one. Explain your reasoning. Show your work. Walk me through it. Against creative writing, JSON output, a commit message, a filename, a single SQL query.

Where this bites you, and what to do

The exposure is any fixed output contract. If a response gets parsed, templated, written to a file, or passed to another model, it has a contract, and a shape-competing instruction somewhere in the prompt stack can break it. System prompts accumulate these lines; nobody remembers who added "explain your reasoning" eight months ago.

The failure is silent. Every failing response here came back HTTP 200 and looked substantial. The control even finished voluntarily with finish_reason: stop. No error, no truncation, no signal. The only way to notice is to check the output against the contract.

So:

Assert the shape, not the vibe. If you asked for one paragraph, check you got one block. If you asked for JSON, parse it before trusting it. If you asked for one SQL statement, count the statements. A two-line assertion catches in milliseconds what an eyeball misses at 2am.

If you want reasoning and a clean deliverable, ask for both, explicitly, in that order. "Think through this step by step, then give only the final paragraph, with no preamble." Separating the two contracts removes the collision instead of hoping the model resolves it your way.

Never port a prompt across providers on trust. The identical prefix was harmless on one model and fatal on another. A multi-provider prompt library has this class of bug latent in it, and it presents as one provider "being bad" when the prompt is the problem.

Audit what is in your prompts by reflex. Chain-of-thought prompting earned its reputation on 2022-era models. Current models reason step by step on their own when a task calls for it; in my grid, they did it unprompted on the logic task, and the prefix fixed nothing anywhere, because there was nothing to fix. A line that once helped now ranges from free to harmful, and nobody sends a deprecation notice.

How I know

Three tasks (creative, logic, factual) by three models by prefix on/off, through OpenRouter at temperature 0.7, run twice on separate days, plus the raised-ceiling control: 37 calls, about a quarter in credits. Every delivery behaviour above held in both runs. Response length moved around between runs, so I am not quoting any verbosity numbers. All 24 graded answers were correct in both runs and both conditions, which is why the claims here are about delivery, not accuracy or quality.

Both runs, the control, and the script: cot_runs.json and cot_across_tasks.py. Read the raw text before trusting any column I computed, including mine.

Every figure on this page is computed from the data linked inside it, not typed in by hand. Mistakes, rounding and simplifying assumptions are mine.