<?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: Info Inlet</title>
    <description>The latest articles on DEV Community by Info Inlet (@infoinlet1).</description>
    <link>https://dev.to/infoinlet1</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%2F3941862%2Fcec34100-b85a-4c9e-8061-55c585109946.jpeg</url>
      <title>DEV Community: Info Inlet</title>
      <link>https://dev.to/infoinlet1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/infoinlet1"/>
    <language>en</language>
    <item>
      <title>Everyone's learning to prompt better. That's the wrong skill.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Sat, 26 Sep 2026 05:18:08 +0000</pubDate>
      <link>https://dev.to/infoinlet1/everyones-learning-to-prompt-better-thats-the-wrong-skill-544o</link>
      <guid>https://dev.to/infoinlet1/everyones-learning-to-prompt-better-thats-the-wrong-skill-544o</guid>
      <description>&lt;p&gt;I have a bookmark folder called &lt;code&gt;prompting&lt;/code&gt;. Forty-one tabs in it.&lt;/p&gt;

&lt;p&gt;"The 12 prompts that 10x your engineering." "Context engineering for agents, explained." "The system prompt that changed how I ship." A course I finished at 1am, certain I'd finally cracked the thing — that if I just learned to &lt;em&gt;ask&lt;/em&gt; well enough, the output would come out right.&lt;/p&gt;

&lt;p&gt;I built that folder the same way I once built a GitHub full of dead repos: convinced the scarce skill was the one everybody was selling me.&lt;/p&gt;

&lt;p&gt;It wasn't. And I want to say the thing nobody says at the top of the "master prompt engineering, learn context engineering, become an AI-native engineer" sermon:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting better at prompting is getting better at the wrong skill.&lt;/strong&gt; Not a useless one — the &lt;em&gt;wrong&lt;/em&gt; one. And the reason is worse than "the models will get better and the prompt won't matter." That's true, but it's the boring half. The sharp half is that even a perfect prompt can't touch the thing that was actually going to hurt you.&lt;/p&gt;

&lt;p&gt;Stay with me, because this isn't a doomer post. There's exactly one skill in this whole stack that's still worth every hour — and the logic is what tells you which one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three things we tell ourselves about why prompting is THE skill
&lt;/h2&gt;

&lt;p&gt;Nobody grinds prompt guides for no reason. You do it because you believe one of three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It'll make the output better.&lt;/strong&gt; ("Better prompt, better code. Obviously.")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It'll make me employable.&lt;/strong&gt; ("'AI-native,' 'prompt engineer' — this is the moat now.")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's the new literacy.&lt;/strong&gt; ("This is the fundamental skill of the era. Learn it or fall behind.")&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All three are real motivations. All three are, as usually practised, pointed at the wrong target. Let me take them one at a time, because the miss is instructive — it points straight at the one skill that survives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Belief #1, because it's the load-bearing one: a better prompt can't catch the bug that hurts you
&lt;/h2&gt;

&lt;p&gt;Let's do the one everybody believes hardest.&lt;/p&gt;

&lt;p&gt;Yes, a better prompt gets you better-&lt;em&gt;looking&lt;/em&gt; output. Cleaner structure, fewer obvious mistakes, code that reads like a senior wrote it. That part is real. Here's the part the courses skip:&lt;/p&gt;

&lt;p&gt;A better prompt raises how &lt;strong&gt;convincing&lt;/strong&gt; the output is. It does nothing to whether it's &lt;strong&gt;correct.&lt;/strong&gt; And those two dials were never connected.&lt;/p&gt;

&lt;p&gt;Think about the failure mode that has actually cost you. It was never "the AI misunderstood me and produced obvious garbage" — you catch that in two seconds. The one that hurts is the &lt;em&gt;opposite&lt;/em&gt;: the output that matched your request perfectly, read beautifully, passed the tests you thought to write, and was still wrong in a way you only discovered in production. Plausible. Confident. Broken.&lt;/p&gt;

&lt;p&gt;Now watch what a better prompt does to that failure. It makes the output &lt;em&gt;more&lt;/em&gt; polished, &lt;em&gt;more&lt;/em&gt; authoritative, &lt;em&gt;more&lt;/em&gt; obviously-fine at a glance. Which means the wrong ones get &lt;strong&gt;harder to catch, not easier.&lt;/strong&gt; You didn't improve your defense. You upgraded the disguise on the thing you were supposed to be defending against.&lt;/p&gt;

&lt;p&gt;That's the whole trap in one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A better prompt just gets you to a more convincing wrong answer, faster.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You cannot prompt your way out of this, by construction. The correctness of the answer isn't decided at &lt;em&gt;ask&lt;/em&gt; time. It's decided at &lt;em&gt;review&lt;/em&gt; time, on your side of the desk, by whether you can look at a clean, confident diff and say &lt;em&gt;no.&lt;/em&gt; Prompting optimizes the question. The bug lives in the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Belief #2: prompting is recall wearing a new hat
&lt;/h2&gt;

&lt;p&gt;"But it's a moat. 'AI-native' is what gets hired now."&lt;/p&gt;

&lt;p&gt;Here's what nobody wants to hear about their new favorite skill: prompting is &lt;strong&gt;recall.&lt;/strong&gt; The same recall AI just made worthless, re-manufactured one layer up and sold back to you as expertise.&lt;/p&gt;

&lt;p&gt;For twenty years, "knowing how to code" was quietly two different things bundled together: &lt;strong&gt;recall&lt;/strong&gt; — the syntax, the API surface, the flag order, the incantation — and &lt;strong&gt;judgment&lt;/strong&gt; — knowing what to build, what to distrust, what breaks at 2am when a real person does something strange. AI ate recall first, and good riddance; it was never the valuable part. Testing for it in 2026 is testing for penmanship.&lt;/p&gt;

&lt;p&gt;So what did we do? We rebuilt recall at a higher altitude. "The exact phrasing that makes the model behave." "The context pattern that gets the right output." "The system-prompt incantation." It's the same muscle — memorize the magic words, produce the output — just moved up the stack. We fled the thing AI made free and ran straight into a fresh version of it.&lt;/p&gt;

&lt;p&gt;And this version has a &lt;em&gt;shrinking half-life.&lt;/em&gt; Every model release infers your intent better than the last. The gap between a novice prompt and an expert prompt narrows with each update, because closing that gap is literally what the labs are optimizing. You are grinding a skill the vendor is actively deleting. You cannot build a moat on the exact thing your supplier ships as a feature next quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Belief #3: the fundamental was never the asking
&lt;/h2&gt;

&lt;p&gt;"Fine — but it's the new literacy. The base skill everything else sits on."&lt;/p&gt;

&lt;p&gt;The fundamental skill of working with a system that produces confident, plausible, occasionally-wrong output was never &lt;em&gt;how you ask it.&lt;/em&gt; It's &lt;em&gt;what you do with the answer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Prompting is a UI over the model — and UIs get better on their own, without you. Distrust is a &lt;em&gt;stance&lt;/em&gt; toward the output — and it's the one thing that doesn't improve while you sleep. One is a feature. The other is a muscle only you can carry into the room.&lt;/p&gt;

&lt;p&gt;There's a completely different skill hiding under "get good at AI," and it only shows up under one specific condition — when the output is wrong and everything about it looks right:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A better prompt produces more convincing output. Only distrust decides whether it's right. The asking is free now — the refusing is the entire job.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You don't earn that by writing better prompts. You earn it by shipping a confident answer to a real person, watching it break, feeling the consequence — and carrying the scar into every diff after. That's the forge. Everything before it is a tutorial with better phrasing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moment a perfect prompt handed me a perfect-looking disaster
&lt;/h2&gt;

&lt;p&gt;Let me make this concrete, because I earned it the expensive way.&lt;/p&gt;

&lt;p&gt;I once shipped a write path that &lt;strong&gt;acknowledged the request before it had actually persisted the row.&lt;/strong&gt; The prompt that produced it was clean. The code that came back was clean — it read like something a careful engineer wrote. In the demo, in the tests, on my machine: flawless. Exactly what I asked for.&lt;/p&gt;

&lt;p&gt;Then one day a retry hit at the wrong moment. The ack went out, the save didn't land, and a paying customer got locked out of their own account with &lt;em&gt;no record they'd ever done the thing.&lt;/em&gt; Ack-before-persist. I can still feel it.&lt;/p&gt;

&lt;p&gt;No prompt was going to save me there. A &lt;em&gt;better&lt;/em&gt; prompt would have made it worse — cleaner code, more convincing, even harder to doubt. The thing that would have caught it wasn't a sharper question. It was the trained reflex to look at a diff that acknowledges before it persists and think &lt;em&gt;that breaks under a retry&lt;/em&gt; — before a real human's bad night taught it to me.&lt;/p&gt;

&lt;p&gt;That reflex is distrust. It's the only skill in this whole stack that AI can't hand you, can't improve for you, and can't make obsolete. It's the one line on my résumé that would've been worth an entire interview — and no course sells it, because you can't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be clear about what I'm actually saying — because it's not "stop prompting"
&lt;/h2&gt;

&lt;p&gt;I am not the guy telling you prompting is beneath you. I prompt all day. AI writes most of my code and I'd never go back — the typing was never the hard part, and neither is the asking. Prompt well. A sloppy prompt wastes everyone's time, yours included.&lt;/p&gt;

&lt;p&gt;What I'm saying is narrower and, I think, freeing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompting is table stakes, not the edge.&lt;/strong&gt; It's the cost of entry now, like knowing how to use a keyboard — necessary, and worth exactly zero as a differentiator, because everyone has it and the tool keeps closing the gap. Grinding it harder is polishing a skill whose ceiling the vendor lowers every month. The edge — the only part that compounds — is what you do &lt;em&gt;after&lt;/em&gt; the model answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After the AI answers, &lt;strong&gt;before you accept it, try to break it.&lt;/strong&gt; Ask what it does under a retry, at 2am, when the input is hostile, when the customer does the dumb thing. Attack the answer instead of admiring it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make something other than the author be the skeptic.&lt;/strong&gt; The thing that produced the diff is the worst possible judge of the diff — it's proud of it. The doubt has to come from a different seat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship it to someone who can hurt you.&lt;/strong&gt; That's the only way the wrong ones actually cost you, and cost is the only thing that grows the muscle. A distrust you never had to use isn't a skill. It's a slogan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do that, and you're building the one thing that survives every model release. Skip it, and you're the guy with a beautiful prompt library who can't tell when the beautiful answer is going to lock a customer out at 2am.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is the exact reason I build the way I do
&lt;/h2&gt;

&lt;p&gt;Here's the part that goes one level up, because it's the same logic.&lt;/p&gt;

&lt;p&gt;I build an agent platform, and the temptation in this whole industry right now is to worship the &lt;strong&gt;author&lt;/strong&gt; — the thing that generates. Look how well it responds to a good prompt! Look how clean the output is! But an author that produces gorgeous, confident output is producing gorgeous, confident output &lt;em&gt;whether or not it's right&lt;/em&gt; — and a better prompt only turns the polish up, never the truth. The convincing-ness and the correctness are two different dials, and the whole market is cranking the one that doesn't matter.&lt;/p&gt;

&lt;p&gt;So I never let the thing that writes the code be the thing that blesses it. There's an author that produces the diff — prompt it as well as you like. There's a separate &lt;strong&gt;skeptic&lt;/strong&gt; whose only job is to try to &lt;em&gt;break&lt;/em&gt; the diff rather than admire it — institutionalized distrust, the "no" made into its own seat. And there's a human on the merge button who can see the blast radius the model can't. That separation — author, skeptic, human — is the whole shape of &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;, and it's the same lesson the bookmark folder taught me: &lt;strong&gt;asking is free and getting freer; deciding whether the answer survives contact with reality is the entire job.&lt;/strong&gt; The prompt is cheap. The "no" is the product.&lt;/p&gt;

&lt;p&gt;Your folder of prompt guides isn't a sign you're serious. It's a sign you were optimizing the free thing. Stop grinding the question. Learn to doubt the answer.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Honest question for the comments:&lt;/strong&gt; what's the most convincing, cleanest, best-prompted AI answer you ever &lt;em&gt;rejected&lt;/em&gt; — and how did you know to say no? I want to hear about the one your distrust caught, not the one your prompt produced. 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this made you close a few prompt-guide tabs with a little less guilt, a ❤️ and a 🔖 help it reach the next person grinding the wrong skill on a Saturday.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Stop building side projects. Nobody cares — and here's the uncomfortable math.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Wed, 23 Sep 2026 05:48:57 +0000</pubDate>
      <link>https://dev.to/infoinlet1/stop-building-side-projects-nobody-cares-and-heres-the-uncomfortable-math-1eoc</link>
      <guid>https://dev.to/infoinlet1/stop-building-side-projects-nobody-cares-and-heres-the-uncomfortable-math-1eoc</guid>
      <description>&lt;p&gt;Open your GitHub. Go on. Count the repositories that have a README, a clean commit that says &lt;code&gt;initial commit&lt;/code&gt;, maybe a second one that says &lt;code&gt;wip&lt;/code&gt;, and then… nothing. No third commit. No user who isn't you. No issue filed by a human you've never met.&lt;/p&gt;

&lt;p&gt;I'll wait.&lt;/p&gt;

&lt;p&gt;I count nine on mine. Nine little tombstones. A URL shortener. A habit tracker. Two different note-taking apps because I didn't like how the first one turned out. A "Twitter but for X" from a week I should have been sleeping. Each one started on a Saturday with the specific electric feeling that &lt;em&gt;this&lt;/em&gt; was the one, and each one died on a Wednesday when the part that was actually hard showed up.&lt;/p&gt;

&lt;p&gt;I built the graveyard. Most of us did. And I want to say the thing nobody says at the start of the "build in public, ship every weekend, your portfolio is your résumé" sermon:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody cares about your side project. Not one person. And the math on why is worse than you think.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stay with me, because this isn't a doomer post. There's exactly one kind of side project that's still worth every hour — and the math is what tells you which one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three lies we tell ourselves before the first commit
&lt;/h2&gt;

&lt;p&gt;You don't build a side project for no reason. You build it because you believe one of three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It'll teach me.&lt;/strong&gt; ("I'll finally learn Rust / Kubernetes / that framework.")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It'll get me hired.&lt;/strong&gt; ("Recruiters will see this and know I'm serious.")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It'll make me money.&lt;/strong&gt; ("Maybe this one's a business.")&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All three are real motivations. All three are, as usually practised, mathematically doomed. Let me take them one at a time, because the doom is instructive — it points straight at the one version that survives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lie #2 first, because it's the load-bearing one: nobody is reading your code
&lt;/h2&gt;

&lt;p&gt;Let's do the one everybody believes hardest.&lt;/p&gt;

&lt;p&gt;A recruiter has never, in the history of hiring, cloned your repo. They have not read your code. They did not &lt;code&gt;git log&lt;/code&gt; your commit hygiene at midnight and think &lt;em&gt;ah, a craftsman.&lt;/em&gt; The eye-tracking studies on résumés put the average first pass at somewhere around six or seven seconds — and your GitHub link, if it's clicked at all, gets the profile page, the green squares, and a scroll. That's it.&lt;/p&gt;

&lt;p&gt;Here's the part that actually stings, and it's new. &lt;strong&gt;The day an AI could scaffold a polished, deployed, nice-looking side project in an afternoon, the signal value of "I built a side project" fell to zero.&lt;/strong&gt; Not low. Zero. Because the thing the portfolio was supposed to &lt;em&gt;prove&lt;/em&gt; — "this person can take an idea to a running app" — is now something a motivated teenager does over lunch with a chat window. You cannot signal scarcity with a thing that just became free.&lt;/p&gt;

&lt;p&gt;So the résumé math is: &lt;code&gt;N polished repos × (signal that anyone can now generate for free) = 0&lt;/code&gt;. Adding more repos multiplies zero. It's still zero. You cannot out-volume a value that collapsed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lie #3: the user math is even more brutal
&lt;/h2&gt;

&lt;p&gt;"But maybe it's a business."&lt;/p&gt;

&lt;p&gt;Okay. Count your users. Not signups — the number who came back on day seven and did the thing again. For nine out of ten side projects that number is, precisely, one. You.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;10 side projects × 0 real users each = 0.&lt;/code&gt; And here's the trap the AI era set: it made the &lt;em&gt;building&lt;/em&gt; free and did &lt;strong&gt;nothing&lt;/strong&gt; about the zero. The hard part of a product was never the code. It was getting one stranger to care, come back, and hurt you when it broke. AI compressed the easy 20% — the typing — to nothing, and left the impossible 80% — distribution, retention, trust — exactly as impossible as it always was. So the modern graveyard fills faster than ever, because building the tombstone got cheap and burying it still costs the one thing nobody can generate: another human's attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lie #1 is the only one with a survivor in it
&lt;/h2&gt;

&lt;p&gt;"Fine — but at least I learned something."&lt;/p&gt;

&lt;p&gt;Did you? Be honest about &lt;em&gt;what.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you followed the shape of a tutorial, wired up the same auth-and-CRUD you've wired up before, deployed it, screenshotted it, and moved on — you produced &lt;strong&gt;output.&lt;/strong&gt; A thing that exists. And output, again, is now free. You learned the syntax, the flag order, the incantation. That's recall, and recall is the part AI ate first and you're better off without.&lt;/p&gt;

&lt;p&gt;There's a completely different thing hiding inside "I learned something," and it only shows up under one specific condition:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A side project produces &lt;strong&gt;output&lt;/strong&gt;. Only a side project with a real user who can hurt you produces &lt;strong&gt;judgment.&lt;/strong&gt; Output is now free. Judgment is the entire game.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You do not earn judgment by building. You earn it by &lt;em&gt;shipping to someone who can churn, complain, refund, and file a furious bug at 2am&lt;/em&gt; — and then living through the consequence. That's the forge. Everything before it is a tutorial with your name on the commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one project that was worth all nine tombstones
&lt;/h2&gt;

&lt;p&gt;I have one repo that isn't in the graveyard. One thing I shipped that a real, paying stranger actually used.&lt;/p&gt;

&lt;p&gt;And it taught me something no tutorial could, because it cost me a real person's bad night. I had a write path that &lt;strong&gt;acknowledged the request before it had actually persisted the row.&lt;/strong&gt; In the demo, in the tests, on my machine — flawless. Then one day a retry hit at the wrong moment, the ack went out, the save didn't land, and a paying customer got locked out of their own account with &lt;em&gt;no record that they'd ever done the thing.&lt;/em&gt; Ack-before-persist. I can still feel it.&lt;/p&gt;

&lt;p&gt;No course gave me that. No amount of scaffolding a tenth side project would have. I earned it the slow, expensive, humiliating way — because there was a real human on the other end of the glass who could be hurt by my mistake, and was. That single scar is worth more than the other nine repos combined, and it's the only line on my GitHub that would have been worth an entire interview.&lt;/p&gt;

&lt;p&gt;That's the math nobody puts on the "ship every weekend" poster: &lt;strong&gt;nine projects with zero users taught me nine times nothing. One project with one real user taught me the thing I now build my whole career around.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Be clear about what I'm actually saying — because it's not "don't build"
&lt;/h2&gt;

&lt;p&gt;I am not the guy telling you to stop making things. I make things constantly. I let AI generate output all day long — it writes most of my code, and I'd never go back. Building is joyful and you should do it for the joy alone, no defense required.&lt;/p&gt;

&lt;p&gt;What I'm saying is narrower and, I think, freeing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop building side projects &lt;em&gt;as a strategy.&lt;/em&gt; They were never the scarce thing, and the day AI made them free, "I built ten of these" stopped meaning anything to anyone but you.&lt;/strong&gt; The strategy that's left is the boring, terrifying one nobody screenshots:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build &lt;strong&gt;one&lt;/strong&gt; thing.&lt;/li&gt;
&lt;li&gt;Put it in front of &lt;strong&gt;one&lt;/strong&gt; real stranger who can hurt you — someone who will churn, complain, or ask for their money back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it alive.&lt;/strong&gt; Maintain it through the 2am. Feel the ack-before-persist for yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One shipped-and-maintained thing that a real person depends on will teach you — and, incidentally, &lt;em&gt;show&lt;/em&gt; an interviewer — more than a hundred green-squared weekends. Not because it's more impressive. Because it's the only place judgment is actually minted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is the exact reason I build the way I do
&lt;/h2&gt;

&lt;p&gt;Here's the part that goes one level up, because it's the same math.&lt;/p&gt;

&lt;p&gt;I build an agent platform, and the temptation in this whole industry right now is to celebrate the &lt;em&gt;author&lt;/em&gt; — the thing that generates. Look how fast it ships! Ten side projects an afternoon! But an author that produces infinite output is producing infinite &lt;em&gt;unblessed diffs.&lt;/em&gt; A GitHub graveyard is exactly that: a pile of things generated and never judged, never shipped into contact with a reality that could hurt you. The volume was never the point. The volume is now free.&lt;/p&gt;

&lt;p&gt;So I never let the thing that writes the code be the thing that blesses it. There's an author that produces the diff, a separate skeptic whose only job is to try to &lt;em&gt;break&lt;/em&gt; it rather than admire it, and a human on the merge button who can see the blast radius the model can't. That separation — author, skeptic, human — is the whole shape of &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;, and it's the same lesson the graveyard teaches: &lt;strong&gt;generating a thing is free and always will be; deciding whether it survives contact with a real user is the entire job.&lt;/strong&gt; Output is cheap. Judgment is the product.&lt;/p&gt;

&lt;p&gt;Your GitHub graveyard isn't a sign you're lazy. It's a sign you were optimizing for the free thing. Stop. Build one thing that can hurt you, and stay.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Honest question for the comments:&lt;/strong&gt; how many tombstones are on your GitHub right now — and which &lt;em&gt;one&lt;/em&gt; project, the one you actually shipped to a stranger, taught you something none of the others did? I want to hear about the one that survived. 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this made you close a few dead tabs with a little less guilt, a ❤️ and a 🔖 help it reach the next person staring at their graveyard on a Saturday.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I interviewed the people who rejected me. Here's what their hiring process is actually optimizing for.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Tue, 22 Sep 2026 04:51:00 +0000</pubDate>
      <link>https://dev.to/infoinlet1/i-interviewed-the-people-who-rejected-me-heres-what-their-hiring-process-is-actually-optimizing-i9f</link>
      <guid>https://dev.to/infoinlet1/i-interviewed-the-people-who-rejected-me-heres-what-their-hiring-process-is-actually-optimizing-i9f</guid>
      <description>&lt;p&gt;Last week I wrote about getting rejected from a job for "relying on AI" in the coding round — by an interviewer I'd watched read an AI answer off his own screen forty minutes earlier. I thought the story was about hypocrisy.&lt;/p&gt;

&lt;p&gt;Then a reader replied with something sharper, and it reframed the whole thing for me.&lt;/p&gt;

&lt;p&gt;He'd been through the opposite version. Told "please, no AI," so he stuck to it — and blanked on a manual code review of a file that couldn't even compile, because of external calls he was never shown. He walked out certain he'd be lowballed. And buried in his comment was the sentence that's been rattling around my head since:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The interview isn't for judging competence. It's for judging value — and for seeing how far they can degrade your perceived value before they name a number.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I read that and something clicked into place that my own rejection had only hinted at.&lt;/p&gt;

&lt;p&gt;So I did the thing the rejection process never lets you do: I put it on the table and interrogated it. Not the interviewer — the &lt;em&gt;machine&lt;/em&gt;. Two rounds, mine and his, treated as evidence about what the whole apparatus is really built to do. Here's what their hiring process is actually optimizing for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test I thought I was failing
&lt;/h2&gt;

&lt;p&gt;Both of us walked into our rounds thinking the same thing: &lt;em&gt;this is a competence test. Prove you can do the work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the wrong frame. It's not a competence test. &lt;strong&gt;It's a pricing test.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The company already believes you can probably do the job — your résumé got you in the room, your GitHub is right there, they can read. What they don't know yet is the one number that decides whether hiring you is a good deal: &lt;strong&gt;how little you'll accept.&lt;/strong&gt; And the interview is the instrument they use to find it.&lt;/p&gt;

&lt;p&gt;Once you see it that way, a lot of otherwise-baffling interview behavior snaps into focus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why they need you to fail at exactly one thing
&lt;/h2&gt;

&lt;p&gt;Here's the part that sounds cynical until you've lived it.&lt;/p&gt;

&lt;p&gt;The ideal interview outcome for the company is not "flawless candidate." A flawless candidate is &lt;em&gt;expensive.&lt;/em&gt; If you sail through every stage, you walk into the offer conversation with leverage, and you'll refuse a lowball because you have every reason to.&lt;/p&gt;

&lt;p&gt;The ideal outcome is a candidate who is clearly good — good enough to hire — but who &lt;strong&gt;fumbled exactly one thing.&lt;/strong&gt; Not zero (then they can't discount you). Not everything (then there's no offer). One clean, legible stumble. Because that one stumble is the whole negotiation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You're strong. Really. But you're not quite as senior as you think — remember that code review? So here's what we think you're worth."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And you, still stinging from the one thing you got wrong, nod and accept a number well under where you walked in. The stumble wasn't a bug in the interview. It was the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tell is in the questions they ask
&lt;/h2&gt;

&lt;p&gt;You want to know whether an interview is measuring your competence or pricing your floor? Listen to how they ask about money.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"What are your salary expectations?"&lt;/strong&gt; asks for your &lt;em&gt;ceiling&lt;/em&gt; — the most you think you're worth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"How much do you currently earn?"&lt;/strong&gt; asks for your &lt;em&gt;floor&lt;/em&gt; — the least they can get away with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Guess which one gets asked. Nearly every time, it's the second. They are not trying to find out what you're worth. They're trying to find out what you'll settle for — and anchoring the entire offer to a number from your &lt;em&gt;past&lt;/em&gt; instead of the value in front of them.&lt;/p&gt;

&lt;p&gt;That single swap tells you which game is being played. It was never "can you do this." It was always "how little can we pay you to."&lt;/p&gt;

&lt;h2&gt;
  
  
  Value in the room, priced off the floor
&lt;/h2&gt;

&lt;p&gt;The reader's story is the whole argument in one interview.&lt;/p&gt;

&lt;p&gt;Walk in and bring &lt;em&gt;real&lt;/em&gt; value — spot the bottlenecks their own team hasn't named out loud, demo something that plugs straight into their stack and beats what they're running now, watch the interviewer get visibly taken aback by how much you see. That's the entire job. That's the thing that's supposed to be rare and worth paying for.&lt;/p&gt;

&lt;p&gt;Then fumble one manual code review — reading a file cold that can't compile because of calls you were never shown — and &lt;em&gt;that&lt;/em&gt; gets to veto all of it. Not because it revealed you can't do the work. Because it handed them the discount they needed.&lt;/p&gt;

&lt;p&gt;Value shown at the ceiling. Priced at the floor. The stumble laundered a lowball into "honest feedback."&lt;/p&gt;

&lt;p&gt;And here's the tell inside the tell: the code you were failed for reading? It was running deprecated patterns on their live service. You got marked down for not fluently reviewing code that their own production shouldn't be running. The abstinence test and the code-review test are the same test — both grade you on a skill the job itself no longer rewards, precisely because that's the skill you're most likely to visibly miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is the same failure as the AI thing
&lt;/h2&gt;

&lt;p&gt;When I put the two stories side by side — mine and his — they're the same shape.&lt;/p&gt;

&lt;p&gt;Mine: rejected for &lt;em&gt;using&lt;/em&gt; the tool everyone in the room was already using. His: rejected for &lt;em&gt;not&lt;/em&gt; fluently performing a skill the company's own production had already abandoned. Both interviews measured the cheap, legible thing instead of the expensive, real one. Both optimized for a stumble they could point at, not the value they could actually use.&lt;/p&gt;

&lt;p&gt;Because the stumble is &lt;em&gt;legible.&lt;/em&gt; "He used autocomplete." "He couldn't read the file cold." Those go in a scorecard. Judgment doesn't. The bug I flagged unprompted — persist-before-ack, the one that locks a paying customer out with no record on the worst possible day — never made it onto anyone's scorecard, because you can't screenshot it and you can't discount someone for having it. So it got ignored in favor of the thing they could.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do you actually do about it
&lt;/h2&gt;

&lt;p&gt;You can't fix their instrument. But you can stop mistaking their price for your worth.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Know your floor and refuse to hand it over.&lt;/strong&gt; When they ask what you currently earn, answer with what you're &lt;em&gt;looking for.&lt;/em&gt; You are allowed to move the anchor from your past to your value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat the one stumble as their tool, not your verdict.&lt;/strong&gt; You did not fail the interview because you blanked on cold code review. You "failed" because the interview needed you to fail at &lt;em&gt;something&lt;/em&gt;, and that was the cheapest thing lying around.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Have enough runway to walk.&lt;/strong&gt; The only real leverage in a pricing negotiation is the credible ability to say no. If you can let them make the junior offer and &lt;em&gt;keep&lt;/em&gt; it — and let the runner-up have the seat — you've flipped the game. For once, you're the selective one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sell the value they can't screenshot.&lt;/strong&gt; Make the bottleneck you spotted, the bug you caught, the thing-that-breaks-at-2am you predicted — make &lt;em&gt;those&lt;/em&gt; the loudest part of the conversation. If they still price you off a compile error, that's your answer about them, not about you.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why this is exactly how I build
&lt;/h2&gt;

&lt;p&gt;Here's why this isn't just an interview rant.&lt;/p&gt;

&lt;p&gt;The failure in both of those rooms was a process that measured the &lt;em&gt;legible&lt;/em&gt; thing instead of the &lt;em&gt;valuable&lt;/em&gt; one — that couldn't tell the difference between "stumbled on something easy to point at" and "can't actually do the work." That is precisely the mistake I refuse to build into an agent.&lt;/p&gt;

&lt;p&gt;I never let the thing that produces the work be the thing that grades it, and I never let the &lt;em&gt;most legible&lt;/em&gt; signal stand in for the &lt;em&gt;most valuable&lt;/em&gt; one. There's an author agent that writes the diff, a separate skeptic agent whose only job is to refute it rather than admire it, and a human on the merge button who can still see the blast radius — the value and the risk the model can't screenshot. The point isn't to find the one flaw and discount everything around it. The point is to judge the actual output. That separation between author, skeptic, and human is the whole shape of &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;, the agent platform we build.&lt;/p&gt;

&lt;p&gt;An interview that hunts for your one stumble so it can price you off your floor is running the same broken evaluation I spend my days designing &lt;em&gt;out&lt;/em&gt; of software. The company that prices you at your ceiling — that pays for the bottleneck you spotted instead of discounting you for the file you couldn't read cold — is rare. But they exist. And the only way you ever get to work for one is if you've kept enough self-respect to turn down the ones who don't.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Honest question for the comments:&lt;/strong&gt; have you ever felt an interview go looking for your one stumble — the moment where you could feel them setting up the discount? Or been on the hiring side and watched a process reward the legible miss over the real value? I want to know how common this actually is. 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this landed, a ❤️ and a 🔖 help — and tell me the moment you realized they were pricing your floor, not testing your ceiling.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>hiring</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How to stop AI from confidently shipping broken code (a pattern that actually works)</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Mon, 21 Sep 2026 05:14:58 +0000</pubDate>
      <link>https://dev.to/infoinlet1/how-to-stop-ai-from-confidently-shipping-broken-code-a-pattern-that-actually-works-2gn7</link>
      <guid>https://dev.to/infoinlet1/how-to-stop-ai-from-confidently-shipping-broken-code-a-pattern-that-actually-works-2gn7</guid>
      <description>&lt;p&gt;&lt;em&gt;The scariest diff passed every test — and would've lost a customer money.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The scariest diff AI ever handed me passed every test, read beautifully, and would have lost a paying customer their money the first bad night in production. It didn't look risky. It looked &lt;em&gt;finished.&lt;/em&gt; That's the whole problem.&lt;/p&gt;

&lt;p&gt;AI doesn't ship broken code because it's dumb. It ships broken code because it's &lt;strong&gt;confident&lt;/strong&gt;, and almost nothing in a normal dev loop is trying to prove it wrong. You ask it to write the thing, it writes the thing, the tests go green, and every signal you have says &lt;em&gt;ship.&lt;/em&gt; Confidence is the output. Correctness is a coincidence you're hoping rides along.&lt;/p&gt;

&lt;p&gt;I spent 30 days letting AI write 100% of my code — refused to type a line of application logic myself — specifically to find out what actually stops this. Not the demos. The real thing, in production, with money on the line. Here's the honest answer: it wasn't a smarter model, and it wasn't a cleverer prompt. It was one structural rule, and you can adopt it today without changing a single tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "review this code" does nothing
&lt;/h2&gt;

&lt;p&gt;The instinct, when you don't trust the output, is to ask the AI to check its own work:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Review this code and tell me if it's correct."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is worse than useless, because it &lt;em&gt;feels&lt;/em&gt; like a safeguard while doing nothing. An LLM asked "is this correct?" is being asked to agree with itself, and it's exceptionally good at agreeing with itself. It grades its own homework in a slightly more formal voice and hands you back an A. You didn't add a check. You added a second layer of confidence on top of the first one.&lt;/p&gt;

&lt;p&gt;The failure isn't that the model is bad at reviewing. It's that &lt;strong&gt;"confirm this" and "break this" are different jobs, and confirmation is the one thing the model will always deliver.&lt;/strong&gt; You have to stop asking for the job you'll always get.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern: the Refutation Gate
&lt;/h2&gt;

&lt;p&gt;Here's the entire rule, and it's boring on purpose:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nothing merges until a second reader — whose only job is to break it — has tried and failed.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three parts make it actually work. Skip any one and it collapses back into an echo.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The reviewer is not the author
&lt;/h3&gt;

&lt;p&gt;The thing that wrote the code cannot be the thing that blesses it — even if it's the same model, it has to be a &lt;strong&gt;separate, clean context&lt;/strong&gt; that never saw the code get written. The author's context is poisoned: it already "knows" the code is right, because it just spent 4,000 tokens convincing itself. A fresh reviewer with no memory of the writing is the cheapest independence you can buy.&lt;/p&gt;

&lt;p&gt;Better still: make the reviewer a &lt;strong&gt;different model family.&lt;/strong&gt; Different training distribution, different blind spots. Two models from the same family share the same idea of what "clean" looks like — so they share the same landmines. The single highest-leverage change I made all month was pointing the reviewer at a different model than the author.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The reviewer gets a break-it brief, never a bless-it brief
&lt;/h3&gt;

&lt;p&gt;This is the part that does the work. Don't ask the reviewer to review. Give it a job it can &lt;em&gt;only&lt;/em&gt; do by finding the failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instead of this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;Review this diff and tell me if it looks correct.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Do this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This code is broken. I know it is — I just don't know how yet.
Your job is to produce the specific input, sequence, or state that
makes it fail. Assume:

- the network drops a packet at the worst possible moment
- two of these run at the same time
- the database write fails AFTER the external call succeeds
- the user does the thing no sane user would do

Give me the exact scenario that loses data or loses a customer money.
If you truly cannot find one, say so explicitly and explain what
would have to be true for that to be the case.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice what changed. The reviewer is no longer looking for reasons to say yes. It's hunting a specific, concrete failure, and its default is "this is broken — prove otherwise." Same model. Same weights. Completely different output, because &lt;strong&gt;the objective is the reviewer, not the model.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A human owns the merge
&lt;/h3&gt;

&lt;p&gt;Not to out-code the machine — it out-codes you. To hold the one thing neither agent has: the memory of having been burned. More on this below, because it's the part that can't be automated and shouldn't be.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug it catches that everything else waves through
&lt;/h2&gt;

&lt;p&gt;Let me make this concrete with the exact diff that started all of this.&lt;/p&gt;

&lt;p&gt;The AI wrote a Stripe webhook handler. Simplified:&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="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;/webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        &lt;span class="c1"&gt;// tell Stripe "got it"&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;savePayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// then write the row&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read it. It's clean. It's &lt;em&gt;fast&lt;/em&gt; — it acks Stripe immediately so the webhook latency is low. Every test passes, every single time. If you asked an AI "is this correct?" it would say yes and compliment the low-latency acknowledgement. Mine did.&lt;/p&gt;

&lt;p&gt;Now run it through the Refutation Gate. The break-it brief says &lt;em&gt;"the database write fails after the external call succeeds."&lt;/em&gt; And there it is: it &lt;strong&gt;acknowledges the event before it persists it.&lt;/strong&gt; One database blip in the gap between the &lt;code&gt;200&lt;/code&gt; and the &lt;code&gt;savePayment&lt;/code&gt; — and Stripe believes the event is delivered, your DB never heard about it, and a customer who just paid you has access to nothing and no record they ever paid. On a bad night, silently, to real people.&lt;/p&gt;

&lt;p&gt;That bug is invisible to "review this." It is glaringly obvious to "produce the input that loses money." The code didn't change. The &lt;em&gt;question&lt;/em&gt; did.&lt;/p&gt;

&lt;p&gt;The fix is one line of ordering — persist first, ack after — but you only ever write that fix if something in your loop was actively trying to break the happy path. Confidence would have shipped it. Refutation caught it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the human still can't leave the room
&lt;/h2&gt;

&lt;p&gt;Here's the limit I hit, and I want to be honest about it instead of selling you a fully-automated fantasy.&lt;/p&gt;

&lt;p&gt;I fed that exact webhook to a second AI with a &lt;em&gt;perfect&lt;/em&gt; break-it brief — and when the author and reviewer were the same model family, it still sometimes approved it. Why? Because both models were trained on the same million examples of "clean webhook code," and both of them &lt;em&gt;believed&lt;/em&gt; ack-before-persist was fine. The reviewer didn't refute the blind spot. It re-derived it, more confidently, and called it good taste.&lt;/p&gt;

&lt;p&gt;Then I showed the same code to a senior engineer with no special prompt. Five minutes: &lt;em&gt;"it acks before it writes — I got paged for exactly this in 2021, it's a nightmare to reconcile."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;She wasn't smarter than the model. She'd been &lt;strong&gt;burned.&lt;/strong&gt; She had scar tissue you cannot train into a context window, because the model has read a million descriptions of the dual-write problem and she has &lt;em&gt;lived&lt;/em&gt; one. That's the difference, and it's the entire reason a human stays on the merge button: to catch the one bug that lives inside the machine's blind spot, which is exactly the bug the machine will confidently wave through.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole pattern, in one place
&lt;/h2&gt;

&lt;p&gt;Steal this. It costs nothing and it's tool-agnostic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Never ask AI to confirm its own code.&lt;/strong&gt; Confirmation is the one output it can't fail to produce, so it tells you nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a second reader in a clean context&lt;/strong&gt; — different model family if you can. Independence is divergence, not a second seat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give that reader a break-it brief, not a bless-it brief.&lt;/strong&gt; "Produce the input that loses money," never "does this look right."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a human — ideally a burned one — on the merge.&lt;/strong&gt; Their job isn't to write better code. It's to remember what hurt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A confident AI is not a checked AI. The only thing that turns confidence into correctness is something whose entire job is to try to prove it wrong.&lt;/p&gt;

&lt;p&gt;That, exactly, is the shape of what we build at &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;: an agent that does the work, a &lt;em&gt;different&lt;/em&gt; agent whose only job is to tear it down, and a person who owns the merge. I didn't start from that thesis. I arrived at it from 30 days of watching confident, beautiful, green-checkmarked diffs that would have quietly hurt real people — and finding the one pattern that caught them.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Questions I'd genuinely like answered in the comments:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What's the confident-but-broken diff AI handed &lt;em&gt;you&lt;/em&gt; — the one that passed every test and would've bitten you in prod?&lt;/li&gt;
&lt;li&gt;Do you run an AI reviewer? Is it the same model as your author, and have you ever measured what a &lt;em&gt;different&lt;/em&gt; family catches?&lt;/li&gt;
&lt;li&gt;Has anyone A/B'd "review this code" against a break-it brief on the same diff? I want numbers.&lt;/li&gt;
&lt;li&gt;If AI does all the entry-level work, where does the next senior's scar tissue come from — the scar tissue that catches what the agents wave through?&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>10 VS Code Extensions I Can't Code Without in 2026</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Sun, 20 Sep 2026 06:41:47 +0000</pubDate>
      <link>https://dev.to/infoinlet1/10-vs-code-extensions-i-cant-code-without-in-2026-16ak</link>
      <guid>https://dev.to/infoinlet1/10-vs-code-extensions-i-cant-code-without-in-2026-16ak</guid>
      <description>&lt;p&gt;Every "best VS Code extensions" list is the same 30 icons with a one-line blurb. This isn't that.&lt;/p&gt;

&lt;p&gt;A few months ago my Extensions panel had crept past 40. Startup was sluggish, half of them I'd forgotten installing, and a good chunk were AI helpers all fighting to finish my sentences. So I did the thing you're supposed to do once a year: I disabled everything and turned them back on one at a time, only when I actually reached for one.&lt;/p&gt;

&lt;p&gt;I ended up keeping 10. And when I looked at the survivors, they had one thing in common — a filter clean enough that I now install by it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A good extension makes the decision faster to make. A bad one makes the decision for you.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every extension below shows me something I'd otherwise have to go dig for, then gets out of the way and lets &lt;em&gt;me&lt;/em&gt; choose what to do about it. The ones I deleted were the opposite: they decided, then told me after (if at all). Hold that line and the list writes itself.&lt;/p&gt;

&lt;p&gt;Here's the 10.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Error Lens
&lt;/h2&gt;

&lt;p&gt;The single highest-leverage extension in my setup. It takes the diagnostics VS Code already has and prints them &lt;strong&gt;inline, at the end of the line&lt;/strong&gt;, instead of hiding them in the Problems panel or behind a hover.&lt;/p&gt;

&lt;p&gt;That sounds cosmetic. It isn't. It collapses the loop between "I wrote something wrong" and "I know I wrote something wrong" from &lt;em&gt;go-hunt-for-it&lt;/em&gt; to &lt;em&gt;zero&lt;/em&gt;. You stop context-switching to a panel forty times an hour. The error is just… there, red, next to the thing.&lt;/p&gt;

&lt;p&gt;It's the purest example of the filter: it makes the problem impossible to miss, and does nothing about it. You still decide the fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. GitLens
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git blame&lt;/code&gt; as an ambient sense. Put your cursor on any line and GitLens tells you who last touched it, when, and in which commit — inline, without leaving the file.&lt;/p&gt;

&lt;p&gt;The reason it earns a permanent seat: the question it answers isn't "who do I blame," it's &lt;strong&gt;"what was the author thinking, and is that still true?"&lt;/strong&gt; Before you rip out a weird-looking guard clause, you can see it was added in the commit titled &lt;em&gt;"fix: race when webhook acks before the row is persisted"&lt;/em&gt; — and now you don't rip it out. That's judgment the tool fed you, not judgment it made for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. ESLint
&lt;/h2&gt;

&lt;p&gt;Non-negotiable, and not for the style nits. A good ESLint config catches a whole class of &lt;em&gt;real&lt;/em&gt; bugs before you run anything — the floating promise you forgot to &lt;code&gt;await&lt;/code&gt;, the exhaustive-deps you missed, the &lt;code&gt;===&lt;/code&gt; you meant. Wire it to fix-on-save for the mechanical stuff (import order, quotes) and leave the logic rules as warnings you read and act on.&lt;/p&gt;

&lt;p&gt;The distinction matters: auto-fix the things with one correct answer; surface the things that need a human call. Same filter again.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Prettier
&lt;/h2&gt;

&lt;p&gt;I stopped having opinions about formatting in 2019 and I've never been happier. Prettier on save means every diff is a &lt;em&gt;content&lt;/em&gt; diff — never a "someone's editor re-tabbed the file" diff. Pair it with ESLint (&lt;code&gt;eslint-config-prettier&lt;/code&gt; so they don't fight) and code review stops wasting its first ten minutes on whitespace.&lt;/p&gt;

&lt;p&gt;This one &lt;em&gt;does&lt;/em&gt; decide for you — and that's fine, because formatting is the rare case with no judgment in it. That's exactly why it's safe to automate. Keep that in your back pocket; it's the whole test for what you let a tool own.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Pretty TypeScript Errors
&lt;/h2&gt;

&lt;p&gt;If you write TypeScript, this gives back hours of your life. It takes those 40-line, deeply-nested "Type 'X' is not assignable to type 'Y'" walls and formats them into something a human can actually read — indented, syntax-highlighted, with the &lt;em&gt;actual&lt;/em&gt; mismatch pulled out.&lt;/p&gt;

&lt;p&gt;It doesn't fix the error or guess your intent. It makes the compiler's own message legible so you can. Perfect fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Import Cost
&lt;/h2&gt;

&lt;p&gt;Renders the size of every imported package right next to the &lt;code&gt;import&lt;/code&gt; line. You &lt;code&gt;import { format } from 'date-fns'&lt;/code&gt; and it quietly tells you that just cost you 20KB.&lt;/p&gt;

&lt;p&gt;It won't stop you. It won't rewrite it to a lighter import. It just makes the cost &lt;em&gt;visible at the moment you're making the choice&lt;/em&gt; — which is the only moment the information is useful. Nine times out of ten you shrug and move on; the tenth time it saves you from shipping a 300KB date formatter.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Path Intellisense
&lt;/h2&gt;

&lt;p&gt;Autocomplete for filesystem paths in your imports and &lt;code&gt;src&lt;/code&gt; attributes. Small, boring, and I'd riot if you took it away. It removes an entire category of dumb typo bugs (&lt;code&gt;../../&lt;/code&gt; off by one) by showing you what's actually there as you type. Pure surfacing, zero magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Todo Tree
&lt;/h2&gt;

&lt;p&gt;Scans your workspace for &lt;code&gt;TODO&lt;/code&gt;, &lt;code&gt;FIXME&lt;/code&gt;, &lt;code&gt;HACK&lt;/code&gt;, &lt;code&gt;NOTE&lt;/code&gt; and lists them in a tree in the sidebar, colour-coded by tag. It turns the notes-to-self you scatter while heads-down into an actual, visible worklist you can't pretend you didn't leave.&lt;/p&gt;

&lt;p&gt;I add a &lt;code&gt;// REVIEW:&lt;/code&gt; tag for "I wrote this fast, come back with fresh eyes." Todo Tree makes future-me's judgment call impossible to lose. That's the whole job.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Code Spell Checker
&lt;/h2&gt;

&lt;p&gt;Underlines typos in your code — variable names, comments, strings. Sounds trivial until the day it saves you from shipping &lt;code&gt;recieveWebhook&lt;/code&gt; as a public function name that then lives in your API forever, or a &lt;code&gt;retreive&lt;/code&gt; that breaks a string match three files away. It flags; you decide if it's a real word or your weird domain term (and you add it to the dictionary). Surfacing, not deciding.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. REST Client (or Thunder Client)
&lt;/h2&gt;

&lt;p&gt;Write HTTP requests in a plain &lt;code&gt;.http&lt;/code&gt; file, hit send, see the response — without leaving the editor or opening a separate app. The &lt;code&gt;.http&lt;/code&gt; file lives in the repo, so your API calls are version-controlled, diffable, and right next to the code that serves them.&lt;/p&gt;

&lt;p&gt;The reason I prefer a file-based client over the big GUI apps: the request is &lt;em&gt;text I can read and own&lt;/em&gt;, sitting in git, not state trapped inside another program's cloud. Same instinct as the rest of the list — keep the thing you need to reason about in front of you and under your control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honorable mentions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; — manage containers/images from the sidebar; great when you're not living in the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; — edit and read workflow files with schema validation, so you stop pushing "fix CI" commits blind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Even Better TOML / YAML&lt;/strong&gt; — schema-aware editing for the config files that silently break everything when a key is off by one space.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The ones I deleted — and why
&lt;/h2&gt;

&lt;p&gt;Here's where the filter earns its keep. Most of what I &lt;em&gt;removed&lt;/em&gt; was AI assistance, and I want to be precise about why, because I am not anti-AI — I let a model write most of my code.&lt;/p&gt;

&lt;p&gt;I killed the extensions that &lt;strong&gt;decide silently&lt;/strong&gt;: the ones that auto-accept a completion before I've read it, the "fix all problems" button that rewrites logic I didn't inspect, the assistant that quietly refactors on save. Not because they're wrong often — because when they're wrong, they're wrong &lt;em&gt;invisibly&lt;/em&gt;, and they were training me to approve instead of decide.&lt;/p&gt;

&lt;p&gt;The AI tooling I kept is the tooling that behaves like Error Lens: it &lt;strong&gt;shows me its reasoning and waits.&lt;/strong&gt; Suggests the diff, explains the risk, and leaves my hand on the button. That one distinction — &lt;em&gt;surfaces vs. decides&lt;/em&gt; — sorted 40 extensions into 10 in about an hour.&lt;/p&gt;

&lt;p&gt;It's the same rule I hold one level up, for the agents that write the actual code. I never let the tool that writes something be the tool that blesses it. There's an author, a separate skeptic whose only job is to try to break the diff, and a human on the merge button who can see the blast radius the model can't. Your extensions shelf is that same architecture in miniature: keep the tools that make you a better decider, delete the ones quietly relieving you of the decision. (That separation is the whole idea we're building &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt; around — but you can apply the filter tonight without us.)&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Your turn for the comments:&lt;/strong&gt; what's the one extension you'd fight to keep — and does it &lt;em&gt;surface&lt;/em&gt; something for you, or &lt;em&gt;decide&lt;/em&gt; something for you? 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this thinned out someone's Extensions panel, a ❤️ and a 🔖 help it reach the next dev whose editor takes nine seconds to open.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>vscode</category>
    </item>
    <item>
      <title>I got rejected for using AI in an interview. Then I watched the interviewer do it.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Sat, 19 Sep 2026 07:53:38 +0000</pubDate>
      <link>https://dev.to/infoinlet1/i-got-rejected-for-using-ai-in-an-interview-then-i-watched-the-interviewer-do-it-31d0</link>
      <guid>https://dev.to/infoinlet1/i-got-rejected-for-using-ai-in-an-interview-then-i-watched-the-interviewer-do-it-31d0</guid>
      <description>&lt;p&gt;I got the rejection email on a Tuesday. I've been rejected before — everyone has. This one broke something.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"While your technical skills are strong, we felt your reliance on AI tools during the assessment didn't reflect the independent problem-solving we're looking for."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rejected. For using AI.&lt;/p&gt;

&lt;p&gt;By a man who — forty minutes earlier, on the same video call — had quietly done the exact same thing right in front of me.&lt;/p&gt;

&lt;p&gt;Let me tell you how I know.&lt;/p&gt;

&lt;h2&gt;
  
  
  It was a normal live-coding round
&lt;/h2&gt;

&lt;p&gt;Screen shared, camera on, the usual. A medium problem: parse some messy input, transform it, return something structured. Nothing exotic. The kind of thing I do at my actual job every single day.&lt;/p&gt;

&lt;p&gt;So I did it the way I do it every single day. I broke the problem down, wrote the core logic myself, and let the assistant stub the boilerplate so I could spend my attention on the edge cases. And I &lt;em&gt;said so&lt;/em&gt;, out loud, on the call: "I'll let the assistant scaffold this part so I can focus on where it'll actually break."&lt;/p&gt;

&lt;p&gt;I wasn't hiding anything. That, it turns out, was the mistake — thinking honesty was the safe choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then he went quiet
&lt;/h2&gt;

&lt;p&gt;Not thinking-quiet. &lt;strong&gt;Uncomfortable&lt;/strong&gt;-quiet.&lt;/p&gt;

&lt;p&gt;I didn't clock it in the moment. You never do. You just feel a small temperature drop on the other side of the glass and tell yourself you're imagining it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The follow-up that gave him away
&lt;/h2&gt;

&lt;p&gt;He asked a follow-up about time complexity. Then his eyes did the thing.&lt;/p&gt;

&lt;p&gt;The flick. The half-second reading pause. The answer that came back a beat too clean, too structured, too &lt;em&gt;formatted&lt;/em&gt; to be something a person says off the top of their head on a Tuesday afternoon.&lt;/p&gt;

&lt;p&gt;I'm not going to pretend I could read his screen. But I've used these tools every day for two years. I know exactly what someone reading a generated answer looks like, because I look like that too. He was reading an AI's answer while quietly marking me down for reaching for one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's what actually broke me
&lt;/h2&gt;

&lt;p&gt;It wasn't the hypocrisy. Hypocrisy I can file away.&lt;/p&gt;

&lt;p&gt;What broke me was realizing the rule was never "don't use AI."&lt;/p&gt;

&lt;p&gt;The rule was &lt;strong&gt;"don't let us see you use AI."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pretend you didn't. Perform the 2019 version of yourself. Hide the tool that everyone in the room — interviewer included — is already using. They didn't reject someone who couldn't do the work. They rejected someone who was honest about &lt;em&gt;how&lt;/em&gt; he does it. Those are not the same person, and only one of them is a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test they thought they were running
&lt;/h2&gt;

&lt;p&gt;Here's the part I've actually been chewing on, past the sting.&lt;/p&gt;

&lt;p&gt;They believed they were testing whether I could solve the problem &lt;em&gt;without&lt;/em&gt; AI. But that's a test for a job that no longer exists. Nobody on their team ships without AI. He couldn't get through a &lt;strong&gt;follow-up question&lt;/strong&gt; without it.&lt;/p&gt;

&lt;p&gt;The test that would have actually told them something is the opposite one: give me the AI, then watch whether I can tell when it's lying to me.&lt;/p&gt;

&lt;p&gt;Because that's the only skill that survived a year of me leaning on these tools as hard as humanly possible. A month ago I ran an experiment where I let AI write &lt;strong&gt;100% of my code&lt;/strong&gt; for 30 days and refused to type a line of application logic myself. It shipped a real product. And the thing that made it shippable wasn't the AI — it was the times I looked at a clean, confident, plausible diff and said &lt;em&gt;no&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tell they never asked about
&lt;/h2&gt;

&lt;p&gt;During that same round, before the boilerplate, I'd flagged something in the problem's framing: the write path needed to persist before it acknowledged, or a retry could double-count. It's the exact ack-before-persist bug that bit me during the 30-day run — the one where acknowledging before you save leaves a paying customer locked out with no record on a bad day.&lt;/p&gt;

&lt;p&gt;No AI gave me that. I earned it the slow, expensive way, years before any of this. It's the thing that would have been worth an entire interview.&lt;/p&gt;

&lt;p&gt;They didn't ask about it. They were too busy noting that I'd used autocomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two skills we keep pricing as one
&lt;/h2&gt;

&lt;p&gt;There are two different things hiding inside the word "coding," and hiring is still pricing them as one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recall&lt;/strong&gt; — the syntax, the API, the flag order, the incantation. AI has made this obsolete, and good riddance; it was never the valuable part. Testing for it in 2026 is testing for penmanship.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judgment&lt;/strong&gt; — knowing what to build, what to distrust, what breaks at 2am when a real person does something strange. AI cannot hand you this. You can only earn it by doing the work AI now does for you — and you can only &lt;em&gt;demonstrate&lt;/em&gt; it by catching the AI when it's wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An interview that punishes you for using AI is measuring recall and calling it character. An interview worth passing hands you the AI and measures whether you can overrule it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is the whole reason I build the way I do
&lt;/h2&gt;

&lt;p&gt;I didn't quit AI over one bad interview. It still writes 100% of my code and always will — the typing was never the hard part, it just felt like it was.&lt;/p&gt;

&lt;p&gt;But that call crystallized something I already believed about how these systems should be built. The failure in that room wasn't the AI. It was a process that couldn't tell the difference between &lt;em&gt;using&lt;/em&gt; a tool and &lt;em&gt;being unable to judge its output&lt;/em&gt; — so it optimized for hiding the tool instead of testing the judgment.&lt;/p&gt;

&lt;p&gt;That's precisely the mistake I refuse to build into an agent. I never let the thing that writes the code be the thing that blesses it. There's an author agent that produces the diff, a separate skeptic agent whose only job is to &lt;em&gt;refute&lt;/em&gt; it rather than admire it, and a human on the merge button who can still see the blast radius the model can't. The AI's role is never hidden and never trusted by default — it's made explicit so a human can judge it. That separation between author, skeptic, and human is the entire shape of &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;, the agent platform we build. That interviewer and I were both using AI. The only difference worth hiring for is whether you're honest enough to admit it and sharp enough to overrule it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Honest question for the comments:&lt;/strong&gt; have you ever hidden the fact that you used AI in an interview — or been on the other side of the glass, marking someone down for it? I want to know how common this actually is, because I don't think I hit a rare bug. I think I hit the norm. 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this landed, a ❤️ and a 🔖 help — and tell me the moment you realized the rule was "don't get caught," not "don't use it.")&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Claude Code vs Cursor: 10 Coding Tasks, 2 Very Different Workflows</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Wed, 16 Sep 2026 06:33:39 +0000</pubDate>
      <link>https://dev.to/infoinlet1/claude-code-vs-cursor-a-task-by-task-breakdown-of-which-one-to-actually-reach-for-3km8</link>
      <guid>https://dev.to/infoinlet1/claude-code-vs-cursor-a-task-by-task-breakdown-of-which-one-to-actually-reach-for-3km8</guid>
      <description>&lt;p&gt;"Claude Code or Cursor?" is the wrong question — like asking "terminal or editor?"&lt;/p&gt;

&lt;p&gt;They're both very good, and they're good at &lt;em&gt;different&lt;/em&gt; jobs. If you pick one out of loyalty and use it for everything, you'll spend half your time fighting the tool on the tasks it wasn't built for. So instead of a winner, here's the thing that actually helps: a breakdown by task, so you know which one to reach for and when.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each one actually is
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; — Anthropic's agentic coding tool. It's terminal-first, with a desktop app and IDE extensions (VS Code, JetBrains). Its whole personality is &lt;em&gt;agentic&lt;/em&gt;: you describe an outcome, it plans, edits across many files, runs commands, and iterates. It reads your whole repo, not just the tab you have open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; — an AI-native editor (built on VS Code). Its personality is &lt;em&gt;in-the-flow&lt;/em&gt;: fast Tab autocomplete, tight inline edits, and chat/agent panels a keystroke away. You stay in the editor and the AI meets you there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One is an agent you hand a task to. The other is an editor that makes you faster while you drive. That difference explains almost every "which is better" argument you've ever seen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task by task
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Whole-repo refactors and "just fix this project" → Claude Code
&lt;/h3&gt;

&lt;p&gt;When the change spans a dozen files, or you can only describe the &lt;em&gt;goal&lt;/em&gt; ("migrate this to the new API," "make these modules share one config"), the agentic model wins. Claude Code holds the repo in context and marches file to file. Driving that same change by hand-editing tabs is exactly where an editor-first tool feels like swimming upstream.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fast, local edits and autocomplete → Cursor
&lt;/h3&gt;

&lt;p&gt;Renaming a thing, reshaping a function, filling in the obvious next lines — Cursor's Tab and inline edit are hard to beat for tight, low-latency changes where &lt;em&gt;you&lt;/em&gt; already know what you want and just want it typed. This is the flow-state stuff.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminal / CI / scripting workflows → Claude Code
&lt;/h3&gt;

&lt;p&gt;Because it lives in the terminal, Claude Code is a natural fit for tasks that are really command sequences: run the tests, read the failure, fix, re-run; wire up a script; drive a one-off migration. That loop is native to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explaining unfamiliar code → roughly a tie
&lt;/h3&gt;

&lt;p&gt;Both are strong here. Cursor's edge is that the explanation happens right where you're reading. Claude Code's edge is that it can pull in the &lt;em&gt;rest&lt;/em&gt; of the repo to explain how a file actually connects to everything else. Pick by whether you need local or repo-wide context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing tests → slight edge to Claude Code
&lt;/h3&gt;

&lt;p&gt;Tests usually need to see more than one file (the code under test, its collaborators, existing test patterns). The agentic, whole-repo view tends to produce tests that match your conventions rather than generic ones — though for a single focused unit test in the file you're already in, Cursor is faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where they overlap (and why "just pick one" is tempting)
&lt;/h2&gt;

&lt;p&gt;Chat, ask-about-this-code, generate-a-function, small edits — both do all of it competently. If your work is 90% small, local edits, Cursor alone is a complete setup. If it's 90% multi-file, agentic tasks, Claude Code alone is. Most people are somewhere in the middle, which is why the honest answer is often "both."&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run both without paying twice for the same job
&lt;/h2&gt;

&lt;p&gt;A setup that works well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor as your daily editor&lt;/strong&gt; for the minute-to-minute typing and small edits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code (extension or desktop) for the heavy lifting&lt;/strong&gt; — the big refactor, the "fix the whole project," the test suite, the terminal loops.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're not really competitors in this configuration; they're an editor and an agent, and you switch based on the &lt;em&gt;size and shape&lt;/em&gt; of the task, not brand loyalty.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest caveats — for both
&lt;/h2&gt;

&lt;p&gt;None of this is magic, and it's the same list for either tool:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;They ship subtle bugs with total confidence.&lt;/strong&gt; You review every diff. Non-negotiable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bad prompt, bad code.&lt;/strong&gt; The quality of what you get out tracks the context you put in. "Here's the file, the bug, and what I already tried" beats "fix this."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They make it easy to stop understanding your own codebase.&lt;/strong&gt; The most dangerous failure isn't a wrong line — it's approving a diff you didn't really read because it &lt;em&gt;looked&lt;/em&gt; plausible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That third one is the real reason I don't think "which tool" is the most important question.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually choose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mostly small, local edits, want flow → &lt;strong&gt;Cursor.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Mostly multi-file / agentic / terminal work → &lt;strong&gt;Claude Code.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A real mix (most of us) → &lt;strong&gt;both&lt;/strong&gt;, split by task size.&lt;/li&gt;
&lt;li&gt;Whatever you pick: keep a human who genuinely reads the diff. The tool that writes the code should never be the only thing that blesses it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Disclosure / builder's bias:&lt;/em&gt; I work on &lt;strong&gt;&lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;&lt;/strong&gt; — [FILL: one honest line about what xenition is, e.g. "a layer that separates the agent that writes a change from a second agent that tries to refute it, with a human on the merge"]. So take my "always keep a skeptic on the diff" opinion as coming from someone who builds exactly that. It's a bias; I'd rather name it than hide it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Your turn:&lt;/strong&gt; if you use both, what's the split that actually works for you — and which tool did you &lt;em&gt;stop&lt;/em&gt; forcing into the wrong job? 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this saved you a comparison-tab rabbit hole, a ❤️ and a 🔖 help.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>mentalhealth</category>
      <category>career</category>
    </item>
    <item>
      <title>I deleted every AI tool for 7 days to see if I still know how to code. I didn't.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Tue, 15 Sep 2026 06:44:18 +0000</pubDate>
      <link>https://dev.to/infoinlet1/i-deleted-every-ai-tool-for-7-days-to-see-if-i-still-know-how-to-code-i-didnt-2bc6</link>
      <guid>https://dev.to/infoinlet1/i-deleted-every-ai-tool-for-7-days-to-see-if-i-still-know-how-to-code-i-didnt-2bc6</guid>
      <description>&lt;p&gt;I opened a blank file. No Copilot ghosting the next line. No chat window one alt-tab away. Just me, a cursor, and a feature I've built a hundred times.&lt;/p&gt;

&lt;p&gt;And I sat there. For four minutes. Not thinking about the problem — thinking about how to &lt;em&gt;start&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That was the moment I knew this experiment was going to hurt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule
&lt;/h2&gt;

&lt;p&gt;One week. &lt;strong&gt;No AI in the loop.&lt;/strong&gt; Not "AI-lite." No chat, no autocomplete beyond my editor's dumb built-in, no "just ask it for the boilerplate." If I wanted a Zod schema, I typed the Zod schema. If I forgot the exact &lt;code&gt;Intl.NumberFormat&lt;/code&gt; options, I read the docs like it was 2019.&lt;/p&gt;

&lt;p&gt;Some context on why this was even a question: a month ago I ran the opposite experiment — I let AI write &lt;em&gt;100% of my code&lt;/em&gt; for 30 days and didn't type a line of app logic myself. It shipped a real product. I came out of it using AI for all of my typing, permanently, and I meant it.&lt;/p&gt;

&lt;p&gt;So this wasn't me trying to prove AI is bad. I wanted to know something scarier: &lt;strong&gt;after leaning on it that hard, what had I actually lost?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1–2: the muscle had atrophied
&lt;/h2&gt;

&lt;p&gt;The first thing that broke wasn't knowledge. It was &lt;em&gt;initiative&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I knew how to build the thing. I just wasn't used to being the one who starts the sentence. For a month my whole workflow had been &lt;em&gt;describe → review → approve&lt;/em&gt;. Take that away and you find out you've quietly outsourced the hardest ten seconds of programming: the blank-page moment where you decide the &lt;em&gt;shape&lt;/em&gt; of the solution before a single line exists.&lt;/p&gt;

&lt;p&gt;I could still read anything you put in front of me. Generating from zero felt like speaking a language I only ever listen to now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3–4: my recall was shot — my judgment wasn't
&lt;/h2&gt;

&lt;p&gt;Here's the split that surprised me, and it's the whole point of the piece.&lt;/p&gt;

&lt;p&gt;The thing I lost was &lt;strong&gt;recall.&lt;/strong&gt; Exact API signatures. The flag order. The name of that one array method. Embarrassing amounts of docs-tab-opening for things I "knew." That felt bad in the moment and turned out not to matter at all — it was always cheap knowledge, and good riddance.&lt;/p&gt;

&lt;p&gt;The thing I &lt;em&gt;kept&lt;/em&gt; was &lt;strong&gt;judgment.&lt;/strong&gt; I still knew the billing webhook had to persist before it acknowledged — the exact bug that bit me during the 30-day run. I still smelled the N+1 before I ran the query. I still knew which abstraction would rot in six months. AI never gave me any of that. I earned it &lt;em&gt;before&lt;/em&gt; AI, the slow way, and it stuck.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI erodes your recall fast and your judgment not at all. So the real danger isn't for me. It's for anyone who never got to build the judgment in the first place.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Day 5–7: I got faster, and it got quiet
&lt;/h2&gt;

&lt;p&gt;By day five the initiative came back. Blank files stopped scaring me. I was still slower than AI on raw output — obviously — but something else happened that I didn't expect.&lt;/p&gt;

&lt;p&gt;I understood my own codebase again.&lt;/p&gt;

&lt;p&gt;When AI writes it, you &lt;em&gt;approve&lt;/em&gt; it, and you carry a fuzzy, approximate model of what's actually in there. When you type it, you carry an exact one. I caught two design mistakes that week purely because the whole system was genuinely in my head instead of sitting in a diff I'd skimmed and blessed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable synthesis
&lt;/h2&gt;

&lt;p&gt;There are two skills hiding inside the word "coding," and we've been treating them as one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recall&lt;/strong&gt; — remembering the syntax, the API, the incantation. AI makes this obsolete, and I'm glad. This was never the valuable part.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judgment&lt;/strong&gt; — knowing what to build, what to distrust, what breaks at 2am. AI cannot give you this. You can only earn it by doing the work AI now does for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trap isn't that AI makes us dumber. It's that it removes the exact practice reps that used to &lt;em&gt;build&lt;/em&gt; the judgment — the scaffolding, the boilerplate, the wrong first draft you had to debug — and it removes them so smoothly you never notice the ladder is gone until you reach for a rung and there's nothing there.&lt;/p&gt;

&lt;p&gt;That's the same conclusion my 30-day experiment landed on from the other direction. Letting AI do everything showed me it had replaced the &lt;em&gt;junior work&lt;/em&gt;. Turning AI off showed me &lt;em&gt;why that matters&lt;/em&gt;: the junior work was never busywork. It was the gym where judgment gets built.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually changed
&lt;/h2&gt;

&lt;p&gt;I didn't quit AI. It still types 100% of my code and always will — the typing was never the hard part, it just felt like it was.&lt;/p&gt;

&lt;p&gt;What I added is one small ritual: &lt;strong&gt;once a week I open a blank file with everything turned off, on purpose.&lt;/strong&gt; Not because I need to ship it by hand. Because the day I &lt;em&gt;can't&lt;/em&gt; start from zero is the day I stopped being the engineer and became the guy who approves things — and an approver who can't tell right from plausible is just a rubber stamp with a job title.&lt;/p&gt;

&lt;p&gt;It's also why, when I build agents, I never let the thing that writes the code be the thing that blesses it. An author agent, a separate skeptic agent whose only job is to &lt;em&gt;refute&lt;/em&gt; the diff, and a human on the merge button who can still see the blast radius the model can't. That last seat — the human judgment one — is precisely the thing seven days off reminded me you can't automate away, because you can't automate the reps that build it either. That separation is the whole shape of how we build &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;, and a week coding blind is the only stress test I trust for it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;So, honest question for the comments:&lt;/strong&gt; when's the last time you wrote real code with &lt;em&gt;everything&lt;/em&gt; turned off — no chat, no autocomplete, nothing? And be honest about how it actually felt. Because I think how uncomfortable that answer is might be the most important metric none of us are tracking. 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this was worth your time, a ❤️ and a 🔖 help — and tell me the moment you realized you'd forgotten something you "knew.")&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>Green tests are lying to you.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Mon, 14 Sep 2026 08:25:43 +0000</pubDate>
      <link>https://dev.to/infoinlet1/green-tests-are-lying-to-you-2d9n</link>
      <guid>https://dev.to/infoinlet1/green-tests-are-lying-to-you-2d9n</guid>
      <description>&lt;p&gt;There's a reflex every engineer has, and I had it for a decade: the test suite goes green and my shoulders drop. Green means safe. Green means ship. Green means someone checked.&lt;/p&gt;

&lt;p&gt;That reflex is now wrong, and it took 30 days of letting AI write 100% of my code to see exactly how wrong.&lt;/p&gt;

&lt;p&gt;Here's the sentence I want you to sit with: &lt;strong&gt;a passing test proves your code agrees with your test. It has never proved your code is correct.&lt;/strong&gt; Those were the same thing for years — but only by accident, and the accident just ended.&lt;/p&gt;

&lt;p&gt;This isn't a hype post and it isn't a doom post. It's about why the most trusted signal in your CI pipeline quietly stopped meaning what you think it means.&lt;/p&gt;

&lt;h2&gt;
  
  
  What green used to mean
&lt;/h2&gt;

&lt;p&gt;For most of software history, a passing test carried a hidden second signal you never had to think about: &lt;strong&gt;a human, at some point, wrote that test on purpose.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even when the same person wrote the code and the test, there was a gap in time and attention between the two acts. You wrote the function believing one thing, then you sat down later — different mindset, slightly more skeptical, sometimes after lunch, sometimes after a bug — and tried to pin down what "correct" meant. The test was a second pass by a second version of you. Not a perfect check. But a real one, because the person writing the assertion was at least &lt;em&gt;trying&lt;/em&gt; to catch the person who wrote the code.&lt;/p&gt;

&lt;p&gt;Green meant: two attempts, made at different times, agreed. That's a weak form of independence, but it's genuine, and it's the entire reason the green checkmark ever earned your trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  What green means now
&lt;/h2&gt;

&lt;p&gt;When AI writes the code, it also writes the test. And it writes both in the same pass, from the same context window, holding the same mental model of what the code is supposed to do.&lt;/p&gt;

&lt;p&gt;There is no second version. There is no gap in time or attention. The thing that decided what "correct" means is the exact same thing that decided what the code does — in the same breath, from the same prior.&lt;/p&gt;

&lt;p&gt;So when the test passes, it's telling you something real. It's just not the thing you think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The test doesn't confirm the code is correct. It confirms the code matches the assumption the model already had when it wrote the code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If that assumption was right, green means right. If that assumption was &lt;strong&gt;wrong&lt;/strong&gt;, the model writes wrong code, then writes a test that asserts the wrong behavior is the expected behavior — and the test passes, bright green, confirming the bug as a feature.&lt;/p&gt;

&lt;p&gt;The test isn't checking the code. It's a mirror held up to the code's own assumptions. And a mirror never disagrees with you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The exam nobody proctored
&lt;/h2&gt;

&lt;p&gt;The cleanest way I can put it: the model is a student who writes its own exam, takes its own exam, and grades its own exam — all in one sitting, from one understanding of the material.&lt;/p&gt;

&lt;p&gt;Of course it passes. It would be shocking if it didn't. But "the student passed the exam it wrote for itself" tells you the student is &lt;strong&gt;consistent.&lt;/strong&gt; It tells you nothing about whether the student understands the subject. Consistency and correctness feel identical right up until the moment the student's understanding is wrong — and then they diverge completely, silently, with a 100% score stapled on top.&lt;/p&gt;

&lt;p&gt;Green tests measure &lt;em&gt;"did I build what I intended?"&lt;/em&gt; They have never once measured &lt;em&gt;"was my intention correct?"&lt;/em&gt; We got away with conflating those two questions for years because a human's intention was checked by other humans — in review, in production, in the 2am page. Hand both the intention and the verification to the same model and the conflation isn't a shortcut anymore. It's the whole failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that ran green all the way to production
&lt;/h2&gt;

&lt;p&gt;Let me make this concrete, because it's not hypothetical — it cost a version of me real trust.&lt;/p&gt;

&lt;p&gt;During my 30-day experiment, the AI wrote a Stripe webhook handler. It acknowledged the event — returned &lt;code&gt;200&lt;/code&gt; to Stripe — and &lt;em&gt;then&lt;/em&gt; persisted the row to the database. Ack first, write second.&lt;/p&gt;

&lt;p&gt;The tests were green. All of them. The model wrote a test that fired a webhook, asserted a &lt;code&gt;200&lt;/code&gt; came back, and asserted the happy-path row got written. Textbook. Beautiful coverage numbers.&lt;/p&gt;

&lt;p&gt;But look at what the test &lt;em&gt;couldn't&lt;/em&gt; assert, because the model that wrote it didn't believe there was anything to assert: &lt;strong&gt;what happens if the database blips in the gap between the ack and the write?&lt;/strong&gt; In production, that gap is real. One hiccup and you've told Stripe "got it, we're done" while your own database never heard about the payment. The result is a paying customer with access to nothing and no record they ever paid. Stripe considers it delivered. You have no idea it happened.&lt;/p&gt;

&lt;p&gt;The test didn't miss this because it was a bad test. It missed it because it was written by the same mind that thought ack-before-persist was clean. You cannot write an assertion against a failure mode you don't believe exists. The green checkmark wasn't a lie about the code. It was an honest report of a wrong belief.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let me be fair to the tests
&lt;/h2&gt;

&lt;p&gt;I'm not telling you to delete your test suite. That would be the doom-post version of this, and it's just as wrong as the hype.&lt;/p&gt;

&lt;p&gt;Tests written this way are still genuinely good at one thing: &lt;strong&gt;catching the code from drifting away from itself later.&lt;/strong&gt; Regression is a real category of bug — you change one thing, something three files over quietly breaks — and a green-agrees-with-green suite catches exactly that, cheaply, forever. That's worth a lot. I run more tests now than I ever did, not fewer.&lt;/p&gt;

&lt;p&gt;What I stopped doing is treating green as a verdict. Green is a &lt;em&gt;consistency check.&lt;/em&gt; It proves today's code still agrees with the day it was written. It cannot, structurally, tell you whether the day it was written was already wrong. Those are different jobs, and the green checkmark only ever did one of them. We just never had to notice, because a human used to do the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes green mean something again
&lt;/h2&gt;

&lt;p&gt;The fix is the same structural move I keep landing on, and it's not "write better tests." It's &lt;strong&gt;who writes the test.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A test only checks an assumption when it's written by something that &lt;em&gt;doesn't already hold that assumption.&lt;/em&gt; So you buy that separation deliberately, in three places:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A different author for the assertion than for the code.&lt;/strong&gt; Not "write tests" bolted onto the same agent in the same pass — a separate reviewer whose entire job is to write the test the author would never think to write, because the author can't see the state that would break it. The test that asserts the row exists &lt;em&gt;after a simulated DB failure between ack and write.&lt;/em&gt; That test only gets written by something looking for the failure, not confirming the success.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A different frame.&lt;/strong&gt; Stop generating tests that ask "does the happy path work?" It always does. Generate the ones that ask "produce the input that loses a customer money, then assert we don't." A test hunting a specific failure is worth ten that bless the demo. Same model, completely different output — because the objective, not the model, is what's doing the checking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A human on the merge who's been burned.&lt;/strong&gt; Some failure modes don't live in any prompt because they live in someone's scar tissue — the memory of the 2am reconciliation, the paged-at-3am dual-write nightmare. That person reads ack-before-persist and goes pale in five minutes. No coverage number produces that flinch. It has to be lived.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stack those and green starts meaning something again, because now a bug has to survive a test it didn't get to write, a frame built to break it, and a human who's paid for it before. Any one of those alone, and the checkmark is decoration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structure, not the prediction
&lt;/h2&gt;

&lt;p&gt;Here's what I actually believe after 30 days of watching green tests pass over landmines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A test written in the same pass as the code checks consistency, never correctness.&lt;/li&gt;
&lt;li&gt;To check correctness, the assertion has to come from something that doesn't share the code's assumptions.&lt;/li&gt;
&lt;li&gt;And a human owns the merge, because the assumption most likely to be wrong is the one nobody — no model, no test — thought to question.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not a claim about which model wins. It's a structure, and it holds whether the author is today's model or GPT-9, because it doesn't depend on the model being good. It depends on the check failing &lt;em&gt;differently&lt;/em&gt; than the thing it checks.&lt;/p&gt;

&lt;p&gt;It's also, not coincidentally, exactly how we build &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;: an agent that does the work, a &lt;em&gt;different&lt;/em&gt; agent whose job is to write the test that breaks it, and a person who owns the merge. I didn't arrive at that from a thesis. I arrived at it from watching a suite go fully green over a webhook that quietly loses paying customers.&lt;/p&gt;

&lt;p&gt;"All tests passing" is the beginning of review. It has never been the end of it. We just had a human quietly doing the rest, and we called it green.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Three questions I'd genuinely like answered in the comments:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does your AI-generated test suite get written by the &lt;em&gt;same&lt;/em&gt; agent, in the same pass, as the code it tests? Have you ever measured what a separate adversarial test-writer catches that it doesn't?&lt;/li&gt;
&lt;li&gt;What's a bug you've shipped with 100% green tests — the one where the test and the code were wrong in the exact same way?&lt;/li&gt;
&lt;li&gt;If tests only prove consistency now, what's the signal you &lt;em&gt;actually&lt;/em&gt; trust before you merge — and where does it come from?&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>I made two AIs review each other's code for 30 days. A human still caught the bug in 5 minutes.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Sun, 13 Sep 2026 04:33:36 +0000</pubDate>
      <link>https://dev.to/infoinlet1/i-made-two-ais-review-each-others-code-for-30-days-a-human-still-caught-the-bug-in-5-minutes-484a</link>
      <guid>https://dev.to/infoinlet1/i-made-two-ais-review-each-others-code-for-30-days-a-human-still-caught-the-bug-in-5-minutes-484a</guid>
      <description>&lt;p&gt;Last month I let AI write 100% of my code for 30 days. The single loudest lesson wasn't "AI is amazing" or "AI is useless." It was one sentence: &lt;strong&gt;the thing that writes the code can never be the thing that reviews it.&lt;/strong&gt; A model grades its own homework and it always passes.&lt;/p&gt;

&lt;p&gt;So this month I did the obvious next experiment. If the author can't be the reviewer — fine. &lt;strong&gt;Make a second AI the reviewer.&lt;/strong&gt; Author agent writes the feature. A separate skeptic agent tries to tear it apart. No human in the review loop at all, on purpose, to find out how far the structure alone could carry me.&lt;/p&gt;

&lt;p&gt;It worked far better than I expected. Right up until the one moment it mattered most.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Two agents, deliberately given different jobs — because I'd already learned the hard way that "independence" is not a second prompt to the same model asking &lt;em&gt;"is this correct?"&lt;/em&gt; It just agrees with itself in a calmer voice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The author&lt;/strong&gt; got the normal brief: build the feature, make the tests pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The skeptic&lt;/strong&gt; got an adversarial brief, never a blessing brief. Not "review this diff." Instead: &lt;em&gt;"Assume this is broken. Produce the input that loses a customer money. Find the thing that already exists that this reimplements. Find the state nobody designed for."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different frame, different objective. A grader looks for reasons to say yes; a skeptic hunting for the failure looks for the one input that breaks it. That gap is the whole reason the second agent is worth its tokens.&lt;/p&gt;

&lt;p&gt;I logged everything for 30 days. Every issue the skeptic caught, every issue it missed that I caught in my own final read, every false alarm. 41 real issues that a competent reviewer should have caught. Here's the honest scoreboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the skeptic caught — 38 of 41, and some of them impressed me
&lt;/h2&gt;

&lt;p&gt;This is the part that surprised me, so let me be fair to the machine first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture drift, gone.&lt;/strong&gt; The author wrote a second &lt;code&gt;formatCurrency&lt;/code&gt; because it didn't know the first existed. The skeptic, pointed at the whole diff and told to &lt;em&gt;"find what this reimplements,"&lt;/em&gt; caught it in one pass. Same with an inline auth check that duplicated my middleware, and a subtly-different &lt;code&gt;User&lt;/code&gt; type in a new module. The stuff that compiles, passes, and quietly rots your codebase — the skeptic was genuinely good at it, better than a tired human at 6pm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Swallowed errors, flagged.&lt;/strong&gt; The author's instinct is to wrap everything in &lt;code&gt;try/catch&lt;/code&gt; and move on. The skeptic's adversarial frame — &lt;em&gt;"what failure does this hide?"&lt;/em&gt; — caught the catch blocks that logged and continued as if nothing happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A real race condition.&lt;/strong&gt; Two requests, one counter, no lock. The author never sees it because it works every time in testing. The skeptic reasoned about concurrent callers because I'd told it to assume the worst input, and the worst input is &lt;em&gt;two of them at once.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If I'd stopped here I'd be writing the "you don't need human reviewers anymore" post. Eight of nine break-classes from last month's experiment, caught by a machine, for pennies. Then I looked at the three it missed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three it missed were the same species
&lt;/h2&gt;

&lt;p&gt;All three survivors were the same kind of bug: &lt;strong&gt;a silent data-integrity failure on the unhappy path.&lt;/strong&gt; The flagship was one you've heard me tell before, because it keeps happening and it keeps being the one that matters.&lt;/p&gt;

&lt;p&gt;The author wrote a Stripe webhook handler that &lt;strong&gt;acknowledged the event before persisting it.&lt;/strong&gt; Return &lt;code&gt;200&lt;/code&gt; to Stripe, then write the row. Works flawlessly in every test. In production, one database blip between the ack and the write = a paying customer with access to nothing and no record they ever paid. Stripe considers it delivered. Your DB never heard about it.&lt;/p&gt;

&lt;p&gt;I fed that exact handler to the skeptic, with its adversarial brief, and asked it to find the input that loses a customer money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It approved it.&lt;/strong&gt; Confidently. It even praised the "clean early acknowledgement to keep webhook latency low."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it missed it — the part that changed how I build
&lt;/h2&gt;

&lt;p&gt;Here's the thing I actually want you to take away, because it's not "the AI wasn't smart enough."&lt;/p&gt;

&lt;p&gt;The author and the skeptic are the &lt;strong&gt;same model family.&lt;/strong&gt; Same training distribution, same instincts, same idea of what "clean webhook code" looks like. The author thought ack-before-persist was fine. And when I handed that code to the skeptic, the skeptic &lt;strong&gt;shared the exact mental model that thought it was fine.&lt;/strong&gt; It didn't refute the blind spot. It re-derived it, in a more confident voice, and called it a strength.&lt;/p&gt;

&lt;p&gt;That's not a review. That's an echo with better manners.&lt;/p&gt;

&lt;p&gt;"Author ≠ reviewer" is necessary. It is not sufficient. If both agents reason from the same prior, the second one isn't a check — it's the first one wearing a lab coat. Point them both at a bug that lives &lt;em&gt;inside&lt;/em&gt; their shared blind spot and they will agree, twice, and hand you a green checkmark over a landmine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then a human caught it in five minutes
&lt;/h2&gt;

&lt;p&gt;I gave the same handler to a senior engineer. No special prompt, no framing. She read it, went slightly pale, and said: &lt;em&gt;"it acks before it writes — I got paged for exactly this in 2021, it's a nightmare to reconcile."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Five minutes. And notice &lt;strong&gt;why.&lt;/strong&gt; It wasn't that she was smarter than the model, or reasoned more carefully. She'd been &lt;em&gt;burned.&lt;/em&gt; She had scar tissue the model doesn't have and can't get, because you can't train the memory of a 2am reconciliation into a context window. The model has read a million descriptions of the dual-write problem. She has &lt;em&gt;lived&lt;/em&gt; one. Those are not the same knowledge, and the difference is the entire margin.&lt;/p&gt;

&lt;p&gt;That's the missing rung again, by the way — the one I keep coming back to. The reason she could catch it is that early in her career she shipped something like it and paid for it. If AI does all the entry-level work, nobody accumulates that scar tissue, and then nobody can catch the bug that the two agents will keep waving through. The skeptic and the senior aren't interchangeable. One pattern-matches on everything it's read; the other remembers what hurt.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually buys independence
&lt;/h2&gt;

&lt;p&gt;So the second agent isn't useless — it caught 38 of 41, and I'd never ship without it now. But the experiment taught me exactly where its ceiling is, and how to raise it. Independence isn't a second seat. It's &lt;strong&gt;divergence,&lt;/strong&gt; and you can buy it in three places:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A different model family.&lt;/strong&gt; Different training distribution, different blind spots. The single cheapest way to stop the reviewer from sharing the author's delusion. This one change would have caught the webhook — a model trained on different data doesn't necessarily think ack-before-persist is clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A different frame.&lt;/strong&gt; Don't ask "is this correct?" (it agrees). Give it a job it can only do by finding the failure: &lt;em&gt;"assume this loses money; produce the transaction that does it."&lt;/em&gt; A skeptic hunting a specific failure beats a grader blessing the happy path even from the same weights. This is what got me to 38.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A human with scar tissue on the merge button.&lt;/strong&gt; Not to out-code the machine — the machine out-codes the human. To hold the one thing neither agent has: the memory of having been burned by exactly this before.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stack all three and the blind spot has nowhere to hide, because a bug has to survive a different model, an adversarial objective, &lt;em&gt;and&lt;/em&gt; a human who's paid for it before. Any one of those alone, and the landmine ships with a green check on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structure, earned instead of asserted
&lt;/h2&gt;

&lt;p&gt;Last month I &lt;em&gt;asserted&lt;/em&gt; this structure. This month I have the log that proves it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The thing that writes the code can't be the thing that reviews it.&lt;/li&gt;
&lt;li&gt;The thing that reviews the code can't share the writer's mental model, or it reviews nothing — it re-derives.&lt;/li&gt;
&lt;li&gt;And a human owns the merge, because the one bug that survives two agents is precisely the one that requires having lived it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not a prediction about which model wins. It's a structure, and it holds whether the author is today's model or something we haven't built yet — because it doesn't depend on the model being good. It depends on the model being &lt;strong&gt;checked by something that fails differently than it does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's also, not coincidentally, exactly how we build &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;: an agent that does the work, a &lt;em&gt;different&lt;/em&gt; agent that tries to tear it down, and a person who owns the merge. I didn't arrive at that from a thesis. I arrived at it from 30 days of watching two AIs agree with each other over a bug a human spotted in five minutes.&lt;/p&gt;

&lt;p&gt;The two-agent setup caught 38 of 41. The 39th is why there's still a person on the merge button — and why there needs to keep being one who's been burned.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Four questions I'd genuinely like answered in the comments:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you run an AI reviewer, is it the &lt;em&gt;same&lt;/em&gt; model as your author? Have you ever measured what it catches versus a different family?&lt;/li&gt;
&lt;li&gt;What's your "I got paged for exactly this in 2021" bug — the one you'd catch in five minutes that a model waves through every time?&lt;/li&gt;
&lt;li&gt;Has anyone A/B'd "review this diff" against an adversarial frame ("find the input that loses money") on the same code? I'd love numbers.&lt;/li&gt;
&lt;li&gt;Where does the next reviewer's scar tissue come from, if the entry-level work that used to grow it is the first thing we automated?&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>I read 500 'AI will replace developers' posts. They all make the same 3 mistakes.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Sat, 12 Sep 2026 05:51:11 +0000</pubDate>
      <link>https://dev.to/infoinlet1/i-read-500-ai-will-replace-developers-posts-they-all-make-the-same-3-mistakes-3819</link>
      <guid>https://dev.to/infoinlet1/i-read-500-ai-will-replace-developers-posts-they-all-make-the-same-3-mistakes-3819</guid>
      <description>&lt;p&gt;Last month I spent 30 days letting AI write 100% of my code — a real SaaS, in production, no line of app code typed by me. Then I did the thing you're supposed to do after an experiment: I went and read what everyone else thinks is happening.&lt;/p&gt;

&lt;p&gt;So I read the discourse. Not a few hot takes — I went deep, hundreds of posts, threads, and "the end of programming" essays, from both camps. The breathless "developers are obsolete by Christmas" crowd and the smug "AI is a stochastic parrot that can't count the r's in strawberry" crowd.&lt;/p&gt;

&lt;p&gt;Here's the strange part. They agree on almost nothing — except they all make the &lt;strong&gt;same three mistakes.&lt;/strong&gt; And once you see the three, you can't unsee them, because every prediction in your feed is built on at least one.&lt;/p&gt;

&lt;p&gt;This isn't a hype post and it isn't a doom post. It's a post about why almost every hype post &lt;em&gt;and&lt;/em&gt; every doom post is wrong for the exact same reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1: Arguing about "can AI write code?" when that was never the bottleneck
&lt;/h2&gt;

&lt;p&gt;Every post, on both sides, is secretly an argument about code &lt;em&gt;generation.&lt;/em&gt; The optimists show a model one-shotting a working app. The pessimists show a model hallucinating an API that doesn't exist. Both think they're arguing about the future of the profession.&lt;/p&gt;

&lt;p&gt;They're arguing about typing.&lt;/p&gt;

&lt;p&gt;Here's what 30 days of AI writing everything taught me: &lt;strong&gt;the typing was never the hard part. It just felt like it was.&lt;/strong&gt; The AI wrote my CRUD, my Zod schemas, my scaffolding — flawlessly, faster than I ever could. And it changed my output by maybe 20%, because writing the code was 20% of the job. The other 80% was knowing &lt;em&gt;which&lt;/em&gt; code, knowing when it was subtly wrong, and knowing what not to build at all.&lt;/p&gt;

&lt;p&gt;So when someone benchmarks a model on "can it produce a working function," they're measuring the one part of engineering that was already the least of our problems. It's like judging a surgeon on how fast they can make an incision. Speed at the easy part tells you almost nothing about the hard part.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The whole "will AI replace developers" debate is conducted in the units of the thing that mattered least.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Mistake 2: Treating the skill ladder as a fixed object
&lt;/h2&gt;

&lt;p&gt;This is the one that actually matters, and nobody prices it in.&lt;/p&gt;

&lt;p&gt;The optimist's argument: "Juniors + AI will be as productive as seniors, so we'll need fewer seniors and everyone levels up." The pessimist's argument: "AI does junior work, so junior jobs vanish and it's a bloodbath." Both of them are standing on the same hidden assumption — that the ladder from junior to senior &lt;em&gt;stays where it is&lt;/em&gt; while AI rearranges who stands on which rung.&lt;/p&gt;

&lt;p&gt;But the ladder is made of the work. You become a senior by doing ten thousand hours of exactly the work AI is now absorbing: the scaffolding, the boilerplate, the confident-but-wrong first draft you learn to distrust by being burned. That's not busywork you graduate past. That's the &lt;em&gt;curriculum.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;AI didn't replace me in my experiment. It replaced the tasks I used to hand to juniors — which means it didn't flatten the hierarchy, it &lt;strong&gt;sawed off the bottom rungs while making the top rungs more valuable.&lt;/strong&gt; The static-ladder crowd is arguing about who gets to climb. The real question is who's going to build the rungs now that the thing that used to build them for free is gone.&lt;/p&gt;

&lt;p&gt;You can't skip the 10,000 hours. You can only move where they're spent. And right now the industry is quietly deleting the place they used to be spent and assuming the seniors will keep appearing anyway, the way electricity keeps coming out of the wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 3: Benchmarking on the demo instead of on 2am
&lt;/h2&gt;

&lt;p&gt;Every prediction — hype and doom alike — extrapolates from a &lt;em&gt;demo.&lt;/em&gt; The optimist's demo: watch it build a todo app in 90 seconds. The pessimist's demo: watch it fail a riddle. Both are the happy path. Both are the moment of the screenshot.&lt;/p&gt;

&lt;p&gt;Production is not the screenshot. Production is 2am, a real user doing something weird, a database blip, a double-clicked button, an empty state nobody designed.&lt;/p&gt;

&lt;p&gt;In my 30 days the scariest thing the AI wrote wasn't code that crashed — it was code that &lt;em&gt;ran.&lt;/em&gt; A Stripe webhook that acknowledged events before persisting them. Flawless in every test. In production, one DB blip = a paying customer with no access and no record they ever paid. It passed its own tests, because the model wrote tests that agreed with its own wrong mental model. "It compiles and the tests are green" is where the demo ends and where the real work &lt;em&gt;begins.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So when a post predicts the future by pointing at a demo, it's making a claim about the 10% that's easy and staying silent about the 90% that's hard. &lt;strong&gt;"It ran" is not "it worked."&lt;/strong&gt; Every extrapolation from a demo to a profession quietly swaps one for the other, and hopes you won't notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The synthesis: stop predicting, start structuring
&lt;/h2&gt;

&lt;p&gt;Here's what I actually believe after 30 days of building and 500 posts of reading.&lt;/p&gt;

&lt;p&gt;"Will AI replace developers?" is an unanswerable, and frankly boring, question. It's astrology for engineers. The useful question is structural, and it's answerable today:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What has to be true for AI's output to be trustworthy?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My 30 days gave me the answer, and it has nothing to do with which model wins. The thing that writes the code can never be the thing that reviews it — a model grades its own homework and always passes. You need a &lt;em&gt;separate&lt;/em&gt; reviewer whose entire job is to refute the diff, not bless it. You need a human on the merge button who can see the blast radius the model can't. Author here, skeptic there, human owning the decision.&lt;/p&gt;

&lt;p&gt;That's not a prediction. It's a structure. And it's the same structure whether the model is GPT-9 or something we haven't built yet, because it doesn't depend on the model being good — it depends on the model being &lt;em&gt;checked.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's also, not coincidentally, exactly how we build &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;: an agent that does the work, a different agent that tries to tear it down, and a person who owns the merge. I didn't arrive at that from a thesis. I arrived at it from 9 logged breaks on a real build, every one of which was the model waving through its own mistake.&lt;/p&gt;

&lt;p&gt;The doomers and the hypers are both waiting to find out who wins. The people shipping are busy building the structure that makes it not matter.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;So, honest question for the comments:&lt;/strong&gt; which of the three mistakes have &lt;em&gt;you&lt;/em&gt; caught yourself making? I made all three before the experiment beat them out of me — the demo one twice. 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this reframed the argument for you even a little, a ❤️ and a 🔖 help more than you'd think.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>I let AI write 100% of my code for 30 days. Here's what broke.</title>
      <dc:creator>Info Inlet</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:08:18 +0000</pubDate>
      <link>https://dev.to/infoinlet1/i-let-ai-write-100-of-my-code-for-30-days-heres-what-broke-1aa0</link>
      <guid>https://dev.to/infoinlet1/i-let-ai-write-100-of-my-code-for-30-days-heres-what-broke-1aa0</guid>
      <description>&lt;p&gt;Not "AI-assisted." Not "copilot suggestions I edited." I mean I made a rule: &lt;strong&gt;for 30 days, I don't type application code. The AI does. My job is to describe, review, and approve.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I shipped a real product this way — a small SaaS with auth, Stripe billing, a dashboard, and a public API. It works. It's in production. And along the way I found out exactly where the "AI writes everything now" dream holds up and where it quietly falls apart.&lt;/p&gt;

&lt;p&gt;This isn't a hype post and it isn't a doom post. It's a field report.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules
&lt;/h2&gt;

&lt;p&gt;To keep myself honest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I don't write application logic by hand. I prompt, the AI writes.&lt;/li&gt;
&lt;li&gt;I &lt;em&gt;can&lt;/em&gt; read every line, reject it, and ask again — but I can't fix it myself in the editor.&lt;/li&gt;
&lt;li&gt;Config, secrets, and "click the button in the dashboard" steps are mine (the AI can't do those anyway).&lt;/li&gt;
&lt;li&gt;If I get truly stuck for more than an hour, I log it as a "break" and write the code myself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By the end I had &lt;strong&gt;9 logged breaks.&lt;/strong&gt; Those breaks are the interesting part.&lt;/p&gt;

&lt;h2&gt;
  
  
  What worked shockingly well
&lt;/h2&gt;

&lt;p&gt;Let me be fair to the machine first, because a lot of this genuinely surprised me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Greenfield scaffolding is basically solved.&lt;/strong&gt; "Set up a Next.js app with Postgres, Drizzle, and auth" — done, correctly, in one shot. The first 40% of the project flew by faster than I've ever built anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boilerplate it never gets wrong.&lt;/strong&gt; CRUD endpoints, form validation, Zod schemas, a table component with sorting and pagination. This is the stuff I hate writing and it produced it perfectly, every time, no notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's a phenomenal rubber duck.&lt;/strong&gt; "Why is this query slow?" got me a better answer than I'd have reasoned to alone — it spotted a missing index and an N+1 in the same breath.&lt;/p&gt;

&lt;p&gt;For the first week I genuinely thought I'd write the "developers are obsolete" post. Then week two happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke — the 9 breaks, honestly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Break 1–3: It can't hold the &lt;em&gt;whole system&lt;/em&gt; in its head
&lt;/h3&gt;

&lt;p&gt;The AI is brilliant at the file in front of it and blind to the one three folders over. It happily wrote a second &lt;code&gt;formatCurrency&lt;/code&gt; helper because it didn't know the first one existed. It re-implemented my auth check inline instead of using the middleware I already had. It introduced a subtly different &lt;code&gt;User&lt;/code&gt; type in a new module.&lt;/p&gt;

&lt;p&gt;None of these are "bugs" — everything compiled, everything passed. They're &lt;strong&gt;architecture drift.&lt;/strong&gt; And architecture drift is invisible until the day it costs you a week.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The AI optimizes locally. Coherence across a system is still a human job.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Break 4–5: It confidently writes plausible, wrong code
&lt;/h3&gt;

&lt;p&gt;The scariest failures weren't crashes. They were code that &lt;em&gt;looked&lt;/em&gt; right and ran fine on the happy path.&lt;/p&gt;

&lt;p&gt;The billing webhook handler it wrote acknowledged Stripe events before persisting them. Works perfectly in testing. In production, a DB blip = a paid customer with no access and no record. I only caught it because I've been burned by exactly this before. &lt;strong&gt;A junior copying this AI's output would not have caught it.&lt;/strong&gt; That's the part that keeps me up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Break 6: Debugging its own code is a loop of despair
&lt;/h3&gt;

&lt;p&gt;When something broke that the AI couldn't see, asking it to fix it produced &lt;em&gt;changes&lt;/em&gt;, not &lt;em&gt;fixes&lt;/em&gt;. It would confidently rewrite the function, swear the bug was gone, and reintroduce it two prompts later. Without the ability to drop into the debugger &lt;em&gt;myself&lt;/em&gt; and actually understand the state, we'd have spun forever. This was the single biggest time sink of the month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Break 7–8: Taste, and saying "no, less"
&lt;/h3&gt;

&lt;p&gt;Asked for a settings page, it gave me 14 options no user asked for. Asked for error handling, it wrapped everything in try/catch and swallowed the errors. The AI's instinct is to &lt;em&gt;add&lt;/em&gt;. Knowing what to leave out — the actual product-design part of engineering — it has none of.&lt;/p&gt;

&lt;h3&gt;
  
  
  Break 9: The last 10% is still 90% of the work
&lt;/h3&gt;

&lt;p&gt;Getting to "demo works" took a week. Getting to "handles a real user doing something weird at 2am" took the other three. Edge cases, race conditions, the empty state, the error state, the "what if they double-click" state — the AI does none of this unless you &lt;em&gt;know to ask&lt;/em&gt;, and knowing to ask &lt;strong&gt;is the job.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable synthesis
&lt;/h2&gt;

&lt;p&gt;Here's what I actually believe after 30 days:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI didn't replace me. It replaced the *tasks I used to give juniors.&lt;/strong&gt;* The scaffolding, the boilerplate, the first draft — that's exactly the work a junior learns on. And that's the real problem nobody's pricing in: if the AI does all the entry-level work, &lt;strong&gt;where does the next senior come from?&lt;/strong&gt; You can't skip the 10,000 hours; you can only move where they're spent.&lt;/p&gt;

&lt;p&gt;The skill that mattered every single day wasn't writing code. It was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Knowing the code it gave me was subtly wrong.&lt;/li&gt;
&lt;li&gt;Knowing what to &lt;em&gt;not&lt;/em&gt; build.&lt;/li&gt;
&lt;li&gt;Holding the whole system in my head so I could catch the drift.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are all &lt;strong&gt;senior&lt;/strong&gt; skills. Which means AI didn't flatten the hierarchy — it made the top of it more valuable and kicked away the ladder to get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually changed
&lt;/h2&gt;

&lt;p&gt;I didn't stop using AI — I use it for 100% of the &lt;em&gt;typing&lt;/em&gt; now and always will. I changed the guardrails around it, and every one of them maps to a break above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The thing that writes the code is &lt;strong&gt;never&lt;/strong&gt; the thing that reviews it. A separate reviewer, prompted to &lt;em&gt;refute&lt;/em&gt; the diff, catches the plausible-but-wrong code the author will always wave through.&lt;/li&gt;
&lt;li&gt;Nothing merges without a human who can see the blast radius the model can't.&lt;/li&gt;
&lt;li&gt;"It compiles and the tests pass" is the &lt;em&gt;start&lt;/em&gt; of review, not the end — because the model will write tests that agree with its own wrong mental model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation — author here, skeptic there, human on the merge button — is the whole reason I could hand the typing to a machine and still sleep. It's also, not coincidentally, exactly how we build &lt;a href="https://xenition.com" rel="noopener noreferrer"&gt;xenition&lt;/a&gt;: agents that do the work, a different agent that tries to tear it down, and a person who owns the decision. Dogfooding that on a real 30-day build is the only benchmark I trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Would I do it again?
&lt;/h2&gt;

&lt;p&gt;For a prototype? In a heartbeat — I'd never scaffold by hand again.&lt;/p&gt;

&lt;p&gt;For production? I'll use AI for 100% of the &lt;em&gt;typing&lt;/em&gt; and 0% of the &lt;em&gt;thinking&lt;/em&gt;. The typing was never the hard part. It just felt like it was.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;So, honest question for the comments:&lt;/strong&gt; if AI is doing the junior work, how does your team plan to grow the next generation of seniors? Because I don't think "they'll figure it out" is an answer anymore. 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If this was worth your time, a ❤️ and a 🔖 help — and tell me your worst "the AI wrote something that looked totally fine" story below.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
  </channel>
</rss>
