AI code audit findings register showing 150K lines audited, 25,000 tool warnings, 40 verified findings and zero production access, with findings ranked by severity
The findings register delivered to the client. Client identity and all values anonymised under NDA.

Executive Summary

An AI code audit is an independent review of a codebase that combines automated analysis with senior engineer verification, so a team learns which findings are real and which are noise. GrowExx ran an AI code audit across a manufacturer’s operations platform — 150,000+ lines of code, no production access — and reduced more than 25,000 tool warnings to roughly 40 verified findings, a dozen of them Critical or High.

The platform had no recorded incidents and no user complaints. It also had live credentials committed to source control, security code that had been written but never switched on, and core runtimes weeks away from losing security patches. None of it had surfaced, because nothing was looking.

150K+
lines of code audited across API, web and mobile
25,000+
tool warnings triaged by senior engineers
40
verified findings, a dozen of them Critical or High
0
access to production required

Client details anonymised under NDA. Figures are from the delivered audit report.

The Challenge: A Platform Nobody Could Vouch For

The problem was not that the software was failing. It was that nobody could say what was inside it.

Teams used the operations platform every day, on the web and on their phones, and rarely complained. There was no incident on record. That calm was misleading. The code had been built fast by a small team. There were no automated tests, no build pipeline and no release gate — every change went straight to the people using it.

Leadership’s question was simple: is this safe to keep running, and what do we fix first? They needed an answer they could defend to the board, not a raw scanner export.

The Audit: 25,000+ Warnings In, 40 Findings Out

Automated tools are necessary and insufficient. The verification layer is what turns a scan into code validation. GrowExx ran more than 25 analysis tools across the stack — static analysis, dependency scanning, secret detection, accessibility and performance checks. Together they raised tens of thousands of warnings. Most were style noise. Several of the most dangerous problems never appeared as a warning at all.

That gap is the reason every flag passed a senior engineer before it reached the report. The client received a short list of findings they could act on, not a backlog they would ignore.

Funnel reducing 25,000+ scanner warnings to 40 verified findings and 12 Critical or High, with a note that no scanner raised any of the four Critical findings
More than 25,000 tool warnings reduced to roughly 40 verified findings. None of the four Critical findings was raised by a scanner.

What the tools reported versus what engineers confirmed

The tools said Our engineers found
Error handling in place Security controls that looked finished but were never switched on. No scanner flags code that does nothing.
Zero accessibility violations on the pages tested Over a hundred unlabelled form fields in screens the automated test never reached
A list of dependency vulnerabilities Most were name collisions with unrelated packages. Dismissed, not reported.
Around 20 possible repeated-query hotspots Each checked for real impact before being called a defect, so the team fixes what is real
Hundreds of “Blocker” issues Nearly all from a single formatting rule. Logged once as a Low finding, not a fire drill.

The Four Findings That Mattered Most

1. Live credentials committed to source control

Keys for identity, internal integrations, app signing and a paid third-party service were committed to the repositories. One of them shipped inside the web application, readable by anyone with a browser and developer tools. A secret in a client-side bundle is not hidden; it is published.

Browser developer tools showing an API key and identity secret in a shipped JavaScript bundle, illustrating how a committed credential becomes publicly readable
Illustrative reconstruction. Not the client’s system or code — all names, paths and key values are invented placeholders.

2. Security code that only looked like security

Error and access-handling code was fully written and never wired in. A reviewer reading the file would reasonably assume it was active. This is a recognised pattern in AI-generated code: the generator produces a plausible, complete-looking implementation, and nothing registers it into the request pipeline. No scanner flags code that does nothing, which is exactly why this class of defect survives automated review.

Side-by-side code comparison: a complete access-control middleware class next to a request pipeline that never registers it, an AI-generated code pattern no scanner detects
Illustrative reconstruction. The control on the left is complete; the pipeline on the right never registers it.

3. A ticking support clock

Core runtimes were weeks away from losing security patches, with more of the stack following within the year. After an end-of-support date, newly disclosed vulnerabilities simply stay open — there is no fix to apply.

4. No safety net for change

No automated tests, no pipeline, and 200+ open dependency advisories, several of them Critical. Every fix — including the ones we were about to recommend — would have been tested by users in production.

Why none of it had surfaced

Usage was low, the applications quietly absorbed short outages, and the logging that would catch misuse was switched off. No incidents did not mean no risk. It meant no visibility.

The Plan: 90 Days, No Rewrite

The architecture held up. Every layer was assessed as reusable with specific corrections, so the plan repairs what exists instead of starting over. The Critical findings need no code release at all — each can be closed in a day.

Each phase carries an exit check, so “done” is a test rather than an opinion.

Phase When What happens Done when
Contain Days 0–7 Rotate and purge every committed credential. Stop untested changes reaching production. Old secrets rejected by their providers
Stabilize Days 7–49 Runtime upgrades behind smoke tests. Pipeline with secret and dependency scanning. Fix file-path and XSS sites. A build with a Critical advisory fails
Harden Days 49–90 Database audit trail on. Data on devices protected. Tests on the most critical flows. No open Critical or High code findings
Assure Following quarter Penetration test and independent re-audit Retest passes
Four-phase AI code audit remediation roadmap - Contain, Stabilize, Harden, Assure - each phase with its exit check
The 90-day roadmap as delivered. Each phase closes on a test, not an opinion.

What the Engagement Required

The audit needed a source code snapshot and one read-only database login. Nothing in the client’s environment was changed, and no production access was granted or used.

From the client A source code snapshot and one read-only database login
Production access None. Nothing in their environment was changed.
Scope Backend API, web application, mobile application, database
Stack .NET backend, JavaScript web application, cross-platform mobile application, SQL database
Deliverables Executive readout deck, full findings register, threat model, 90-day roadmap with exit checks
Engagement scope showing a code snapshot and read-only database login with no production access, alongside a timeline of runtimes approaching end of security support
What the engagement required, and the runtime support clock behind finding four.

What the Client Walked Away With

Leadership got the defensible answer they asked for: a ranked register of roughly 40 verified findings, a threat model explaining why each one mattered, and a 90-day sequence with exit checks that an engineering manager could run without us.

The most valuable output was the smallest one. Four Critical findings could be closed in days, without a code release, by rotating credentials and shutting the door that had been left open — work the client’s own team could start the same week. The same containment sequence opens every AI code audit and cleanup engagement we run.

“The four Critical findings were closed the same week — without shipping a single line of code.”

— Head of Engineering, manufacturing operations platform

Containment was completed in week one. Full remediation outcomes are measured at the independent re-audit in the Assure phase and will be added here once that retest completes.

Frequently Asked Questions

What is an AI code audit?

An AI code audit is an independent review of a codebase that combines automated analysis tools with senior engineer verification. It establishes which reported issues are real, which are noise, and which risks the tools never detected at all — then ranks what to fix first.

Why do automated scanners miss broken security controls?

Scanners analyse the code that exists, not whether it runs. Access-handling code that is fully written but never registered into the request pipeline is syntactically correct and unreferenced, so it raises no warning. In this audit, that pattern accounted for one of the four most serious findings.

How many real findings come out of 25,000 scanner warnings?

In this engagement, more than 25,000 warnings from 25+ tools reduced to roughly 40 verified findings, around a dozen rated Critical or High. Hundreds of “Blocker” issues traced back to a single formatting rule and were logged once as a Low finding.

Does a code audit need access to production?

No. This audit was completed with a source code snapshot and one read-only database login. No production access was granted or used, and nothing in the client’s environment was changed.

What happens after the audit?

The deliverable is a sequenced plan, not a report. In this case: contain in the first week (rotate credentials, close the pipeline gap), stabilize over seven weeks (runtime upgrades, CI with secret and dependency scanning), harden to day 90, then verify with a penetration test and an independent re-audit the following quarter.

Why are credentials in source code a serious finding if nothing has happened?

A committed credential is valid until it is rotated, and source history keeps it even after it is deleted from the current files. A key that ships inside a web application is readable by any visitor. The absence of a recorded incident is not evidence the key has not been copied — particularly where, as here, the logging that would record misuse was switched off.