How to tell you are in the loop
Building with an AI tool has a recognisable early phase. Each prompt adds something, and the product visibly grows. The loop is the phase after that, and it is easy to miss the moment it starts, because each individual session still ends with something fixed.
Look at the last two weeks of work instead of the last session. If most of the signs below apply, further prompting in the same way is unlikely to end differently, and the routine in the sections that follow is worth the pause.
- A bug you fixed last week is back, and you did not touch that screen.
- You have pasted the same error message into the chat more than three times.
- You avoid certain screens during a demo because you are unsure what state they are in.
- The list of open problems is the same length as a month ago, with different items on it.
- You cannot name a saved version of the app in which everything important worked.
- When someone asks how close you are, your answer is a feeling.
Why a fix in one place breaks another
An AI coding tool works from what it has been shown: your message, the error text and the files it opened for this request. It rewrites code until the error you reported stops appearing. It does not always know what else relied on the code it rewrote. A function that formats a date for the invoice screen may also feed the reminder emails, and a change that satisfies the invoice can quietly alter the emails.
The second half of the cause is that nothing checks yesterday's working behaviour. Software teams guard against this with automatic tests, small programs that click through the important journeys after every change and raise a flag when one stops working. Most AI-built products have none, because nobody asked for them and the product worked without them. So a broken reminder email goes unnoticed until a customer mentions it, by which time several more changes sit on top.
The pile itself then becomes a problem. Each repair adds a special case, the same job ends up written in two or three places, and the tool has more conflicting code to read on the next request. The tool is being asked to keep a whole product consistent with no list of what the product is supposed to do, and that is a hard job for a person as well.
Save a version that works before each change
The first habit is a way back. Before you ask for any change, save the app as it is and give that save a name you will recognise later, such as the date and the words 'checkout and sign-up both working'. Builders offer some form of version history or restore point, and a project connected to a code repository records one with every commit. Which mechanism you use matters less than using it every time.
Then learn how to restore before you need to. Pick an old save, go back to it, confirm the app runs, and return to the present. A founder who has done this once will abandon a bad change after ten minutes. A founder who has never done it keeps prompting forward for another evening, because going back feels riskier than going on.
One caution about the data. Restoring code does not always restore the database. If a change added or renamed a column, the older code may not match the tables any more. Note every change to the structure of the data alongside the save it belongs to, so that going back includes that step.
Write down what the product must do, and re-check it every time
The second habit replaces the missing tests with a page of paper. List the handful of things the product must do for you to take a customer's money in good conscience. Write each as steps with a visible result: 'A new person signs up with an email address, lands on the dashboard and sees an empty project list.' 'A customer pays with a card and the plan on the account page changes.' Keep the list short enough to click through over a coffee.
After every change, however small, go through the whole list. This is the step people skip, and it is the one that breaks the loop, because it tells you within minutes that the fix for the invoice damaged the sign-up. You then know which change did it, since there has only been one. Mark each line as passing or failing with the date.
The list also answers the question you could not answer before. How far you are from done is the number of lines that fail, plus any lines you have not yet written because the feature does not exist. That is a count you can show a co-founder, an investor or an engineer, and it moves in one direction when the work is going well.
Change one thing at a time, and stop at the fourth ask
Ask for one change per request. 'Fix the checkout total and also tidy the settings page and add dark mode' gives you three sets of edits and no way to tell which one broke the sign-up. A single request with a single expected result can be accepted or thrown away as a unit. Say what must stay the same as well as what should change, naming the screens the tool should leave alone.
Set yourself a limit on repeats. If you have asked for the same fix three times and the fault is still there or keeps returning, do not ask a fourth time in the same words. The tool has shown that it cannot find the cause from the information it has. Go back to the last save where that journey passed, and compare: what was added between then and now? The cause is somewhere in that difference.
A change of question often helps at that point. Ask the tool to explain, without editing anything, how the failing feature works and which files take part in it. Read the answer for surprises, such as two places that both calculate the total. Then ask for the smallest change that addresses the cause you found. If the explanation makes no sense to you or contradicts itself, that is useful information about the state of the code, and the next section covers what to do with it.
Getting out of a three-week loop
Does the product need finishing, or does part of it need rebuilding?
Once you have the list and a few days of one-change-at-a-time work, a pattern shows. Either the failing lines go down and stay down, or the same one or two lines keep failing whatever you do. The first product needs finishing. In the second, the trouble usually sits in one area that everything else leans on, most often how the data is organised or how sign-in and permissions were set up.
A part that needs rebuilding is a smaller thing than a product that needs rebuilding. The screens, the wording, the flow you tested with real people and most of the features can usually stay while one foundation underneath is replaced. The table sets out what points each way. Deciding for certain takes someone reading the code, and our guide to rebuild cost covers what a full replacement involves if it comes to that.
Signs that point to finishing, and signs that point to rebuilding one part
- What you observe
- Where the failures are
- Points to finishing
- Spread across unrelated screens, each with its own small cause
- Points to rebuilding a part
- The same area every time, such as anything that touches bookings or accounts
- What you observe
- What happens after a fix
- Points to finishing
- The line on your list passes and keeps passing
- Points to rebuilding a part
- The line passes, then fails again after an unrelated change
- What you observe
- How the tool explains the feature
- Points to finishing
- One clear path through a few files
- Points to rebuilding a part
- Several overlapping versions of the same job, and an explanation that changes each time you ask
- What you observe
- The data
- Points to finishing
- Records look right when you open the tables
- Points to rebuilding a part
- Duplicates, blanks where values belong, or the same fact stored in two places that disagree
- What you observe
- New features
- Points to finishing
- Adding one leaves the existing list passing
- Points to rebuilding a part
- Each addition needs a workaround for the same underlying limit
- What you observe
- Your list over two weeks
- Points to finishing
- Fewer failing lines
- Points to rebuilding a part
- The same count, with the failures moving around
| What you observe | Points to finishing | Points to rebuilding a part |
|---|---|---|
| Where the failures are | Spread across unrelated screens, each with its own small cause | The same area every time, such as anything that touches bookings or accounts |
| What happens after a fix | The line on your list passes and keeps passing | The line passes, then fails again after an unrelated change |
| How the tool explains the feature | One clear path through a few files | Several overlapping versions of the same job, and an explanation that changes each time you ask |
| The data | Records look right when you open the tables | Duplicates, blanks where values belong, or the same fact stored in two places that disagree |
| New features | Adding one leaves the existing list passing | Each addition needs a workaround for the same underlying limit |
| Your list over two weeks | Fewer failing lines | The same count, with the failures moving around |
When to carry on alone and when to ask someone
Carry on alone while the count of failing lines is falling. The routine on this page is how working engineers avoid the same loop, and plenty of founders finish with it. Keep the saves, keep the list, and add a line to the list whenever a customer finds a fault it did not cover.
Ask someone when the count has stopped moving, when the failing lines involve money or private data, or when you have gone back to an old save more than once for the same fault. Bring the list and the names of your saves. An engineer who can see what must work, what fails and which version last passed starts well ahead of one who is handed a chat history. Our Diagnostic is a fixed-price written plan: we read the code, tell you which parts are sound and which one is causing the repeats, and quote the next phase, with the fee credited to the build if you continue with us. Whoever does the work, your repo and accounts stay yours.
Before your next request to the AI
Four things on paper and one rule. They take an evening to set up and they are what turns repeated fixing into progress you can count.
- A named save of the app as it is now, and a restore you have practised once.
- The short list of things the product must do, each written as steps with a visible result.
- Today's pass or fail against every line on that list.
- A note of any change to the structure of the data since the last save.
- The rule: one change per request, the whole list after each, and no fourth ask for the same fix.
We can find the part that keeps breaking.
Book a free consultation and tell us which fixes keep coming undone. We will say whether the routine on this page is likely to get you there or whether the Diagnostic should come first. If we take the build on, we work in your repository, add tests for the journeys on your list, and hand back a product whose changes you can check.
Book a free consultationOn the project call, we’ll discuss the problem, your existing tools and what TDAT should take off your hands. Then we can define the scope and next steps.
Or call (919) 289-1231
Questions before we start
Why does the AI break something else every time it fixes a bug?
It changes code until the error you reported goes away, working from the files it looked at for that request. It may not know what else used that code, and nothing in the project checks that features which worked yesterday still work. Without that check, the damage shows up later and gets blamed on a different change.
Would switching to a different AI tool get me out of the loop?
Usually not by itself. A different tool reading the same tangled code with no list of required behaviour tends to reach the same place. The saves, the written list and one change at a time help with any tool. Switching is worth considering after those are in place and you have a specific limit you keep hitting.
How do I know how close my app is to finished?
Write down the things it must do before you would charge a customer, as steps with visible results, and test each one. The lines that fail, plus the features not built yet, are what remains. Recheck after every change and watch whether the count falls.
Should I start again from scratch?
Rarely as a first move. If failures are scattered and stay fixed once repaired, the product needs finishing. If the same area fails again and again, that part may need rebuilding while the screens and flows stay. A full restart discards work that is often fine, so have someone read the code before deciding.
Do I need automated tests?
They help a great deal once the product is steady, and an engineer finishing the app will usually add them for the main journeys. Until then, a written list you click through by hand after each change does the same job at small scale and costs nothing.
What should I bring to a consultation about this?
Your list of what the product must do, which lines fail today, the name of the last save where the main journey worked, and access to the project. The chat history is less useful than those four things.