# AI code looks right. That's the problem

Canonical: https://brew.new/templates/vueschool/ai-code-looks-right-thats-the-problem

Brand: vueschool.io
Category: newsletter

![Preview of AI code looks right. That's the problem](https://cdn.brew.new/email-preview-6c5f03e7c44c05d9-tracking_r57srex8534z8qq6202hny2z258dtz1b-1789071773022.png)

## Email content

Vue School website

Hi John,

AI code rarely looks wrong. It's clean, structured, familiar. That's exactly why bugs slip through.

Most issues aren't in the syntax. They sit one level above it, wrong assumptions, missing edge cases, silent failures. The tricky part is that your brain treats AI code like your own. You recognize the patterns, so you trust them.

That trust is what breaks things.

Instead of scanning line by line, try this: Claim → Verify → Trace

Three words. Works on any block, in any language, today.

For each meaningful chunk of AI code, do this.

Claim. State out loud what this block claims to do. One sentence. "This validates the email format before storing it." If you can't state the claim, you don't understand the code well enough to approve it. That's the signal to slow down.

Verify. Check that the implementation actually does what the claim says. Not that it looks like it does. That it does. Does it actually validate the format, or does it just check the string isn't empty?

Trace. Follow what happens when the input is wrong. What if the input is null? What if it's malformed? Does the error get handled, or swallowed? The trace step is what catches bugs that pass tests but break in production.

That's it. Three steps per block. Takes about a minute once you're used to it.

Here's what it looks like on real code.

Say AI generates a five-line function.

Turn on images to view the code snippet

Looks clean. You'd skim past it.

Now run the method.

Claim. "This returns true if a record is past its expiry.”

Verify. Does it? It adds the TTL to the creation time and checks if now is past it. The logic is right. But look at what it trusts. new Date(createdAt) accepts whatever you hand it. If createdAt is a string like "2026-05-06 14:30:00" with no timezone, the Date constructor parses it as local time. If your server runs in UTC and the timestamp was generated in CET, you've just introduced a one or two hour gap. The claim said past its expiry. The code says past its expiry, assuming the input is unambiguous. It isn't.

Trace. What if createdAt is null? new Date(null) is January 1st 1970. Add 15 minutes. The function returns true for every record with a missing timestamp. Silent. No error thrown. You only catch this when it breaks in production.

Two real bugs in five lines that looked completely clean.

Reading top to bottom lets your eyes do the work. Claim → Verify → Trace forces your judgment into the loop. You can't autocomplete your way through it. Every block makes you stop and decide whether the code matches the intent.

Try it on the next AI-generated block you review. Pick one block of code. State the claim out loud. Verify the implementation. Trace a wrong input.

Most developers find at least one thing they'd want to fix on the first try. Some find the bug they've been chasing for two days.

This is what we do at Unlearn. Practical methods for working with AI code, the kind you can actually use right away.

See what Unlearn covers →

Best,

Alex GS

Tech Education Lead at BitterBrains

vueschool.io

Facebook

X

GitHub

BlueSky

LinkedIn

YouTube

Instagram

TikTok

Vue School is proudly part of BitterBrains – Making Developers’ Lives Easier

Become a BitterBrains Community Supporter here.

Courses | Vue.js Master Class | Workshops | Tutorials | Plans

🔕 Not interested? Mute Unlearn Updates & Announcements here.

You received this email because you are subscribed to Marketing Information at thomas+vueschool@brew.marketing.

Manage email preferences

2093 Philadelphia Pike #9442, Claymont, Delaware 19703, United States

[Open and remix this design](https://brew.new/templates/vueschool/ai-code-looks-right-thats-the-problem)

[Browse email designs](https://brew.new/browse/templates)
