<?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: Melroy D Souza</title>
    <description>The latest articles on DEV Community by Melroy D Souza (@russel_melroydsouza_afb).</description>
    <link>https://dev.to/russel_melroydsouza_afb</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%2F3617790%2F0b75cc41-600f-4f12-9164-4edb93729dff.png</url>
      <title>DEV Community: Melroy D Souza</title>
      <link>https://dev.to/russel_melroydsouza_afb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/russel_melroydsouza_afb"/>
    <language>en</language>
    <item>
      <title>How to Vibe-Check an AI-Generated React Native Codebase Before You Ship</title>
      <dc:creator>Melroy D Souza</dc:creator>
      <pubDate>Wed, 22 Jul 2026 10:46:14 +0000</pubDate>
      <link>https://dev.to/russel_melroydsouza_afb/how-to-vibe-check-an-ai-generated-react-native-codebase-before-you-ship-1j53</link>
      <guid>https://dev.to/russel_melroydsouza_afb/how-to-vibe-check-an-ai-generated-react-native-codebase-before-you-ship-1j53</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Three AI failure modes no test catches: &lt;strong&gt;duplication instead of reuse&lt;/strong&gt;, &lt;strong&gt;style drift&lt;/strong&gt;, and &lt;strong&gt;tests that mock the hard part&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A 20-minute review pass: find what should have been reused (3 min), read the tests and ignore the impl (7 min), run it on a device (5 min), ask the "six months from now" question (5 min).&lt;/li&gt;
&lt;li&gt;The bar for AI-generated code should be &lt;strong&gt;higher&lt;/strong&gt; than for human code — a human is committing their reputation to what they wrote. The AI isn't.&lt;/li&gt;
&lt;li&gt;Rewrite when the pattern would set a precedent. Accept when the failure is small and isolated.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Claude Code will produce a working React Native feature in 20 minutes that would have taken you four hours. Tests pass. Typecheck passes. You ship it.&lt;/p&gt;

&lt;p&gt;Six weeks later you're wondering why the codebase feels harder to work in than it should.&lt;/p&gt;

&lt;p&gt;What happened: the AI made choices that were &lt;strong&gt;locally correct and globally corrosive&lt;/strong&gt;, and no automated check caught them.&lt;/p&gt;

&lt;p&gt;Here's how to catch them yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three failure modes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Duplication instead of reuse.&lt;/strong&gt; The AI didn't know &lt;code&gt;useUser()&lt;/code&gt; existed, so it wrote its own version. Or it wrote three functions that all normalise a phone number, none of them quite the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Style drift.&lt;/strong&gt; Your codebase uses styled-components. The AI generated a screen with inline &lt;code&gt;StyleSheet.create&lt;/code&gt; because that's more common in its training data. Both work. Now your codebase has two styling systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Test-driven wishful thinking.&lt;/strong&gt; The AI wrote a test that mocks the tricky part. Test passes. The tricky part still doesn't work in production.&lt;/p&gt;

&lt;p&gt;None of these are caught by tests, typecheck, or linting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 20-minute review pass
&lt;/h2&gt;

&lt;p&gt;For every AI-generated PR:&lt;/p&gt;

&lt;h3&gt;
  
  
  Minutes 1–3: Find the smallest new thing that should have been reused
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Search the codebase for the function name. If two exist, decide which one stays.&lt;/li&gt;
&lt;li&gt;Check the imports. Did the AI pull in a new library when an existing one would work?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Minutes 4–10: Read the tests, ignore the implementation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What are the assertions actually checking — the important behaviour, or the easy behaviour?&lt;/li&gt;
&lt;li&gt;Are the mocks hiding the hard part?&lt;/li&gt;
&lt;li&gt;Would this test still pass if the implementation was &lt;code&gt;return true&lt;/code&gt; for the happy path?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Minutes 11–15: Run the feature end-to-end on a device
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Don't trust "tests pass." Open the app and do the flow.&lt;/li&gt;
&lt;li&gt;Empty state? Error state? Slow network?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Minutes 16–20: The "six months from now" question
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If someone joined the team in six months, would they know why this exists?&lt;/li&gt;
&lt;li&gt;Will the naming still make sense when the product has changed?&lt;/li&gt;
&lt;li&gt;Would you be embarrassed if this was on your GitHub?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reject the PR if any of the above smells. The AI can rewrite it in five minutes; you save yourself weeks of drag.&lt;/p&gt;

&lt;h2&gt;
  
  
  What good AI-generated code looks like
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reuses existing helpers instead of inventing new ones.&lt;/li&gt;
&lt;li&gt;Follows existing patterns — styling, error handling, state management — without being told to.&lt;/li&gt;
&lt;li&gt;Tests assert on user-visible behaviour, not implementation details.&lt;/li&gt;
&lt;li&gt;Function and variable names match the codebase's conventions.&lt;/li&gt;
&lt;li&gt;Comments explain &lt;strong&gt;why&lt;/strong&gt;, not &lt;strong&gt;what&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your &lt;code&gt;CLAUDE.md&lt;/code&gt; is doing its job, most of these are automatic. If it isn't, you'll see the failure modes above in every PR.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to accept vs. rewrite
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Accept when:&lt;/strong&gt; the failure is small (one duplicate helper), the risk is low (isolated feature), and the fix cost is high (refactoring would take longer than the value it returns).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rewrite when:&lt;/strong&gt; the pattern would set a precedent (the next five features would follow it), the risk is high (it touches shared code), or the code just feels &lt;em&gt;foreign&lt;/em&gt; in the codebase.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The bar for AI-generated code should be higher than for human-generated code, not lower. A human is committing their reputation to what they wrote. The AI isn't.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setting up guardrails past one dev
&lt;/h2&gt;

&lt;p&gt;If you're on a team using AI heavily:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Require a &lt;code&gt;CLAUDE.md&lt;/code&gt; in every repo.&lt;/strong&gt; Update it every time you catch the AI going in a wrong direction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shift the code review focus.&lt;/strong&gt; Human reviewers should focus on the failure modes above, not on "does this work" — the AI will make it work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run a weekly AI code-quality review.&lt;/strong&gt; Grep for patterns the AI introduced, refactor duplicates, and update &lt;code&gt;CLAUDE.md&lt;/code&gt; so the next PRs don't repeat them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;AI code that you don't review will make your codebase worse over time. AI code that you review carefully will make you 3× faster without the tax.&lt;/p&gt;

&lt;p&gt;The difference is entirely in your review discipline.&lt;/p&gt;




&lt;p&gt;One thing that reduces the failure modes at the source: pointing the agent at a codebase that already has conventions rather than an empty folder. &lt;a href="https://www.applighter.com/?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=vibe-check-ai-code" rel="noopener noreferrer"&gt;Applighter&lt;/a&gt; ships Expo + Supabase templates with the patterns and agent docs already in place, so there's less for the AI to invent.&lt;/p&gt;

&lt;p&gt;What's the worst thing an AI has quietly done to your codebase? Mine wrote a third phone-number formatter.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>ai</category>
      <category>codequality</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
