What a $500 Code Audit Report Looks Like (Sample Inside)

October 28, 202611 mins
A $500 code audit report — Unsplash
You shouldn't pay for an audit without knowing what comes back. So here's one.

Our Vibe Code Rescue starts with a $500 step: a written audit of your codebase within 48 hours, then a flat-price plan for the work. Below is a sample report. It's built from a real codebase we took over after it was written mostly by AI coding agents. The six findings are real. Names and product details are changed, and the wording is written for this post. If the findings sound familiar, we told the story of that rebuild in We inherited an AI-generated codebase.

A useful audit answers two questions for a founder: what's dangerous right now, and what it costs to make the product safe to grow. Everything in the report serves one of those.

What the $500 buys

  • A written report within 48 hours of repository access.
  • Every finding rated by severity, with the evidence and a verdict: keep, fix or replace.
  • A plan split into phases, each with one fixed price and a definition of done.

The audit covers the places AI-built code tends to break: authorization and data isolation, secrets, money handling, uploads and background jobs, deploys, observability and tests.

What it leaves out on purpose: linter output, style opinions, a rewrite pitch and a 60-page PDF nobody finishes. If a finding wouldn't change what you do next month, it isn't in the report.

The sample report

Everything from here to the plan is the sample, laid out the way the client receives it.

Summary

The product is a multi-tenant platform. Organizations invite their community to send in media, which the system processes in the background. It's live with customer organizations and was built mostly with AI coding agents.

The part users see is in good shape. The screens and flows match what organizations need, and we'd keep them. The foundation underneath is not safe to grow on. Three findings are critical: one organization can reach another's data, authorization is decided route by route, and live secrets sit in the repository.

Our recommendation: close F1 to F3 before onboarding another organization. Then rebuild the upload pipeline and put a real release process in place.

Severity scale

  • Critical: someone can see or change data they shouldn't, today. Fix before anything else.
  • High: the core flow fails for real users, or a bad release can't be undone.
  • Medium: it slows every change and hides the next bug.

Findings

#FindingSeverityVerdict
F1Users in one organization can read another organization's dataCriticalReplace
F2Authorization is decided route by route, with no single rule setCriticalReplace
F3Live secrets are hardcoded in the repositoryCriticalFix
F4Uploads and background processing fail on real files and networksHighReplace
F5There is no deploy processHighReplace
F6There are no testsMediumFix

Draft the findings table for your codebase

Tell ChatGPT how your product was built and who uses it. It will draft a findings table in this format for your stack, with a likely severity and a quick check for each row.

“|”

One finding in full

Every finding in the report gets an entry like this one.

F1. Users in one organization can read another organization's data. Critical. Replace.

Reproduce: sign in as a member of organization A and request a record that belongs to organization B. The record comes back.

Why it happens: organization scoping lives in application code, so every new query has to remember it. Code written one feature at a time forgets it somewhere, and one missed query is enough.

Fix: enforce organization scoping below the application, in a data-access layer or with database row-level security, so a query without an organization can't run. Add a test on every build that signs in as A and tries to read B.

Why replace and not fix: patching the missing filters one at a time leaves the next new query exposed. The rule has to move to a layer every query passes through.

The other five, shorter

F2, critical, replace. Signing in works. Deciding what a signed-in user may do doesn't, because no single place decides it and each route makes its own call. We'd replace it with one server-side authorization layer that every route goes through, with the rules written down in one place. Checks on the client are for display, never for access.

F3, critical, fix. The code that uses the keys is fine. The keys themselves are compromised: every key ever committed counts as leaked, including ones later moved to environment variables, because git history keeps them. Rotate all of them in the first 48 hours. Then move them to a secrets manager and scan the history.

F4, high, replace. Small files on fast connections go through. Long recordings from phones on weak signal don't, and that's where real users live. The replacement sends uploads straight to storage in pieces that survive a dropped connection. Processing becomes a background job with retries, and every item shows its status.

F5, high, replace. Code reaches production by hand, and nothing written down says how to do it again or how to undo it. There's nothing to fix here, only something to build.

F6, medium, fix. On its own, missing tests is a medium. It's also the reason every other fix is risky. We don't recommend a coverage target. We recommend tests on the paths where a failure costs trust, starting with organization isolation and the upload flow, written alongside F1 and F2 rather than after.

Keep, fix, replace

  • Keep: the screens, the flows organizations already use, and the product decisions behind them.
  • Fix: secrets (F3) and tests (F6).
  • Replace: authorization (F2), organization isolation (F1), the upload and processing pipeline (F4) and the release path (F5).

Most of what users see stays. Most of what they don't see gets rebuilt.

Want this report for your codebase?

Rescue audit and plan from $500: a written report in 48 hours with every finding rated and sorted into keep, fix or replace, then a flat-price plan for the work. Send your email and we'll set up a 30-minute call within 24 hours.

The plan

PhaseWhat's in itDone means
0. First 48 hoursrotate every key, close access that shouldn't existno key that was ever committed still works
1. Foundationone authorization layer, organization scoping below the app, tests for boththe cross-organization test runs on every build and passes
2. Core flowresumable uploads, background processing with retries, visible statusa long recording over a throttled connection arrives and gets processed
3. Release pathpipeline, staging, migrations inside the deploy, one-step rollbacka release and a rollback both run from the pipeline, with nobody's laptop involved

Each phase has one fixed price in the real report. We've taken the prices and dates out of this sample, because they came from that codebase and wouldn't tell you anything about yours. For scale, a focused rescue runs $500 to $12.5K.

That's the end of the sample.

What to demand from any code audit

Ours or anyone's, a report worth paying for has these five things:

  1. A severity on every finding, defined in terms of what can happen to your users.
  2. A way to reproduce each critical finding yourself.
  3. A keep, fix or replace verdict, so you know what survives.
  4. A plan in phases, with a price per phase instead of an hourly estimate.
  5. A definition of done for each phase that you can check without trusting the vendor.

If the report you're holding is missing two of these, it's a list of opinions.

Related reading

The service: Vibe Code Rescue. If your app was vibe-coded: vibe-coded app rescue. Weighing a rebuild: agency transfer vs rebuild.

Enjoyed this article? Share it with others

Related Posts