Steering Mid-Flight
Interrupting, redirecting, rejecting, and knowing when to throw it away and restart instead of arguing.
Watching an AI go the wrong way is uncomfortable, and most people respond by waiting politely for it to finish. Do not. Interrupting early is cheap; letting a wrong approach complete is expensive, and then you have to argue it back out.
What off course actually looks like
“Wrong” rarely announces itself with an error. Long before the code fails to run, there are signals — if you are watching for them rather than waiting for a red terminal to tell you.
Touching files you did not name
Ask why before it goes further. Sometimes it found a real dependency you missed. More often it is guessing at scope.
Inventing a function or API that is not there
A sign it is pattern-matching from training data instead of reading your code — the same mechanism behind the hallucinated imports from the chapter on what the AI can see.
Fixing something you did not ask about
It found a real bug on the way, or it is filling silence with visible progress. Either way it is now solving two problems on your one prompt's budget.
A diff that keeps growing while you watch
Each additional file is another decision built on the one you have not yet confirmed. The longer you wait, the more expensive the interrupt gets.
Interrupt early
Every agent-style tool lets you stop it mid-run — usually Escape or Ctrl+C. Use it the moment you see the approach is wrong, not after.
The instinct to wait comes from conversational politeness that does not apply here. There is nobody to offend, and every additional file it touches is another thing you will need to review or revert.
Stop — you are editing the wrong file. The cart total iscalculated in src/lib/pricing.ts, not in the component.Start again there.Redirect with specifics, not vibes
“No, that’s wrong” gives the model nothing to work with. It will try a different guess, which is as likely to be wrong as the first. Say what was wrong and what you want instead.
- 1Weak
“That's not right, try again.”
- 2Better
“You used a global variable for the theme. Use React context instead, like ThemeProvider already does in src/app/providers.tsx.”
The second version costs ten more seconds and removes an entire round trip. It also removes the failure mode where the model cycles through three wrong approaches because it never learned which dimension it got wrong.
Rejecting well
You do not have to accept a change to learn from it. Reading a rejected diff often tells you the prompt was ambiguous before you rewrite it.
Ask before rejecting
- →Did it do what I literally asked, rather than what I meant? Then fix the prompt, not the code.
- →Did it invent something it could not see? Then attach the real file and retry.
- →Is it right but not how I would do it? Consider whether that matters before spending prompts on style.
- →Is it right and I simply do not understand it? Ask for an explanation instead of rejecting.
The two-strike rule
This is the most useful habit in the chapter. If two consecutive attempts fail to fix the same problem, stop prompting. Do not send a third.
Two failures almost always mean the model is missing context rather than lacking ability, and a third prompt into the same hole produces a third variation of the same misunderstanding — often while adding new damage on top.
What that looks like in practice, on a real bug:
Restoring, then attaching the real discount logic in pricing.ts, gave it the one file it had been guessing about. The fix landed in a single message once it could see the actual bug instead of a symptom of it.
Same model, same bug. The difference was the input it was given, not a cleverer prompt for the same input.
Restart the conversation, not just the prompt
Long threads accumulate wrong turns. Once a conversation contains three rejected approaches, those rejections are still in the context — the model is now steering around its own past mistakes rather than solving your problem cleanly.
Starting fresh feels like losing progress. It is not: your code is on disk, and a new conversation with one good prompt that describes the current state will usually beat twenty messages of accumulated correction.
Fresh start. The cart total in src/lib/pricing.ts double-countsdiscounts when an item has both a percentage and a fixeddiscount. Read that file and the tests in pricing.test.ts,then explain the cause before fixing anything.Key takeaways
- Interrupt the moment the approach is wrong. There is nobody to be polite to.
- Say what was wrong and what to do instead — “try again” just buys another guess.
- A rejected diff often means the prompt was ambiguous. Fix the prompt.
- Two failures in a row: restore, add context, and change the approach. Never send a third.
- When a thread fills with wrong turns, start a new one. The code is safe on disk.
Quick check
Answer these to unlock the next chapter — 3 of 4 to pass. You can retake it anytime.
Answer every question to check.
Make a free account to read on
Every chapter is free — an account is how your progress, XP, and streak follow you from your laptop to your phone, and how you show up on the leaderboard. No payment, no trial.