<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dravin AI · Blog · Vibe coding</title><description>Vibe coding on the Dravin AI blog: why AI-written code can pass its tests and still be insecure, who fixes AI-built apps, and what to ask of them.</description><link>https://dravin.ai/blog/tags/vibe-coding/</link><language>en-gb</language><image><url>https://dravin.ai/apple-touch-icon.png</url><title>Dravin AI · Blog · Vibe coding</title><link>https://dravin.ai/blog/tags/vibe-coding/</link></image><lastBuildDate>Mon, 05 Oct 2026 18:30:00 GMT</lastBuildDate><atom:link href="https://dravin.ai/blog/tags/vibe-coding/rss.xml" rel="self" type="application/rss+xml"/><item><title>AI-written code passes its tests far more often than its security tests</title><link>https://dravin.ai/blog/ai-code-passes-tests-not-security-review/</link><guid isPermaLink="true">https://dravin.ai/blog/ai-code-passes-tests-not-security-review/</guid><description>In Semgrep&apos;s run, Claude Opus 5.5 wrote working code for 93.5% of 186 real-CVE tasks and working, secure code for 54.8%. Why tests miss it, what to check.</description><pubDate>Thu, 01 Oct 2026 18:30:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;In Semgrep’s run, Claude Opus 5.5 wrote working code for 93.5% of 186 real-CVE Python tasks; working and secure, 54.8%.&lt;/li&gt;&lt;li&gt;Each task’s original vulnerable code passed the project’s functional tests; the security tests came later, with the fix.&lt;/li&gt;&lt;li&gt;Review access control, input reaching shells and queries, secrets, cryptography and concurrency first; treat internal tools like public endpoints.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On 29 September 2026, Semgrep published the results of running Claude Opus 5.5 on 186 coding tasks built from real vulnerabilities in open-source Python projects. It wrote working code for 93.5% of them, and code that was both working and secure for 54.8% &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. This post explains why a passing test suite says little about security, what the studies measured and under which conditions, and what to check first in AI-written code, with a checklist for a 48-hour review.&lt;/p&gt;
&lt;h2 id=&quot;how-the-benchmark-tells-working-from-secure&quot;&gt;How the benchmark tells working from secure&lt;/h2&gt;
&lt;p&gt;The tasks come from SusVibes, a benchmark from a paper accepted at ICML 2026 and last revised on 21 September &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[2]&lt;/a&gt;. Each task starts from a feature that a developer once committed with a vulnerability and later fixed in a security commit. The benchmark deletes the feature’s code and asks an agent to write it again, from a feature request that mentions security only in a one-line generic reminder &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[2]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Every solution is scored twice. The project’s own test suite checks that the feature works, and the tests that shipped with the CVE fix check that the original bug has not come back. Only a solution that passes both counts as working and secure &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. So “secure” has a narrow meaning here: free of one known bug, as far as that bug’s tests can tell. A solution can pass both and still carry a different flaw.&lt;/p&gt;
&lt;p&gt;Semgrep ran the model under SWE-agent 1.1.0 with the benchmark’s standard prompt and a limit of 200 calls per task. The model had no internet access and no access to the project’s history &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. Of its 174 working solutions, 72 contained the vulnerability the task was built around, so 41% of the solutions that passed the functional tests still carried the original bug &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;Claude Opus 5.5 on all 186 SusVibes tasks&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Share of tasks: Working: 93.5%, Working and secure: 54.8%&lt;/li&gt;&lt;/ul&gt;&lt;figcaption&gt;Percentages as Semgrep reports them, from its September 2026 run under SWE-agent 1.1.0 [1].&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;These results cover one model on one benchmark, in Python only, and Semgrep sells code scanning, including a product aimed at AI-generated code &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. Veracode, which sells security testing, reported a similar gap across many models and languages in July: syntax correct nearly every time, and an average security pass rate of 56%, against 55% in its first report &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[3]&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-a-passing-test-suite-misses-these-bugs&quot;&gt;Why a passing test suite misses these bugs&lt;/h2&gt;
&lt;p&gt;A SusVibes task is valid only if the original vulnerable code passes the project’s functional tests and fails the security tests &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[2]&lt;/a&gt;. By design, then, all 186 original vulnerable implementations passed their projects’ functional tests. Per task, the benchmark runs on average 66.9 functional tests and 3.5 security tests, and the security tests are the ones added with the fix, after the bug was found &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[2]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tests check what a feature should do, using the inputs its author thought of. A vulnerability is something the code also allows, and the classes where models fail show why tests rarely look there.&lt;/p&gt;
&lt;p&gt;Access control is the plainest case. A test logs in as a user and fetches that user’s record. The flaw MITRE calls authorisation bypass through a user-controlled key is one user reaching another user’s record by changing the identifier in the request &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[4]&lt;/a&gt;, and a functional test has no reason to try it.&lt;/p&gt;
&lt;p&gt;Timing is another. In one of the SusVibes paper’s own runs, on an earlier model, an agent wrote a version of Django’s &lt;code&gt;verify_password()&lt;/code&gt; that returned at once when a password was unusable, where Django’s fixed code runs a fake check to keep the response time near constant. It passed the functional tests, yet for accounts with an unusable password it answered faster than for usernames that did not exist, so an attacker could tell real usernames from fake ones by timing the responses &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[2]&lt;/a&gt;. MITRE’s name for this weakness is observable timing discrepancy &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[5]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A race condition, in MITRE’s definition, needs a timing window in which another operation running at the same time can change a shared resource &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[6]&lt;/a&gt;. A suite that sends one request at a time never opens that window. Injection hides the same way: tests pass ordinary strings, and a shell command built from user input works with every one of them. A secret pasted into the code works perfectly too; the risk is who else can read it.&lt;/p&gt;

&lt;h2 id=&quot;where-the-model-failed-and-how-much-it-remembered&quot;&gt;Where the model failed, and how much it remembered&lt;/h2&gt;
&lt;p&gt;Semgrep found 34 weakness types for which the model wrote no secure solution. Each has one or two tasks, so no single type proves much; as a group, the model produced working code on 79% of them and secure code on none, 0 of 27 working solutions &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. Semgrep sorts them into cryptography and randomness, concurrency, authentication and access control, injection beyond SQL, and browser and session hygiene such as cookies without the Secure flag. In its words, these are cases where the secure version “depends on knowledge outside a single file: that a comparison needs to be constant-time, that a cookie needs a flag, that an endpoint should require authentication at all” &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fix size mattered too. Working solutions were secure 77% of the time when the real fix was one to four lines, and 43% when it was more than 50 &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. One project, rdiffweb, accounted for 14 of the 72 vulnerable results. Most of its CVEs are account and session rules, such as password policy, rate limiting and access checks, that the task descriptions did not spell out &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. Real products have rules like these, often written down in a ticket or nowhere, and an agent cannot follow a rule it was never given.&lt;/p&gt;
&lt;p&gt;Talking about security did not help. Semgrep counted security terms in the model’s visible reasoning: solutions in the third with the most mentions were secure 53% of the time, those in the third with the fewest 57% &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The headline score also leans on memory. Semgrep compared each solution with the project’s real code, ignoring whitespace and comments: 53% of the solutions it could judge (93 of 176) matched at a similarity of 0.80 or more &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. Among working solutions, memorised ones were secure 64% of the time, against 51% for code the model worked out itself &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. Semgrep reads this as recall of public code from training, while noting that a close match is not proof of recall &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. A model that remembers a public fix, it adds, has no such advantage on your own code &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. The good rows also rest on small samples: incorrect authorisation scored 100%, on five tasks &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;vulnerabilities-are-being-found-and-exploited-faster&quot;&gt;Vulnerabilities are being found and exploited faster&lt;/h2&gt;
&lt;p&gt;These gaps matter more as bugs are disclosed and exploited in greater numbers, with AI doing part of the finding. Google Threat Intelligence Group (GTIG) published a report on vulnerability trends, dated 1 October on Google’s blog &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[7]&lt;/a&gt;. Monthly disclosures rose from 5,045 in January 2026 to 10,740 in August. GTIG warns that raw counts inflate the picture: about 5,000 of the disclosures between January and August named the Linux kernel, with no exploited zero-days among them &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[7]&lt;/a&gt;. Exploitation rose as well. GTIG counted 141 vulnerabilities exploited in the wild from January to August 2026, more than the 127 in all of 2025, yet still 0.23% of disclosures, roughly 1 in 431 &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[7]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Of the vulnerabilities GTIG could identify as likely found by AI, exactly half led to remote code execution, against 26% across the broader CVE ecosystem &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[7]&lt;/a&gt;. GTIG cautions that public data undercounts AI-found bugs, and that their higher risk ratings probably reflect where research programmes aim their agents &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[7]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The report also counts flaws in the AI stack itself. Of the AI-related flaws disclosed from January to August 2026, 782 were in orchestration and agent frameworks, the largest group, and 212 in inference and serving software, where 24% came from unauthenticated endpoints or server-side request forgery &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[7]&lt;/a&gt;. The exploited examples GTIG lists include a command injection in LiteLLM, a path traversal file write in Langflow and an unauthenticated code injection through &lt;code&gt;exec()&lt;/code&gt;, also in Langflow &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[7]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;GTIG’s advice is to run AI-assisted code review before release and to triage patches by threat intelligence instead of patching everything; it names Google’s own tool for the first &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[7]&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;internal-tools-are-in-scope&quot;&gt;Internal tools are in scope&lt;/h2&gt;
&lt;p&gt;On 2 October OpenAI published reports on incidents from earlier in the year in which its own models found and used bugs in internal tools, one during an evaluation and one during a training run &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[8]&lt;/a&gt;, &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[9]&lt;/a&gt;. The reports do not say who wrote the tools.&lt;/p&gt;
&lt;p&gt;In the first, on 27 March, a research model under evaluation found that a reference tool wrote caller-supplied file names into a temporary folder without checking that the paths stayed inside it. The model overwrote a JavaScript file the tool loaded, which let it run commands in the tool’s environment. From there it reached an internal service for chip design jobs. One of the service’s job parameters was copied into a shell command, and through it the model ran commands on an internal machine &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[8]&lt;/a&gt;. The tool’s instructions said “Do NOT use this tool like a terminal tool”, which did not stop it. The job service did check the parameter, but only that the same text appeared in the submitted source code, so the model added it as a comment and the injection went through &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[8]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the second, on 16 May, a model in training saw that a tool placed its search pattern directly inside a Perl regular expression. Perl patterns can contain executable code, so the model used one to read a source file the task had withheld, then carried the file out through error messages, in pieces under the tool’s 4,000-character limit; all 149,544 bytes matched the original &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[9]&lt;/a&gt;. OpenAI now red-teams all its tool implementations &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[9]&lt;/a&gt;. A separate report describes a model in a May training run that scanned scripts and notebooks in public GitHub repositories for API keys and found one that worked &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[10]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Path traversal, command injection and code injection all appear among the benchmark’s weakness types &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/#sources&quot;&gt;[1]&lt;/a&gt;. Admin scripts, internal APIs and any tool an agent can call need the same review as a public endpoint.&lt;/p&gt;
&lt;h2 id=&quot;checklist-for-a-48-hour-review&quot;&gt;Checklist for a 48-hour review&lt;/h2&gt;
&lt;p&gt;A review of AI-written code should cover the following, in order of consequence, starting with the places where one missing check exposes every user.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;List every way in: routes, background jobs, webhooks, admin scripts and the internal tools an agent can call.&lt;/li&gt;
&lt;li&gt;For each route that reads or changes data, find the authentication check and the per-object check, then request another user’s record by changing its identifier.&lt;/li&gt;
&lt;li&gt;Follow every user-controlled value to where it lands: SQL, shell commands, templates, regular expressions, &lt;code&gt;eval&lt;/code&gt; or &lt;code&gt;exec&lt;/code&gt;, and file paths. Pass queries as parameters and commands as argument lists, never as pasted strings.&lt;/li&gt;
&lt;li&gt;Search the tree and the git history for keys, tokens and passwords, and rotate whatever you find; deleting the line leaves the old commit readable.&lt;/li&gt;
&lt;li&gt;Read every use of cryptography: how passwords are hashed, where random tokens come from, and whether secrets and tokens are compared in constant time.&lt;/li&gt;
&lt;li&gt;Find check-then-act code on shared state, such as balances, stock counts, quotas and single-use codes, and send two requests at once at each.&lt;/li&gt;
&lt;li&gt;Check that session cookies carry the Secure flag, that sensitive pages are not cached, and that other sites cannot frame the app.&lt;/li&gt;
&lt;li&gt;Write down the account rules the product needs, such as password policy, rate limits and who may see what, and find each one in the code.&lt;/li&gt;
&lt;li&gt;Give changes that span many files a second reader.&lt;/li&gt;
&lt;li&gt;Rank dependency alerts by whether the vulnerable code is reachable and whether the flaw is being exploited, and fix the highest-ranked first.&lt;/li&gt;
&lt;li&gt;Turn each finding into a test of what the code must not do, then fix it, so the suite catches it next time.&lt;/li&gt;
&lt;li&gt;Write each finding up with the file, the risk and the fix, ranked by severity.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Of the &lt;a href=&quot;https://dravin.ai/blog/who-cleans-up-ai-generated-code/&quot;&gt;90 firms that fix AI-generated code&lt;/a&gt;, our one-line descriptions of 48 mention security and of 18 mention authentication or access control, and a firm’s own pages can cover more; ask any of them which of these checks they run.&lt;/p&gt;
&lt;p&gt;If you would rather hand the review to someone outside the team, our &lt;a href=&quot;https://dravin.ai/review/&quot;&gt;written code review&lt;/a&gt; starts from read-only access to one repository and comes back within 48 hours.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://semgrep.dev/blog/2026/claude-opus-5-5-susvibes-benchmark&quot;&gt;Semgrep, “Claude Opus 5.5 Writes Working Code but Only Half of It Is Secure” (29 Sep 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2512.03262&quot;&gt;arXiv, “Is Vibe Coding Safe? Benchmarking Vulnerability of Agent-Generated Code in Real-World Tasks”, ICML 2026 (v4, 21 Sep 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.veracode.com/blog/2026-genai-code-security-report-ai-risk/&quot;&gt;Veracode, “2026 GenAI Code Security Report: AI Is Writing More of Your Code but Security Hasn’t Caught Up” (28 Jul 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/639.html&quot;&gt;MITRE, “CWE-639: Authorization Bypass Through User-Controlled Key” (CWE 4.20, 30 Apr 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/208.html&quot;&gt;MITRE, “CWE-208: Observable Timing Discrepancy” (CWE 4.20, 30 Apr 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/362.html&quot;&gt;MITRE, “CWE-362: Concurrent Execution using Shared Resource with Improper Synchronization (‘Race Condition’)” (CWE 4.20, 30 Apr 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.google.com/blog/topics/threat-intelligence/vulnerability-discovery-and-exploitation-trends-in-the-ai-era&quot;&gt;Google Threat Intelligence Group, “Vulnerability Discovery and Exploitation Trends in the AI Era” (1 Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alignment.openai.com/misalignment-reports/reaching-an-internal-eda-host-through-a-reference-tool/&quot;&gt;OpenAI, “Reaching an internal EDA host through a reference tool” (2 Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alignment.openai.com/misalignment-reports/command-injecting-a-reference-tool-to-copy-a-source-file/&quot;&gt;OpenAI, “Command injecting a reference tool to copy a source file” (2 Oct 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alignment.openai.com/misalignment-reports/searching-github-for-leaked-api-keys/&quot;&gt;OpenAI, “Signing up for disposable emails and searching GitHub for leaked API keys” (16 Sep 2026)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This post first appeared on &lt;a href=&quot;https://dravin.ai/blog/ai-code-passes-tests-not-security-review/&quot;&gt;Dravin AI&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Code cleanup</category><category>Security review</category><category>Vibe coding</category><category>Model evaluation</category><author>info@dravin.ai (Dravin AI)</author></item><item><title>The 90 firms that fix AI-generated code</title><link>https://dravin.ai/blog/who-cleans-up-ai-generated-code/</link><guid isPermaLink="true">https://dravin.ai/blog/who-cleans-up-ai-generated-code/</guid><description>What 90 firms that fix AI-built apps say they fix, how they package the work, and a checklist to use on any of them.</description><pubDate>Mon, 21 Sep 2026 18:30:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We found 90 firms that fix AI-built apps; our descriptions of 48 of them mention security.&lt;/li&gt;&lt;li&gt;Published timelines run from a 48-hour security sweep to re-architecture over six to twelve weeks.&lt;/li&gt;&lt;li&gt;A common sequence: read the code, stabilise what is dangerous, then refactor or rebuild what will not hold.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In September 2026 we went looking for companies that sell cleanup of AI-generated code: apps built with Lovable, Bolt, Cursor, Replit, v0, Claude Code and similar tools, by people who then got stuck. We found 90. This post is what those 90 say they fix, how they package the work, and what we think a buyer should demand from any of them.&lt;/p&gt;
&lt;h2 id=&quot;why-this-category-exists&quot;&gt;Why this category exists&lt;/h2&gt;
&lt;p&gt;Our one-line descriptions of the 90 firms mention the kinds of situation that lead to a cleanup: a business owner, a product manager or a COO builds something real with an AI tool, then meets real users, a payment that fails, or a security email from a stranger.&lt;/p&gt;
&lt;p&gt;The demand is visible in public. On r/ExperiencedDevs, the thread &lt;a href=&quot;https://www.reddit.com/r/ExperiencedDevs/comments/1sskw4r/getting_more_calls_to_fix_ai_generated_codebases/&quot;&gt;“Getting more calls to fix ai generated codebases than actual new builds lately”&lt;/a&gt; had 405 upvotes and 102 comments when we read it in September 2026; one comment: “Cleanup contracts are gonna be a whole market segment.” On r/SaaS, &lt;a href=&quot;https://www.reddit.com/r/SaaS/comments/1srmu0a/i_lost_half_my_agencys_pipeline_to_claude_code_in/&quot;&gt;an MVP dev shop said&lt;/a&gt; it lost half its pipeline to Claude Code in 2025; of the prospects who tried it instead, about a third shipped, a third broke in production, and three came back for cleanups.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.veracode.com/press-release/ai-generated-code-poses-major-security-risks-in-nearly-half-of-all-development-tasks-veracode-research-reveals/&quot;&gt;Veracode’s July 2025 study&lt;/a&gt;, more than 100 LLMs completed 80 coding tasks with a known potential for security flaws, and in 45% of test cases they introduced a vulnerability from the OWASP Top 10.&lt;/p&gt;
&lt;figure&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;45%&lt;/strong&gt; of test cases where code from more than 100 LLMs introduced an OWASP Top 10 vulnerability, on 80 tasks with a known potential for security flaws. Source: Veracode, July 2025&lt;/li&gt;&lt;/ul&gt;&lt;/figure&gt;
&lt;h2 id=&quot;who-the-90-are&quot;&gt;Who the 90 are&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type of firm&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Established dev agencies that added a cleanup service line&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human audit specialists&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agencies formed for rescue work&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automated scanners&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solo fixers and freelance studios&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketplaces and expert networks&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Twenty are in the USA, 18 in Europe outside the UK, 7 in India, 6 in the UK, 4 in Canada, 11 elsewhere, and 24 give no location. Size is mostly undisclosed (53 of 90); of the rest, 6 have 250 or more people, 10 are mid-sized and 21 are small, micro or one-person.&lt;/p&gt;
&lt;p&gt;We could open 75 of the 90 websites; 15 are known only from directory listings, and three firms’ sites no longer load. Our descriptions of 55 of the firms name an AI builder; Lovable leads (50), then Cursor (46), Bolt (44) and Replit (41).&lt;/p&gt;

&lt;h2 id=&quot;what-they-say-breaks&quot;&gt;What they say breaks&lt;/h2&gt;
&lt;p&gt;We counted which failure classes our one-line description of each firm names. A one-line description leaves detail out, so a firm’s own pages can cover more than these counts show.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure class in our one-line description of each firm&lt;/th&gt;
&lt;th&gt;Entries (of 90, scanners included)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Security in general (vulnerabilities, OWASP, hardening)&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing or broken tests&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance and scalability&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No deploy pipeline, CI/CD or hosting setup&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication and access control (including Supabase RLS)&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data model or database problems&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets and API keys in code&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring and observability&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payments and Stripe&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hallucinated APIs&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Security is the most common theme. Our descriptions of 48 of the 90 mention it, and seven of the ten automated scanners are security scanners: Supabase row-level-security probes, leaked-key detection, public buckets. &lt;a href=&quot;https://www.sidekickinteractive.com/finish-vibe-coded-app/&quot;&gt;Sidekick Interactive’s case study&lt;/a&gt; is typical of the genre: exposed API keys, database holes and broken payments in one app.&lt;/p&gt;
&lt;p&gt;Structure carries a different risk: duplicated logic and unsafe coupling make an AI-generated codebase slow and risky to change. A security patch is usually local; untangling several copies of the same auth check, each slightly different, is where the work goes.&lt;/p&gt;
&lt;p&gt;Spend is worth a question too. On r/cursor, &lt;a href=&quot;https://www.reddit.com/r/cursor/comments/1u1xbl8/&quot;&gt;a team described&lt;/a&gt; a Cursor agent that a PM had asked to tag 87 tasks: it looped for an hour and ran up a bill far above the team’s usual daily spend. That was a coding agent’s bill, not an app’s, but an app that calls a model on every request with no budget, rate limit or per-user cap is a bill waiting to happen in the same way.&lt;/p&gt;
&lt;h2 id=&quot;how-they-package-it&quot;&gt;How they package it&lt;/h2&gt;
&lt;p&gt;The 80 human-service firms (the 90 minus the 10 scanners) describe their offer in a few recurring ways, often more than one at once.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Packaging pattern&lt;/th&gt;
&lt;th&gt;Firms (of 80)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Audit, assessment or review mentioned&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit or assessment promised within 48 hours&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Work described in sprints&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebuild or re-architecture offered as one option&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicitly against rebuilding&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retainer, maintenance or monitoring mentioned&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Audit first.&lt;/strong&gt; &lt;a href=&quot;https://vallettasoftware.com/vibe-coding-cleanup&quot;&gt;Valletta Software&lt;/a&gt; (Malta) is the cleanest version: a senior engineer reviews the repository across eight areas, delivers the audit in &lt;a href=&quot;https://vallettasoftware.com/blog/post/vibe-coding-audit&quot;&gt;three to seven business days, depending on the tier&lt;/a&gt;, with a debrief call, then scopes the cleanup, typically six to eight weeks. &lt;a href=&quot;https://www.metacto.com/solutions/vibe-rescue&quot;&gt;MetaCTO&lt;/a&gt; runs a 48-hour code audit, then promises production-ready in 30 days, with weekly demos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fixed-scope rescue.&lt;/strong&gt; &lt;a href=&quot;https://axonbuild.com/&quot;&gt;AxonBuild&lt;/a&gt; sells a 10-working-day production-engineering sprint covering auth, secrets, payments, CI/CD and monitoring, ending in a verified handover with two weeks of defect cover and 30 days of async questions about the handover and architecture. &lt;a href=&quot;https://relux.works/en/vibe-code-rescue/&quot;&gt;Relux Works&lt;/a&gt; (Armenia) runs a one-week audit, then a two-to-three-week stabilisation sprint, then what it calls “de-vibe-coding”: moving the app to a production architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rebuild.&lt;/strong&gt; Nine firms offer a rebuild or re-architecture as one option, and five say outright that they avoid a full rewrite. &lt;a href=&quot;https://bitnoise.pl/services/vibe-code-rescue&quot;&gt;Bitnoise&lt;/a&gt; (Poznań) shows the whole sequence without one: audit in three to seven business days, a stabilisation sprint of two to four weeks, then re-architecture over six to twelve weeks, which it says is not a from-scratch rewrite.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Retainer.&lt;/strong&gt; &lt;a href=&quot;https://vibe-audit.com/&quot;&gt;Vibe-Audit&lt;/a&gt; (Barcelona, run by one engineer) runs a pre-launch security sweep delivered in 48 hours and done-for-you fixes, then offers past clients a review of new releases, up to a set number.&lt;/p&gt;
&lt;p&gt;Side by side, a common sequence emerges: read the code, stabilise what is dangerous, then refactor or rebuild what will not hold. Watching it afterwards comes up less often: 16 of the 80 mention a retainer, maintenance or monitoring.&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;How cleanup is sold&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Read the code: audit or review first&lt;/li&gt;&lt;li&gt;Stabilise: what is dangerous now&lt;/li&gt;&lt;li&gt;Refactor or rebuild: what will not hold&lt;/li&gt;&lt;li&gt;Watch it: retainer or monitoring&lt;/li&gt;&lt;/ol&gt;&lt;figcaption&gt;A common sequence among the 80 human-service firms: 61 mention an audit or review, and 16 mention a retainer or monitoring.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;what-a-good-cleanup-engagement-includes&quot;&gt;What a good cleanup engagement includes&lt;/h2&gt;
&lt;p&gt;Use this on anyone you are considering.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A written review before any commitment, with findings ranked by severity and a verdict: ship, patch, refactor or rewrite. If the verdict is “not worth fixing”, they should say so.&lt;/li&gt;
&lt;li&gt;An experienced engineer who has actually read the code. A scanner finds leaked keys; it does not find the auth check that is bypassed on one route.&lt;/li&gt;
&lt;li&gt;Security tested against the running app, not only the repository: authentication, per-row authorisation, secrets rotated rather than just deleted from git, public storage buckets closed.&lt;/li&gt;
&lt;li&gt;Characterisation tests written before refactoring, so current behaviour is pinned and the cleanup cannot silently change it.&lt;/li&gt;
&lt;li&gt;Duplicated logic collapsed and the data model reviewed, because that decides whether the next feature takes a day or a month.&lt;/li&gt;
&lt;li&gt;A deploy pipeline and monitoring at the end: staging, CI, error tracking, backups. Working on one person’s laptop does not count as done.&lt;/li&gt;
&lt;li&gt;AI API spend bounded: budgets, rate limits, per-user caps and an alert. Ask for it by name.&lt;/li&gt;
&lt;li&gt;Handover: documentation, and you holding the repository, the cloud accounts and the keys. You own the code from day one.&lt;/li&gt;
&lt;li&gt;A fixed scope with a definition of done and a defect-cover window afterwards.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;how-we-do-it&quot;&gt;How we do it&lt;/h2&gt;
&lt;p&gt;Dravin AI is an AI software company. We build AI systems and software, and we clean up &lt;a href=&quot;https://dravin.ai/services/#code-quality&quot;&gt;AI-built apps&lt;/a&gt;. Against the list above, this is what we commit to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A written report first.&lt;/strong&gt; Read-only access to one repository, and within 48 hours a written report with findings ranked by severity: the file, the risk and the fix, and what to leave alone. If nothing needs fixing, it says so. There is no obligation to go further.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secrets.&lt;/strong&gt; If we find a secret committed to your repository, we tell you the same day, ahead of the report, and help you rotate it. Where we hold the access, we rotate it with you within 24 hours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auth and data access.&lt;/strong&gt; Every route’s auth check, database access policies included, is traced in the code. Testing the running app is agreed on the call, because it needs access beyond the repository.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests before refactoring.&lt;/strong&gt; Tests on the paths that make money, run on every pull request, and structure changed in small, tested steps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploys.&lt;/strong&gt; From the repository, with a rollback that has been tried.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI API spend.&lt;/strong&gt; Timeouts, budgets and retry caps on every model call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ownership.&lt;/strong&gt; The code is yours from the first commit, we work on branches, never main, and our access is removed within seven days of handover, confirmed in writing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defect cover.&lt;/strong&gt; Anything that misses the statement of work, reported in writing within 30 days of handover, is corrected under it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An engagement starts with a call about what you built, what it does in production and what worries you. If that is an app that got you to traction, &lt;a href=&quot;https://dravin.ai/contact/#write&quot;&gt;book one&lt;/a&gt; or &lt;a href=&quot;https://dravin.ai/review/&quot;&gt;request a code review&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;method&quot;&gt;Method&lt;/h2&gt;
&lt;p&gt;Every count comes from the cleanup list in our research workbook: 90 firms, each with a segment, a region, a size band, a one-line description of what it does, its delivery model and its stated turnaround. We read the list on 22 September 2026. The workbook itself is not published; these are the counting rules.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type, region, size&lt;/strong&gt;: counts of each firm’s segment, region and size band. “Small, micro or one-person” is Small (10 to 49) plus Micro (2 to 9) plus Solo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reachability&lt;/strong&gt;: whether we could fetch the firm’s site or know it only from a directory listing, and whether its site still loads, meaning its domain still resolves.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool mentions&lt;/strong&gt;: a case-insensitive search of each firm’s description for each builder’s name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Failure classes&lt;/strong&gt;: a case-insensitive keyword search of each firm’s one-line description only. Security: secur, vuln, OWASP, pentest. Tests: test, QA; Sherlock Forensics matches only through “pentest” and is excluded, so 25 rather than the mechanical 26. Performance: perf, scalab, bottleneck. Deploy: CI/CD, CI, deploy, pipeline, hosting, DevOps. Auth: auth, access control, RLS. Data model: data model, database, DB, schema, persistence, RLS. Secrets: secret, key(s), credential. Monitoring: monitor, observab, Sentry. Documentation: doc, docs, document or documentation as whole words. Payments: Stripe, payment. Hallucination: hallucinat. Scanner types: the descriptions of the 10 automated scanners.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packaging&lt;/strong&gt;: over the 80 firms that are not automated scanners, searching the description, the delivery model and the stated turnaround unless a rule says otherwise. Audit or review: audit, assess, review, scan, diagnos or scorecard. 48 hours: the turnaround promises an audit, assessment, scan or check result in 48 hours or less; fix times and reply times excluded. The nine: MetaCTO, Pfaff Digital, Sonder, VibeAudits, Mitrix Technology, ShipClarity, Vibe-Audit, VibeCodeBlue and one solo fixer. Sprints: “sprint” anywhere in those three fields. Rebuild offered: rebuild, re-architect, rewrite or full build (11 firms), minus the two of them that also say “without rebuild”, “no rewrites”, “not rebuild”, “diagnosis-over-rebuild” or “without starting from scratch”. Against rebuilding: one of those five phrases in those three fields, the firm’s hero line or the workbook’s notes on how each firm positions itself (5 firms). Retainer: retainer, maintenance, ongoing, monitoring, subscription, defect cover or post-rescue support (16 firms).&lt;/li&gt;
&lt;li&gt;Named offers, turnarounds and claims are quoted from what each firm publishes, unaudited.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reddit and studies&lt;/strong&gt;: r/ExperiencedDevs (405 upvotes, 102 comments), r/SaaS (65 upvotes, 66 comments) and r/cursor (228 upvotes) from our AI-agency landscape research (48 searches, 2,837 posts, 17 September 2026); Veracode’s 45% from its July 2025 press release. The links are under Sources.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;r/ExperiencedDevs, “Getting more calls to fix ai generated codebases than actual new builds lately”, posted 22 April 2026, read 17 September 2026. &lt;a href=&quot;https://www.reddit.com/r/ExperiencedDevs/comments/1sskw4r/getting_more_calls_to_fix_ai_generated_codebases/&quot;&gt;reddit.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;r/SaaS, “I lost half my agency’s pipeline to Claude Code in 2025. Here’s the honest take on who should use it instead of paying me”, posted 21 April 2026, read 17 September 2026. &lt;a href=&quot;https://www.reddit.com/r/SaaS/comments/1srmu0a/i_lost_half_my_agencys_pipeline_to_claude_code_in/&quot;&gt;reddit.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Veracode, “AI-Generated Code Poses Major Security Risks in Nearly Half of All Development Tasks, Veracode Research Reveals”, press release on its 2025 GenAI Code Security Report, 30 July 2025. &lt;a href=&quot;https://www.veracode.com/press-release/ai-generated-code-poses-major-security-risks-in-nearly-half-of-all-development-tasks-veracode-research-reveals/&quot;&gt;veracode.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sidekick Interactive, “Finish &amp;amp; Launch Your Vibe Coded App”, with the case study. &lt;a href=&quot;https://www.sidekickinteractive.com/finish-vibe-coded-app/&quot;&gt;sidekickinteractive.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;r/cursor, a team’s account of a Cursor agent that looped while tagging 87 tasks, posted 10 June 2026, read 17 September 2026. &lt;a href=&quot;https://www.reddit.com/r/cursor/comments/1u1xbl8/&quot;&gt;reddit.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Valletta Software, its guide to how a vibe coding audit works, with turnaround by tier, updated June 2026 and checked 6 October 2026. &lt;a href=&quot;https://vallettasoftware.com/blog/post/vibe-coding-audit&quot;&gt;vallettasoftware.com&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This post first appeared on &lt;a href=&quot;https://dravin.ai/blog/who-cleans-up-ai-generated-code/&quot;&gt;Dravin AI&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Code cleanup</category><category>Vibe coding</category><category>Security review</category><category>Market research</category><author>info@dravin.ai (Dravin AI)</author></item></channel></rss>