App Development

What Software Built Fast With AI Costs You Six Months Later

SKIMBOX Team

You got something working in a fortnight for almost nothing. Now it holds real customer data, nobody can change it safely, and the quotes to take it over are higher than a rebuild. Here is what to check, in what order, and when keeping it is genuinely the right call.

What Software Built Fast With AI Costs You Six Months Later

Somebody built you something in a fortnight for a fraction of what an agency quoted. It worked. That was six months ago, and now it holds real customer data, three people in your business depend on it daily, and the developer you asked to add one feature has gone quiet.

This article is about that situation. It is not about whether the tools are good, and it is emphatically not about whether you were foolish to use them. Quite often the fast version was the right call and the only thing that has changed is what the software is now being asked to carry.

Two siblings cover the adjacent questions: whether AI tools can replace an agency, and whether your supplier should be using them on your product.

Somebody official has written about this, which surprised us

We expected to write this article from experience and vendor documentation. Instead, a security architect at the UK's National Cyber Security Centre published a post in June 2026 on AI-assisted development that is directly on point [1]. It is a signed blog post rather than a formal guidance collection, which is worth knowing when you weigh it, and it is still the most relevant thing any national body has published on this specific question.

Two things about it are worth knowing. First, it takes a risk-tiered position rather than a blanket one: prototypes and internal tools sit at one end, and anything touching authentication, personal data or secrets sits at the other [1]. Second, it prescribes a sequence before relying on AI-assisted code, which is to review it, understand it, check it for vulnerabilities, and verify it [1].

That framing is more useful than any general argument about whether generated code is good, because it puts the question where it belongs: not on how the software was made, but on what it touches.

We should also be honest about what does not exist. There is a lot of published material on building and operating AI systems, and it is not the same subject as code written with an AI assistant. Conflating the two would let us pad this article with impressive-looking references that do not actually address the question. The NCSC guidance is the genuinely on-topic authority source we found, and we would rather say that plainly.

The failure modes, specifically

Not "the code is bad". These are checkable, and most of them are checkable by you.

No tests. This sounds abstract until you need to change something. Without tests nothing tells you what you broke except a customer, so people stop changing things, and the software calcifies. The cost is not a defect. It is that the thing becomes unalterable while your business keeps moving.

Credentials in the code. A database password or API key sitting in a file that was pushed to a repository. This is the most urgent item on the list because it is silent, and because deleting the line does not fix it: the value remains in the version history. The fix is rotation, and it is the step people skip.

Untracked dependencies. Every package pulled in is somebody else's code running with your permissions, carrying its own vulnerabilities and licence obligations. Published vulnerability records for widely used packages are searchable in NIST's National Vulnerability Database [4], so the exposure is knowable once a list exists. OWASP's current top ten includes software supply chain failures as a named category, ranked most significant by a large share of respondents [2]. The problem is not that dependencies exist. It is that no list does.

No error handling. OWASP's current list also includes mishandling of exceptional conditions [2], which is precisely this. Building for failure rather than retrofitting it later is the principle CISA promotes under secure by design [3], and it is the one fast-built software most reliably skips. Code written quickly handles the path where everything works. The visible failure is an unhelpful message. The invisible one is a half-finished operation leaving your data in a state nobody designed.

Access control by pattern. Permission checks assembled by copying the shape of similar code, rather than designed once and enforced in one place. They work for the cases somebody thought of. The gap surfaces when a user does something nobody anticipated, and at that point it is a disclosure rather than a bug.

One thing we will not do is quote you a statistic about what proportion of AI-generated code contains vulnerabilities. Every version of that figure we traced came from a company selling a scanner. Paraphrasing it as "some studies suggest" would launder the same unverifiable number, so we are leaving it out entirely.

Why nobody wants to take it over

Suppliers decline this work or price it high for a commercial reason rather than a snobbish one, and it is worth understanding before you take it personally.

Reading unfamiliar code with no tests and no documentation is slow, risky work, so quotes come back higher than you expect and occasionally higher than a rebuild. We are not going to attach a multiplier to that, because no credible source publishes one. Our guide to changing development agency sets out the full reasoning, since it is really a handover problem rather than an AI one.

A pattern we see. A business asks three suppliers to take over a small system and receives one refusal, one quote that seems absurd, and one that seems reasonable. The reasonable one has not read the code. Six weeks later it is in variations, because the parts that were going to be difficult were difficult, and nobody had looked.

Why it is nobody's fault, which matters for fixing it

Nobody did anything wrong here, and starting from blame makes the problem measurably harder to fix.

The person who built the thing usually did exactly what was asked: produce something that works, quickly, cheaply. They delivered that. What nobody specified was that it would still be running in a year, holding customer records, with three people depending on it. Had that been the brief, the build would have been different and the quote would have been higher.

So the gap is not competence and it is not the tooling. It is that the requirement changed after delivery and nobody revisited the decision. That happens with software built by large agencies too. It is simply faster and cheaper to reach that point now, which means more businesses reach it.

This matters practically because blame makes people defensive, and defensive people do not tell you where the bodies are. If you approach whoever built it asking what they would warn you about, you will get a far more useful answer than if you approach them asking what they got wrong. In our experience the original builder usually knows exactly which parts are fragile, and will say so if the conversation allows it.

The cleanup order, which matters more than the cleanup

Doing these out of sequence wastes work, and the wasted work is usually the expensive kind.

1. Understand it. Get it running in a fresh environment using only whatever instructions exist. This immediately reveals what the instructions are missing, and it is the cheapest diagnostic available. Resist improving anything at this stage.

The ordering is adapted from the sequence the NCSC prescribes before relying on AI-assisted code, which is to review it, understand it, check it for vulnerabilities and verify it [1]. We are applying it retroactively to something already running, which is not quite what it was written for, but the logic holds: you cannot safely change what you have not understood.

2. Get it under proper version control. If the only copy is on somebody's laptop or in a zip file, nothing else on this list is safe to attempt.

3. Rotate anything exposed. Before you write a line of anything. If a credential was ever committed, assume it is compromised regardless of whether it was later deleted. This is the one item that is genuinely urgent, and everything else can wait a week.

4. Add tests where it matters. Not everywhere. Around money, permissions, and anything that writes to your data. Comprehensive coverage of an inherited system is a project nobody will fund, and it is not the goal. The goal is making change survivable where a mistake is costly.

5. Then change things. Not before.

When keeping it is the right answer

Leaving it exactly as it is will often be the right decision, and we want to be plain about that before listing everything that could be improved.

Something small, working, and touching neither payments nor personal data may be entirely fine left alone. If a script has been reformatting your weekly report for eight months without incident, the correct action is nothing. Auditing it would cost more than replacing it, and replacing it would cost more than living with it.

For that category, a proportionate check is an afternoon: find out what it depends on and whether any of that is unmaintained, confirm no credentials are sitting in the code, and make sure somebody other than the original author can run it. That is it.

The case for rebuilding strengthens as the answers to four questions change:

  • Does it hold personal data or take payments? This one moves the needle fastest
  • Does the business depend on it daily?
  • Is there a change you now need that nobody can make safely?
  • Is anyone willing to maintain it?

Four noes and a yes to the last: leave it alone. As those flip, the calculation flips with them.

The UAE angle, stated carefully

If the software holds personal data, treat it as within scope of the data protection law, and our PDPL guide sets out our position including the parts we could not confirm.

We are deliberately not publishing a notification deadline in hours or a penalty figure, because no executive regulation establishing either has been published and a confident wrong number here is worse than none.

What is unambiguous is more useful anyway: not knowing where your personal data is stored, who can reach it, or which third parties receive it is not a defence, and it is a question you can answer this week rather than a legal position you need advice on.

What this actually costs you, in the parts nobody invoices

The bill arrives as four costs that never appear on an invoice: decisions nobody will make, dependence on one person, quiet drift, and a weaker position with your next supplier.

Decision paralysis. Changes stop being made because nobody is confident about the consequences. The feature your sales team asked for six months ago is still not built, not because it is hard, but because nobody wants to be the person who broke the thing.

Key-person dependency. One individual understands it, and that person becomes unable to take a proper holiday. This is the cost that shows up as a resignation rather than an invoice, and it is a genuine business risk sitting inside what looked like a saving.

Compounding drift. Dependencies age, platforms change underneath, and the gap between what the software assumes and what the world does widens quietly. Nothing breaks, until something does, and by then the update that was small a year ago is not small any more.

A weaker negotiating position. When you eventually do need a supplier, you approach them holding something they cannot assess quickly, which makes every quote higher and every timeline longer. The cheap build has raised the price of everything that comes after it.

None of that argues against having built the thing quickly. It argues for knowing which of those four you are currently paying, because you probably are paying at least one.

What you can check yourself, in an hour

Before paying anybody, four questions with no expertise required:

  • Does it run on a machine that has never run it?
  • Are there any tests at all?
  • Does searching the code turn up anything that looks like a password or a key?
  • When were its dependencies last updated?

Those four answers give you most of what an audit would tell you, and they tell you whether you need one. If everything runs, tests exist, nothing looks like a credential, and the dependencies are current, your situation is better than you feared.

What an audit costs

A codebase and dependency audit starts from around AED 4,000 with us. That covers getting the system running, mapping what it depends on, identifying exposed credentials and missing error handling, and a straight answer on keep or rebuild. These are our own figures rather than a market survey, since no official body publishes rates for this work.

The value of that engagement rests entirely on being told when the answer is to do nothing. Ask for that answer explicitly and hold us to it, because an audit that always concludes rebuild is a sales document with a fee attached. What you actually want is somebody willing to tell you your weekend project is fine.

For context on the neighbouring services, our QA guide puts a focused test pass from around AED 4,000, and our website security guide puts a hardening review from around AED 2,500 and a security assessment from around AED 5,000.

Getting a straight answer from whoever built it

Whoever built it is the cheapest source of information you have, and how you ask determines whether you get anything useful.

Ask what they would warn you about. Not what is wrong with it, which invites defensiveness, but what they would tell somebody taking it over. Almost everyone who has built something knows which parts are fragile, which shortcuts they took under time pressure, and which bit they were never happy with. That knowledge is free and it evaporates the moment the conversation becomes adversarial.

Ask three specific things while you have their attention. Which parts would you not touch without testing carefully. What did you leave unfinished or work around. And what would you do differently if you built it again.

Write the answers down. This is the handover documentation you never commissioned, and an hour of it is worth more than a week of somebody else reading the code cold.

If the original builder was you, do the same exercise honestly and write it for whoever comes next, including a future version of yourself who will not remember why any of it is the way it is.

The honest summary

The tools are not the problem and neither is whoever used them. Plenty of software built fast works and keeps working.

What causes the trouble is a mismatch: something built in a fortnight, with a fortnight's care, quietly becoming something the business depends on. Nobody decides that. It accumulates, and the care never catches up with the importance.

So sort what you have by consequence rather than by how it was made. Most of it is fine. Some of it needs an hour. A small amount needs proper attention, and knowing which is which is the entire exercise.

If you have inherited something and want a straight answer on whether it is worth keeping, contact us.

References

[1] National Cyber Security Centre, blog post on the vibe coding spectrum and AI-assisted software development, 18 June 2026. ncsc.gov.uk

[2] OWASP, Top 10:2025. owasp.org

[3] CISA, Secure by Design. cisa.gov

[4] NIST, National Vulnerability Database. nvd.nist.gov

Frequently asked questions

  • Is software built quickly with AI automatically bad?

    No, and starting from that assumption leads to bad decisions. Plenty of it works and keeps working, particularly small internal tools where being occasionally wrong is recoverable. The problems are specific rather than general: missing tests, secrets in the wrong place, untracked dependencies, absent error handling, and access control done by pattern rather than by design. Those are checkable, which is the useful part.

  • Is there official guidance on this?

    Yes, and more than we expected. The UK National Cyber Security Centre published a post in June 2026 on AI-assisted development that takes a risk-tiered approach rather than a blanket position. It treats prototypes and internal tools as lower risk, and anything touching authentication, personal data or secrets as higher risk, and prescribes reviewing, understanding, checking for vulnerabilities and verifying before relying on the output, which is a sequence rather than a slogan.

  • What does risk-tiered actually mean in practice?

    That the same code carries different consequences depending on what it touches. A script that reformats a spreadsheet is genuinely low risk and treating it like a banking system wastes everybody's time. Code that checks whether a user is allowed to see something is high risk regardless of how simple it looks. Sort what you have into those two piles before doing anything else, because the pile decides how much attention each item deserves.

  • What is the most common problem you find?

    No tests, which sounds abstract until you need to change something. Without tests, every change is a gamble, because nothing tells you what you broke except a customer. That is why software with no tests calcifies: not because the code is bad, but because altering it is frightening, so people stop, and the thing becomes a museum piece that nobody dares touch while the business around it keeps changing.

  • What is the most dangerous problem you find?

    Credentials committed into the code, usually a database password or an API key sitting in a file that was pushed to a repository. It is dangerous because it is silent, because it survives in version history even after somebody deletes it, and because the fix is not deleting the line. It is rotating the credential, which people forget to do because deleting the visible copy feels like it should be enough.

  • What does OWASP say that is relevant here?

    Its current top ten includes two categories that land directly on this. Software supply chain failures covers the risk in dependencies you did not audit, and it was ranked most significant by a large share of respondents. Mishandling of exceptional conditions covers what happens when something unexpected occurs, which is precisely the error handling that fast-built software tends not to have, because nobody thinks to ask for it.

  • Why do untracked dependencies matter?

    Because every package you pull in is somebody else's code running with your permissions, and you have inherited both its vulnerabilities and its licence obligations. Software assembled quickly tends to accumulate packages nobody reviewed. The problem is not that they are present, it is that no list exists, so nobody can answer whether any of them is a problem, which is a poor position to be in when somebody asks.

  • What is the licence risk in a dependency tree?

    Some open-source licences impose conditions on what you distribute, and a minority impose substantial ones. Our code ownership guide explains the mechanism. The practical exposure is that nobody made a list, so if a customer or an investor asks what licences your product depends on, the honest answer is that you do not know, which is a poor position in a due diligence conversation.

  • Why does missing error handling matter so much?

    Because software fails in ways nobody planned for, and what it does then is a decision somebody has to have made. Code written quickly tends to handle the path where everything works and nothing else. The visible consequence is a blank screen or an unhelpful message. The invisible one is a half-completed operation that leaves your data in a state nobody designed for.

  • What is wrong with pattern-matched access control?

    That it looks correct and is not verifiable. Access control done properly is a deliberate design: who can see what, enforced in one place, testable. Access control assembled by copying the shape of similar code produces checks that work for the cases somebody thought of. The gap only appears when a user does something nobody anticipated, and by then it is a disclosure rather than a bug.

  • Why will nobody take my project over?

    Because reading unfamiliar code with no tests and no documentation is slow, risky work, and quoting a fixed price against it is how suppliers lose money. That is a commercial reality rather than snobbery. Expect a review period before anybody commits, and treat a supplier who skips straight to a confident quote as taking a risk that will eventually become yours.

  • Is it true a takeover can cost more than a rebuild?

    Sometimes, and it is an uncomfortable thing to be told. With a rebuild, a supplier controls the design and can estimate it. With a takeover they inherit decisions they did not make, in code they have not read, with no catalogue of what is already broken. We are not going to attach a multiplier to that, because no credible source publishes one, but the direction is real.

  • Should I just throw it away and start again?

    Not automatically, and that advice is usually self-serving when it comes from a supplier. Something small, working, and touching neither payments nor personal data may be perfectly fine left exactly as it is. The rebuild case gets strong when the thing holds sensitive data, when the business depends on it daily, or when a change nobody can make safely is now needed.

  • What is the first thing to do with inherited AI-built software?

    Establish what it actually does, before changing anything. That means getting it running in a fresh environment from whatever instructions exist, which immediately shows what the instructions are missing. Resist the urge to improve things during this stage. You cannot safely change software you do not understand, and understanding it is the whole job at this point, however unproductive it feels while you are doing it.

  • What is the correct cleanup order?

    Understand it, get it under proper version control, rotate anything exposed, add tests around the parts that matter, then change things. Doing those out of order wastes work. Adding tests before you understand the system produces tests for the wrong things. Changing code before rotating exposed credentials leaves the exposure in place while you feel productive, which is the worst combination available.

  • Why rotate credentials before anything else?

    Because an exposed credential is live until it is changed, and everything else on the list can wait a week. If a key was committed to a repository, deleting it from the current version does not help, because it remains in the history. Assume anything that was ever committed is compromised, change it, and then continue with the rest of the work.

  • Where should tests be added first?

    Around whatever would be most expensive to get wrong: money, permissions, and anything that writes to your data. Not everywhere, because comprehensive coverage on an inherited system is a project nobody will fund. The purpose here is narrow and practical, which is to make change survivable in the areas where a mistake is costly rather than merely embarrassing, and leaving the rest uncovered is a deliberate choice rather than a failure.

  • Can I keep using it while it is being cleaned up?

    Usually yes, and often you have no choice because the business is already relying on it. That is an argument for the sequencing above rather than against cleanup. Rotating credentials and adding tests can happen without downtime. What you should avoid is running a significant restructuring and normal operations simultaneously with nobody watching the difference, because when something breaks you will not know which change caused it.

  • How do I decide whether to keep it or rebuild?

    Four questions. Does it hold personal data or take payments. Does the business depend on it daily. Is there a change you need that nobody can make safely. And is anyone willing to maintain it. If the answers are no, no, no and yes, leave it alone. As those answers change, the case for rebuilding strengthens, and it strengthens fastest on the first question.

  • What if it works fine and I have no problems?

    Then a light-touch check is proportionate rather than a project. Find out what dependencies it has and whether any are unmaintained, confirm no credentials are sitting in the code, and make sure somebody other than the original author can run it. That is an afternoon. Doing more than that on something small and working is spending money to feel organised.

  • Does this apply to no-code tools too?

    Partly, and the failure modes differ. Applications assembled on a no-code platform carry less risk of the specific problems here, because the platform handles much of the plumbing. What they carry instead is platform dependency and limited portability, which is a real cost that simply arrives later. Our build versus buy guide covers that trade properly, and it is a different conversation from this one.

  • Does UAE data protection law affect this?

    If the software holds personal data, treat it as in scope, and our PDPL guide sets out our position carefully including what we could not confirm. We are not publishing a notification deadline or a penalty figure here, because no executive regulation establishing either has been published. What is unambiguous is that not knowing where your personal data is stored is not a defence.

  • Should I tell my customers if I find a problem?

    Take advice rather than deciding alone, because the answer depends on what was exposed and for how long. What we would say is that finding a problem during a voluntary review is a much better position than finding it during an incident, and that the instinct to quietly fix and say nothing is the one most likely to make things worse later.

  • How much does a codebase audit cost?

    A codebase and dependency audit starts from around AED 4,000 with us, covering getting the system running, mapping what it depends on, identifying exposed credentials and missing error handling, and giving you a straight answer on keep or rebuild. These are our own figures rather than a market survey, since no official body publishes rates for this work. Final pricing depends on the size of the system and how much documentation survives.

  • Will the audit just tell me to rebuild?

    Not if the honest answer is otherwise, and an audit that always concludes rebuild is a sales document. Being told to leave something alone is the outcome that makes the exercise worth buying, so ask for that answer up front. What you want is somebody willing to tell you that your weekend project is fine and you should stop worrying about it.

  • What can I check myself before paying anyone?

    Four things, none of which need expertise. Does it run on a machine that has never run it. Are there any tests. Does a search of the code turn up anything that looks like a password or a key. And when were its dependencies last updated. Those four answers tell you most of what an audit would, and they cost you an hour.

  • Who should own this software inside my business?

    Somebody, named, and that is frequently the missing piece. Software built quickly often has no owner because it was never a project, so nobody monitors whether it still works, whether its dependencies are current, or whether the business has started leaning on it harder. Assigning a name to it, even for an hour a month, is the cheapest single improvement available.

  • What is the honest summary?

    The tools are not the problem and neither is the person who used them. The problem is that software which took a fortnight to build gets treated as though it needs a fortnight of care, when what determines the care it needs is what it touches. Sort by consequence, not by how it was made, and most of this becomes manageable.

SKIMBOX Team

Tech Consultancy

Get fresh writing in your inbox

One email a fortnight. No filler.

By subscribing, you agree to our privacy policy.

Want us to build something?

We work with teams across MENA, UK, USA, and India to build products, run programs, and grow.

Get in touch

Continue reading