<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jacek Różański</title>
    <description>The latest articles on DEV Community by Jacek Różański (@jacek_rozanski).</description>
    <link>https://dev.to/jacek_rozanski</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4196637%2Fd8c9a2b0-b21b-4883-a2da-f45c93ea233f.png</url>
      <title>DEV Community: Jacek Różański</title>
      <link>https://dev.to/jacek_rozanski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jacek_rozanski"/>
    <language>en</language>
    <item>
      <title>The Handoff Checklist: What Non-Technical Founders Should Audit Before Scaling Their MVP</title>
      <dc:creator>Jacek Różański</dc:creator>
      <pubDate>Tue, 20 Oct 2026 17:30:03 +0000</pubDate>
      <link>https://dev.to/jacek_rozanski/the-handoff-checklist-what-non-technical-founders-should-audit-before-scaling-their-mvp-2c0o</link>
      <guid>https://dev.to/jacek_rozanski/the-handoff-checklist-what-non-technical-founders-should-audit-before-scaling-their-mvp-2c0o</guid>
      <description>&lt;p&gt;Most of the broken MVPs I see weren't broken because the founder did something dumb. They were broken because the founder did exactly what they were told to do — ship fast, talk to users, don't over-engineer — and then nobody told them what "good enough to scale" actually looks like.&lt;/p&gt;

&lt;p&gt;This post is that missing checklist. It's written for the business-focused founder who owns the product but doesn't want to own the stack, and for the developer friends they keep texting at 11pm.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thesis
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Handing off an MVP to a specialist isn't a failure — it's a scheduled milestone.&lt;/strong&gt; The question isn't &lt;em&gt;whether&lt;/em&gt; you'll need technical help. It's whether you'll bring that help in while the codebase still fits in someone's head, or after it doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The assumption that costs founders the most
&lt;/h2&gt;

&lt;p&gt;The default belief: &lt;em&gt;"I'll keep going until something breaks, then I'll hire someone."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The problem is that by the time something breaks visibly — a customer complaint, a data leak, a failed deploy at the worst possible moment — the intervention has moved from &lt;em&gt;audit&lt;/em&gt; to &lt;em&gt;archaeology&lt;/em&gt;. Cost compounds with every shortcut accumulated.&lt;/p&gt;

&lt;p&gt;The better default: &lt;strong&gt;a specialist audit is cheapest the moment your MVP has validated something you want to keep.&lt;/strong&gt; Not when it breaks. Not when an investor asks. When the product's &lt;em&gt;shape&lt;/em&gt; starts to matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 12-point MVP handoff checklist
&lt;/h2&gt;

&lt;p&gt;Treat this like a pre-flight. If a specialist is about to take over, or you're about to hire your first engineer, or you're evaluating a fractional CTO — this is the ground truth you want captured. Three or more "no"s is a signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security &amp;amp; data
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Can you name every place customer data lives?&lt;/strong&gt; Database, backups, third-party tools, logs, AI provider contexts. If the answer is "I think so," it's no.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are secrets (API keys, DB credentials) out of source control and rotatable?&lt;/strong&gt; A shocking number of AI-generated MVPs have keys committed to git.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is auth done by a provider you could swap out if needed?&lt;/strong&gt; Hand-rolled auth in an MVP is a future incident report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do you have a working backup you've actually restored from?&lt;/strong&gt; Untested backups are fiction.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Code &amp;amp; architecture
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does the repo build and deploy from a clean clone?&lt;/strong&gt; If only your laptop can ship, that's a business risk, not just a technical one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there at least one test that would fail if the core user flow broke?&lt;/strong&gt; One. That's the bar for an MVP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are the three most important database tables documented — fields, relationships, why they exist?&lt;/strong&gt; Not ER diagrams. A paragraph each is enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can a new developer find the entry point for each feature in under five minutes?&lt;/strong&gt; If navigation requires you, the product isn't handoff-ready.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Business continuity
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Is there a written list of every external service the app depends on, with the account owner and billing method?&lt;/strong&gt; Stripe, Supabase, Vercel, OpenAI, SendGrid, that one weird webhook service — all of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you disappeared for two weeks, could the product keep running and serve existing customers?&lt;/strong&gt; Not ship features — just not break.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do you know your monthly infrastructure cost per active user?&lt;/strong&gt; Even roughly. If no, you can't price the product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there one document — even a Notion page — that explains how the product actually works to someone technical?&lt;/strong&gt; Written by you, not the specialist. It catches the assumptions only you know about.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A possible solution: structured, not heroic
&lt;/h2&gt;

&lt;p&gt;When founders finally decide to bring in help, the instinct is to find "a great developer" and hope. That usually produces one of two failure modes: the developer rewrites too much (because it's faster for them than understanding what's there), or they touch too little (because the code is opaque and they're billing hourly).&lt;/p&gt;

&lt;p&gt;A structured handoff avoids both:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 — Audit (1–3 days, fixed fee).&lt;/strong&gt; The specialist maps the system and produces a written report: what exists, what's risky, what's fine, what's a landmine. No code changes. The output is a document a non-technical founder can read and make decisions from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2 — Triage (half a day, together).&lt;/strong&gt; You sort the findings into &lt;em&gt;must fix now&lt;/em&gt;, &lt;em&gt;fix before scale&lt;/em&gt;, and &lt;em&gt;leave alone&lt;/em&gt;. Business priorities drive this, not developer preferences. A good specialist will argue &lt;em&gt;against&lt;/em&gt; their own instinct to rewrite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3 — Stabilize (1–3 weeks).&lt;/strong&gt; Execute the "now" tier. No new features during this window. This is the discipline most founders skip and regret.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 4 — Document the seams (1–2 days).&lt;/strong&gt; Deploy process, credential rotation, data flow, known brittleness. This is what makes the &lt;em&gt;next&lt;/em&gt; engineer — contractor or hire — productive on day one instead of day thirty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 5 — Decide ownership.&lt;/strong&gt; Fractional CTO, contractor, first full-time engineer, or a maintenance retainer. The audit tells you which one your product's actual shape needs, not the one you imagined when you started building.&lt;/p&gt;

&lt;p&gt;What's deliberately missing: "pick a new stack," "migrate to microservices," "adopt [framework]." Those are technical decisions masquerading as business decisions. A founder shouldn't be the one making them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;

&lt;p&gt;Take a common shape: founder built an MVP with an AI coding assistant, validated it with 3–5 pilot customers over six weeks, and has now spent four months unable to ship the one feature the biggest pilot is asking for. Not because it's hard — because the data model has an assumption in it that makes the feature painful to add.&lt;/p&gt;

&lt;p&gt;The expensive version: the founder tries for another quarter to "just fix it myself."&lt;/p&gt;

&lt;p&gt;The cheap version: two-day audit, one-week schema migration, written handoff doc, founder goes back to selling.&lt;/p&gt;

&lt;p&gt;The difference between those two versions is a decision the founder makes, not a technical skill they acquire.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;If you're a business-focused founder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat handoff as a milestone, not a rescue.&lt;/li&gt;
&lt;li&gt;Use the 12-point checklist above as your pre-flight.&lt;/li&gt;
&lt;li&gt;When you bring in help, insist on &lt;em&gt;audit before action&lt;/em&gt;. Any specialist unwilling to do that step is one you don't want.&lt;/li&gt;
&lt;li&gt;Remember that the point of the handoff isn't to stop being involved in your product. It's to stop being the bottleneck on technical questions you were never hired to answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best time to get a second pair of eyes on your MVP is when it's small enough that a second pair of eyes can finish in two days. That window is shorter than most founders think.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm a developer who runs **The AI Mechanic&lt;/em&gt;* (&lt;a href="https://theaimechanic.dev" rel="noopener noreferrer"&gt;theaimechanic.dev&lt;/a&gt;) — a practice focused on auditing and stabilizing MVPs built by non-technical founders and AI-assisted teams. There is a shorter, founder-facing version of this argument at &lt;a href="https://theaimechanic.dev/blog/when-to-hand-off-your-mvp" rel="noopener noreferrer"&gt;theaimechanic.dev/blog/when-to-hand-off-your-mvp&lt;/a&gt;.*&lt;/p&gt;

</description>
      <category>startup</category>
      <category>mvp</category>
      <category>codereview</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The MVP Cost Audit: 9 Line Items Non-Technical Founders Always Miss</title>
      <dc:creator>Jacek Różański</dc:creator>
      <pubDate>Tue, 20 Oct 2026 17:22:21 +0000</pubDate>
      <link>https://dev.to/jacek_rozanski/the-mvp-cost-audit-9-line-items-non-technical-founders-always-miss-2gp1</link>
      <guid>https://dev.to/jacek_rozanski/the-mvp-cost-audit-9-line-items-non-technical-founders-always-miss-2gp1</guid>
      <description>&lt;p&gt;The sticker price of an MVP is the cheapest thing about it. The real bill is the set of invoices that arrive later — some literal, most not — when the product meets real customers, real hires, and real investors.&lt;/p&gt;

&lt;p&gt;This post is the checklist of those invoices. Written for developers doing an audit on someone else's codebase, and for the founders who'd rather see the bill early than late.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thesis
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The cost of building an MVP is a known quantity. The cost of &lt;em&gt;living with&lt;/em&gt; the MVP is the one founders underestimate by an order of magnitude.&lt;/strong&gt; The gap isn't ignorance — it's that most of the real costs don't look like costs until they detonate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The assumption to dismantle
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The MVP cost me $X to build. Everything after is either revenue or fundraising."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This treats the MVP as a one-time expense. In reality, every shortcut taken to ship the MVP is a &lt;em&gt;deferred expense&lt;/em&gt; — an invoice that'll be presented later, typically at the worst possible moment (enterprise deal, security review, funding round, first engineering hire).&lt;/p&gt;

&lt;h2&gt;
  
  
  The 9 hidden line items
&lt;/h2&gt;

&lt;p&gt;For each: what it is, how to detect it, rough cost range (illustrative), when it usually detonates.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Schema debt
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Data model baked with day-one assumptions. Single-user accounts, single-currency, booleans where enums belong, money as floats.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; Read the three most-joined tables. Ask "what's the first feature this schema would make painful?" If the answer comes in under a minute, you have schema debt.&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; 1–3 engineer-weeks when it forces a migration.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; First customer who needs something the schema didn't anticipate.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Founder-as-infrastructure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Only one laptop can deploy. Only one person knows where the API keys are. Credentials live in a &lt;code&gt;.env&lt;/code&gt; someone's dragged around for six months.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; Ask "if the founder disappeared for two weeks, would anything ship?" If no, this is a line item.&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; 6–15 hours/month of founder time, priced at whatever sales or fundraising is worth to them.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; Any founder vacation, illness, or fundraise that requires focus.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Vendor lock-in and egress
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Managed services (Supabase, Firebase, Airtable, various BaaS) that are cheap until you outgrow them, and then expensive to leave.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; Try to write the migration plan. If you can't sketch one in an hour, the lock-in is real.&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; 2 weeks to 2 months of engineer time, OR an indefinite run-rate multiplier on what you thought your infra would cost.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; Hitting a tier ceiling, or a provider pricing change.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Security remediation on first real customer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; The gap between "it works" and "we can honestly fill out a security questionnaire." Hand-rolled auth, secrets in source, no audit log, no access review.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; Hand the founder the SIG Lite questionnaire. Count "we'd have to make something up" answers.&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; 1–3 weeks of focused work.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; First enterprise deal, first regulated-industry customer, first acquirer.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. First-hire ramp tax
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Your first engineer takes 6 weeks to be productive because nothing's documented, deploys are tribal, and half the code is AI-generated in styles that don't match each other.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; Ask the founder to write the onboarding doc. If they can't, the new hire can't onboard.&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; 4–6 weeks of the new engineer's time, at full salary.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; Day 1 of first engineering hire.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Feature velocity decay
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Features that used to take hours now take days. Not because the code is bad, because the code is &lt;em&gt;out of shape&lt;/em&gt;.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; Plot the time-to-ship for the last ten features. Look for the line going up.&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; Not directly billable — it shows up as missed roadmap, missed deals, missed quarter.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; Every quarter, silently, until someone fixes it.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Integration fragility
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Stripe, SendGrid, webhook providers, third-party APIs — integrated without retries, idempotency, signature verification, or rate-limit handling.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; Ask "what happens if this webhook arrives twice?" Absence of a confident answer is the finding.&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; One bad incident can be $0 or $50k, depending on which integration it was.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; First time any provider has a bad day.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Silent failure mode
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; Bare &lt;code&gt;except:&lt;/code&gt;, &lt;code&gt;catch (e) {}&lt;/code&gt;, &lt;code&gt;.catch(() =&amp;gt; null)&lt;/code&gt;. The product looks healthy because errors are being swallowed. Customers notice before monitoring does.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; &lt;code&gt;grep -r "except:" .&lt;/code&gt;, or the language equivalent. Count. Weep.&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; Varies; the expensive version is reputational.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; When a customer emails about something "that shouldn't be possible."&lt;/p&gt;

&lt;h3&gt;
  
  
  9. The panic-rewrite
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What:&lt;/strong&gt; The terminal form of all the above. By the time founders reach for a rewrite, the earlier interventions have all been skipped.&lt;br&gt;
&lt;strong&gt;Detect:&lt;/strong&gt; The founder says the words "we need to rebuild this properly."&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; 3–6 months engineering time, plus the forgotten insights from the original build.&lt;br&gt;
&lt;strong&gt;Detonates:&lt;/strong&gt; Usually simultaneously with running out of runway.&lt;/p&gt;

&lt;h2&gt;
  
  
  The possible solution: pay in installments
&lt;/h2&gt;

&lt;p&gt;The founders who handle this well don't pay &lt;em&gt;less&lt;/em&gt;. They pay &lt;em&gt;earlier&lt;/em&gt;, in smaller pieces, when each piece is still a one-line fix.&lt;/p&gt;

&lt;p&gt;Practical schedule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Month 3&lt;/strong&gt; — short audit. A doc, not a rewrite. Catches items 1, 2, 7, 8 at minimum cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before first enterprise customer&lt;/strong&gt; — security pass on item 4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before first engineering hire&lt;/strong&gt; — documentation and deploy pass on items 2, 5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before any tech-diligence conversation&lt;/strong&gt; — one-pager summarizing stack, risk, and plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these is expensive. Each of them defuses one of the nine line items before it detonates at the worst possible moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;If you're an engineer auditing an MVP: the checklist above triages the codebase in a few hours and gives the founder a readable invoice of deferred costs. That invoice is the most valuable deliverable of the audit — more than any code change.&lt;/p&gt;

&lt;p&gt;If you're a founder: the MVP didn't cost what you think it cost. The rest of the bill is coming, itemized above, and the only real decision you get to make is whether to pay it in small, scheduled installments or in one catastrophic lump.&lt;/p&gt;

&lt;p&gt;The small installments are cheaper. They're also less disruptive to the thing you're actually trying to build: the business.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm a developer who runs **The AI Mechanic&lt;/em&gt;* (&lt;a href="https://theaimechanic.dev" rel="noopener noreferrer"&gt;theaimechanic.dev&lt;/a&gt;) — a practice focused on auditing and stabilizing MVPs built by non-technical founders and AI-assisted teams. There is a shorter, founder-facing version of this argument at &lt;a href="https://theaimechanic.dev/blog/hidden-costs-of-cheap-mvps" rel="noopener noreferrer"&gt;theaimechanic.dev/blog/hidden-costs-of-cheap-mvps&lt;/a&gt;.*&lt;/p&gt;

</description>
      <category>startup</category>
      <category>mvp</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your AI Pair Programmer Has Tells: 8 Patterns That Signal Trouble in LLM-Generated Code</title>
      <dc:creator>Jacek Różański</dc:creator>
      <pubDate>Tue, 20 Oct 2026 17:19:19 +0000</pubDate>
      <link>https://dev.to/jacek_rozanski/your-ai-pair-programmer-has-tells-8-patterns-that-signal-trouble-in-llm-generated-code-4m7o</link>
      <guid>https://dev.to/jacek_rozanski/your-ai-pair-programmer-has-tells-8-patterns-that-signal-trouble-in-llm-generated-code-4m7o</guid>
      <description>&lt;p&gt;Most AI-generated code I audit isn't &lt;em&gt;wrong&lt;/em&gt;. That's the problem. It's &lt;em&gt;plausible&lt;/em&gt;. It compiles, it runs, it passes the happy path — and it fails in a handful of predictable, repeating patterns that you start spotting once you know the shapes.&lt;/p&gt;

&lt;p&gt;This is a field guide for those shapes. Written for developers doing code review on an MVP they didn't write, and for the non-technical founders who might be about to hand one over.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thesis
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LLMs are optimized to produce outputs that resemble correct code, not to produce correct code.&lt;/strong&gt; The failure modes of an AI-assisted MVP are therefore specific and recognizable — not random bugs, but recurring &lt;em&gt;tells&lt;/em&gt;. If you know what to look for, you can triage a codebase in an afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  The assumption this catches out
&lt;/h2&gt;

&lt;p&gt;Most founders (and more than a few engineers) operate on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If the tests pass and the happy path works, the AI got it right.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;LLM code is adversarially disappointing to this heuristic. It's trained to match the &lt;em&gt;distribution&lt;/em&gt; of correct code, which means it reproduces the surface features — shape, naming, structure — far more reliably than the load-bearing details. The obvious tells compile. The subtle ones ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 8 tells
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Auth that's almost right
&lt;/h3&gt;

&lt;p&gt;Look for: endpoints without an auth middleware, missing CSRF on state-changing routes, hand-rolled password hashing (&lt;code&gt;crypto.createHash('sha256').update(password).digest('hex')&lt;/code&gt; instead of a proper KDF like bcrypt or argon2), session cookies without &lt;code&gt;HttpOnly&lt;/code&gt; / &lt;code&gt;Secure&lt;/code&gt; / &lt;code&gt;SameSite&lt;/code&gt;, or a password-reset flow that doesn't invalidate prior sessions.&lt;/p&gt;

&lt;p&gt;Why it happens: the AI wrote each piece correctly in isolation; nothing enforces that the pieces work as a system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// classic tell: login writes a session, but /api/internal/* doesn't check it&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleLogin&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/internal/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getAllUsers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// no middleware&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Over-specific helpers that pretend to be general
&lt;/h3&gt;

&lt;p&gt;Functions like &lt;code&gt;getUserOrdersByStatusAndDateRangeAndRegion&lt;/code&gt;. Fifteen arguments, three of them optional, all with defaults that only make sense for the one caller. Six months later you'll find its near-identical cousin, &lt;code&gt;listOrdersForUserFilteredByStatus&lt;/code&gt;, written when nobody realized the first one existed.&lt;/p&gt;

&lt;p&gt;Fix by auditing for duplication with a name-similarity pass, not by reading line-by-line. A 15-line grep can usually surface the worst offenders.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;try/except&lt;/code&gt; as a worldview
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;charge_customer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;  &lt;span class="c1"&gt;# or: logger.info("failed")
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Silent failure is the most expensive pattern in an AI-generated codebase because it hides the other bugs. Payments that didn't go through. Emails that weren't sent. Rows that didn't get written. The product appears healthy right up until a customer notices.&lt;/p&gt;

&lt;p&gt;Audit rule: any bare &lt;code&gt;except&lt;/code&gt;, any &lt;code&gt;catch (e) {}&lt;/code&gt;, any error that only goes to stdout is a review item.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Data models that encode today's assumptions forever
&lt;/h3&gt;

&lt;p&gt;One user per account. One product per order. One currency. One language. One timezone. The AI wrote the schema from the prompt it was given; the prompt described the product as the founder saw it on day one.&lt;/p&gt;

&lt;p&gt;Tell: foreign keys that should be many-to-many are modeled as single columns. Join tables don't exist. Status fields are booleans instead of enums. Money is stored as &lt;code&gt;float&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The cost isn't correctness — it's that every "one more thing" a customer asks for a year later is a migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Integrations without the boring parts
&lt;/h3&gt;

&lt;p&gt;Stripe is integrated. Webhooks arrive. What's missing: signature verification, idempotency keys, retry handling, dead-letter queues for failed events, rate-limit handling.&lt;/p&gt;

&lt;p&gt;The tell is the absence of tests around failure modes, not the presence of buggy code. Ask: &lt;em&gt;what happens if this webhook arrives twice?&lt;/em&gt; If the answer is "I don't know," that's the audit finding.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. N+1 queries the ORM was supposed to prevent
&lt;/h3&gt;

&lt;p&gt;LLMs love writing &lt;code&gt;for user in users: user.orders&lt;/code&gt; without realizing that's a query per iteration. Works fine with 10 users. Falls over at 10,000.&lt;/p&gt;

&lt;p&gt;Tell: no query logging in development, no slow-query alerts in production, no &lt;code&gt;select_related&lt;/code&gt; / &lt;code&gt;include&lt;/code&gt; / &lt;code&gt;populate&lt;/code&gt; anywhere in the code. This one's easy to find once you turn on the logs for ten minutes of real traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Config and secrets entangled
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; committed to git, or worse, constants hard-coded in the source. Separate dev/prod configs that don't actually differ. Secrets rotated by editing a file on a server somewhere.&lt;/p&gt;

&lt;p&gt;Don't laugh — this is maybe the single most common finding on AI-generated MVPs. LLMs default to inline constants because that's what their training data shows.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Tests that test the mock
&lt;/h3&gt;

&lt;p&gt;When tests exist at all in an AI-generated MVP, they often assert against the mock, not against behavior. The test passes when the code calls the mock the way the test expects — regardless of whether that behavior is correct.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests that this function calls its dependency — not that it does the right thing&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveBeenCalledWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;welcome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fine for isolating logic. Dangerous as your only safety net, because refactoring moves the mock calls around and the tests break for the wrong reasons — so they get deleted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The possible solution: a repeatable triage pass
&lt;/h2&gt;

&lt;p&gt;Don't rewrite. Triage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hour 1 — inventory.&lt;/strong&gt; List every endpoint, every external integration, every place data is persisted. Most of the risk lives in a small part of this list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hour 2 — hit the 8 tells.&lt;/strong&gt; Grep for the patterns above. Capture findings in a doc with severity tags. Don't fix anything yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hour 3 — triage with the founder.&lt;/strong&gt; Sort into &lt;em&gt;security-now&lt;/em&gt;, &lt;em&gt;correctness-soon&lt;/em&gt;, &lt;em&gt;performance-eventually&lt;/em&gt;, &lt;em&gt;leave-alone&lt;/em&gt;. Business priorities drive this, not code aesthetics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then, and only then, fix the "now" tier.&lt;/strong&gt; No new features during this window. This is the discipline most founders skip.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full rewrite isn't wrong because it's technically bad. It's wrong because it throws away the one thing the MVP earned: evidence of what users actually want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;If you're auditing an AI-assisted MVP: the bugs aren't hiding in clever places. They're hiding in exactly eight familiar shapes. Know the shapes, grep for them, triage, and ship a short fix list.&lt;/p&gt;

&lt;p&gt;If you're the founder who built it: you don't need to become technical. You need someone who knows the tells to spend half a day with your codebase before the next enterprise demo, security questionnaire, or engineering hire — whichever comes first.&lt;/p&gt;

&lt;p&gt;AI is a great way to get to signal. It is not, yet, a great way to stay at signal.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm a developer who runs **The AI Mechanic&lt;/em&gt;* (&lt;a href="https://theaimechanic.dev" rel="noopener noreferrer"&gt;theaimechanic.dev&lt;/a&gt;) — a practice focused on auditing and stabilizing MVPs built by non-technical founders and AI-assisted teams. There is a shorter, founder-facing version of this argument at &lt;a href="https://theaimechanic.dev/blog/invisible-bugs-in-ai-generated-code" rel="noopener noreferrer"&gt;theaimechanic.dev/blog/invisible-bugs-in-ai-generated-code&lt;/a&gt;.*&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codereview</category>
      <category>security</category>
      <category>mvp</category>
    </item>
  </channel>
</rss>
