<?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: Gil Zilberfeld</title>
    <description>The latest articles on DEV Community by Gil Zilberfeld (@testingil).</description>
    <link>https://dev.to/testingil</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%2F4065719%2F5d44e120-5e4a-4ae4-ae55-1fbffc2898d4.png</url>
      <title>DEV Community: Gil Zilberfeld</title>
      <link>https://dev.to/testingil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/testingil"/>
    <language>en</language>
    <item>
      <title>In a Few Weeks, I Won't Know How My Own App Works</title>
      <dc:creator>Gil Zilberfeld</dc:creator>
      <pubDate>Wed, 09 Sep 2026 12:53:49 +0000</pubDate>
      <link>https://dev.to/testingil/in-a-few-weeks-i-wont-know-how-my-own-app-works-4eg</link>
      <guid>https://dev.to/testingil/in-a-few-weeks-i-wont-know-how-my-own-app-works-4eg</guid>
      <description>&lt;p&gt;I’ve been doing a lot of code reviews recently, and I’ve noticed something about my experience during the reviews. And what it means for code in general, but specifically for AI generated code.&lt;/p&gt;

&lt;p&gt;But before I do that, I want to take you back to the ’00s. A simpler time. Back then I started doing something I only read about in books – pair programming. Ok, that’s a lie. Everyone who grabbed someone and brought them to look at your code because it’s doing something weird – you’ve done pair programming.&lt;/p&gt;

&lt;p&gt;But this was pair programming for like 80% of my work. And of course, not just me. This links directly to my topic – our understanding of the code. And in the age before AI, where teams really knew their code, that would be the biggest grade I’d give for code understanding.&lt;/p&gt;

&lt;p&gt;Meaning, if you and I work both at the same time on the same task, and finish it. I’d say we’re both at the highest level of understanding of that feature – what it needs to do, how it works, what it depends on, what depends on it, and how it’s written and tested.&lt;/p&gt;

&lt;p&gt;From here that level of understanding is going to drop. If you’re part of a team, but didn’t work on that feature, you probably know it exists. If we have dependencies, you probably know about them. But the rest is either non-existent or close to it.&lt;/p&gt;

&lt;p&gt;If you’re on another team, that level of understanding drops, and if you’re on another project – you may not even be aware.&lt;/p&gt;

&lt;p&gt;That makes sense, but we’re not talking about that today, I want to focus on my capability to do a proper review. And I go back to understanding for that. In order for me to give you proper feedback, catch your mistakes and offer alternatives, I need proper understanding. The more understanding I have, I can review better and make better changes.&lt;/p&gt;

&lt;p&gt;So far, so good. It makes sense.&lt;/p&gt;

&lt;p&gt;Two more things make sense. First the use of tools for review. Every tool, from syntax analyzer to the smartest security checker, work according to patterns, not understanding. All the tools check for generic stuff. Newer tools that use LLMs, can find more elusive patterns. But in the end, it’s like finding a missing semi-colon.&lt;/p&gt;

&lt;p&gt;The second thing is async code review. Or PR review, as people call it. This is done not with the person who wrote the code, but at my spare(?) time. I pull the PR, look at the code and based on my understanding, I need to approve it. Note that at this point, I can’t ask questions, so guess what I do? Look for patterns. If I’m the team leader and I know the feature, I can review better. If I’m on another team – I will not. Not take risks. Not initiate another coding and code review. Who has time for that?&lt;/p&gt;

&lt;p&gt;And that brings me to reviewing code my genie wrote.&lt;/p&gt;

&lt;p&gt;Because if you think about it, I’m the team leader, and the code agent is on my team. I’m supposed to know more about the feature, but I’m reviewing code I didn’t write.&lt;/p&gt;

&lt;p&gt;How well can I do it? There’s another part that contributes to this, which is the size of the diff. Humans, before AI know their limitations (most of them), and so they don’t write a lot of code, because they know what it’s like to review a lot of code. But even if they do, the reviewer, unless she gives up, can still ask questions.&lt;/p&gt;

&lt;p&gt;Well, my genie does a lot of work and creates a lot for me to review. Now, I know I can’t review a lot of code in one go, so I make my genie work in chunks. Chunks I can read and understand. For example I break features into workflows, and ask the genie to do a workflow or two, including all tests and whatever’s needed.&lt;/p&gt;

&lt;p&gt;Which is still a lot. And I tried to explore what happens that makes me give up. Yes I do give up sometimes.&lt;/p&gt;

&lt;p&gt;It goes back to understanding. I’m reviewing pieces of code – tests, bits of FE, bits of the API code, bits of logic and bits of database code. I can review these at the lowest level – does it do what I need? Can I read it?&lt;/p&gt;

&lt;p&gt;But when it comes to bigger things – like dependencies and side effects and performance – I give up. First there’s a lot of code to absorb, and then I need to piece everything that I know (or think I know) of how the rest of code works and designed. I’m building a code model in my mind. This helps me identify design issues, find the side effect traps. Maybe the performance issue hiding in there.&lt;/p&gt;

&lt;p&gt;But, if it’s hard to build that puzzle, I’m not going beyond “does it look ok” and “do the tests run”.&lt;/p&gt;

&lt;p&gt;So, I’m taking risks. Risking that there’s code in there that I don’t know what it does, how it works and what effect it might have on the system today. And tomorrow, I won’t even consider it for any co-dependence with my new feature, because I don’t understand how it works.&lt;/p&gt;

&lt;p&gt;This accumulates over time. Within a few days or weeks – I won’t know how most of my app works.&lt;/p&gt;

&lt;p&gt;So what do I actually do about it?&lt;/p&gt;

&lt;p&gt;Two things, and neither of them is a fix.&lt;/p&gt;

&lt;p&gt;The first one you’ve already seen. I keep the genie working in workflows, not in features. It makes the diffs smaller, and keeps them inside a context I can understand. The second one is a decision. Before I review a chunk, I decide what is important for me to go deep into, and what to go over lightly. Or not at all.&lt;/p&gt;

&lt;p&gt;It doesn’t come close to the old level of understanding. But my overall feeling of understanding has improved.&lt;/p&gt;

&lt;p&gt;Now, take that, and think about teams and groups. How much code and tests that nobody knows and understands can be accumulated in one year. Let alone three.&lt;/p&gt;

&lt;p&gt;Do you understand this risk? And how are you handling it?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://testingil.com/2026/09/code-review-for-ai-generated-pull-requests.html" rel="noopener noreferrer"&gt;testingil.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm Gil Zilberfeld. I teach API testing and test automation, and I write about what AI-generated code does to quality.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>programming</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Testability Is a Feature. Does Your Code Agent Know About It?</title>
      <dc:creator>Gil Zilberfeld</dc:creator>
      <pubDate>Wed, 09 Sep 2026 12:48:21 +0000</pubDate>
      <link>https://dev.to/testingil/testability-is-a-feature-does-your-code-agent-know-about-it-1el1</link>
      <guid>https://dev.to/testingil/testability-is-a-feature-does-your-code-agent-know-about-it-1el1</guid>
      <description>&lt;p&gt;I always say that &lt;a href="https://www.youtube.com/watch?v=9LXDf-iRYk4" rel="noopener noreferrer"&gt;testability is a feature&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It needs a customer – usually testers. We need to define what it means. And we need to build it in.&lt;/p&gt;

&lt;p&gt;The question is what happens to testability when someone else builds the code.&lt;/p&gt;

&lt;p&gt;Yup. Genie talk again.&lt;/p&gt;

&lt;p&gt;Let’s look at just 3 aspects of generated code, or any code really, that impact testability. But when our genie doesn’t get directions, it will skip those and cause us a big headache.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Complexity
&lt;/h2&gt;

&lt;p&gt;Of course, complexity affects testing. The more complex the code, the more work it takes to verify. More cases, more time – time that we don’t really have.&lt;/p&gt;

&lt;p&gt;My classic example is recursion. Recursion seems simple (in code lines), but it can hide all kinds of bugs in there. Edge cases galore.&lt;/p&gt;

&lt;p&gt;But that’s usually a function. That can be confined and handled. Today we’re generating systems.&lt;/p&gt;

&lt;p&gt;And they are as complex as the genie wants. Or the systems it was trained on. And those are not a model for simplicity.&lt;/p&gt;

&lt;p&gt;Complexity is the nemesis of testability. And unless we ask for simplicity, and make sure we got it, we pay for that in more expensive testing.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://testingil.com/2023/08/the-4-attributes-of-testability-observability.html" rel="noopener noreferrer"&gt;Observability&lt;/a&gt; is a key part of testability. Without it, we may be able to operate the system, but may not see the impact of those operations.&lt;/p&gt;

&lt;p&gt;For example, if you had one POST API in the world that saves data in the database, and you want to check if it works, you’ll need to choose between looking inside the database (which may not be possible), or rely on the status code (which doesn’t tell you anything about the actual impact). Adding a GET to read helps, and presto – you’ve got observability.&lt;/p&gt;

&lt;p&gt;Of course, you need to ask for that GET API.&lt;/p&gt;

&lt;p&gt;In CRUD systems, you’d get that API, I’m not worried. Even in generated code. The problem starts with the not-so-intuitive stuff. What gets logged and where. Knowing how long it takes to see the result, and maybe how much time to wait between operations and states.&lt;/p&gt;

&lt;p&gt;The more the system exposes state and data, the easier it is to understand, and the cheaper it is to debug and reproduce issues in it.&lt;/p&gt;

&lt;p&gt;Now – what are the chances you get the things you need for your non-generic needs, from a generic code generator?&lt;/p&gt;

&lt;p&gt;Exactly.&lt;/p&gt;

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

&lt;p&gt;I don’t need to explain how much generated code suffers from security issues. First – not new – it comes from the code examples out there, which are not that secure.&lt;/p&gt;

&lt;p&gt;But here’s one thing we don’t talk about. We usually plug security holes by tools. They scan the code and find patterns that are possible entry points.&lt;/p&gt;

&lt;p&gt;But now, we have a problem. First – the tools are ok, but they now also use models. Which are not perfect, they created the code in the first place. Plus, we use them to fix the code. Again, the same tools that created the code.&lt;/p&gt;

&lt;p&gt;This is where I get trust issues.&lt;/p&gt;

&lt;p&gt;But it’s not enough to call APIs and see the result. We need to plan and design cases to identify security issues. The impact of these issues are inside different systems – our app, the database, internal network, the billing system.&lt;/p&gt;

&lt;p&gt;Even if our app is &lt;a href="https://testingil.com/2025/10/its-not-your-tests-its-your-testability.html" rel="noopener noreferrer"&gt;testable&lt;/a&gt; (and we know how often that’s true), what about the extended environment? How easy is it to design security cases, run them, and see the results?&lt;/p&gt;

&lt;p&gt;The risks of code we don’t know don’t only increase the impact of what we know we need to check. They increase the hidden security issues too.&lt;/p&gt;

&lt;p&gt;Ok, the devs use those code agents, not you. What can you do?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Talk to the developers. If you don’t, that’s a good line to start with: “Hey, I heard you use code agents”. Works great at parties.&lt;/li&gt;
&lt;li&gt;Ask to see the code. Even non-coders understand simplicity. And they can see and understand reports from scanning tools.&lt;/li&gt;
&lt;li&gt;Explain how you’re going to test the app, and wait for the “you can’t do that” moment. This is where you make your request.&lt;/li&gt;
&lt;li&gt;Define what testability means for you and communicate it to them. They can ask (they would call it “tell”, but don’t fall for that trick) the genie to generate the code with those guidelines.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’ve said it before, AI amplifies problems and solutions we had before. We need to adapt to the quantities and new risks.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://testingil.com/2026/08/testability-of-ai-generated-code.html" rel="noopener noreferrer"&gt;testingil.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm Gil Zilberfeld. I teach API testing and test automation, and I write about what AI-generated code does to quality.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>programming</category>
      <category>codequality</category>
    </item>
    <item>
      <title>AI vs CI: Nobody Told the Pipeline</title>
      <dc:creator>Gil Zilberfeld</dc:creator>
      <pubDate>Thu, 20 Aug 2026 11:17:28 +0000</pubDate>
      <link>https://dev.to/testingil/ai-vs-ci-nobody-told-the-pipeline-4e88</link>
      <guid>https://dev.to/testingil/ai-vs-ci-nobody-told-the-pipeline-4e88</guid>
      <description>&lt;p&gt;CI is so commonplace these days, we don’t often think about why it’s there. And that reasoning really matters these days, because of how we use it.&lt;/p&gt;

&lt;p&gt;Especially when you’re writing AI agents and expect the CI system to run a regression test suite, and sound the alarm when something goes wrong.&lt;/p&gt;

&lt;p&gt;Here’s a funny story you may not know. CI - Continuous Integration – was not originally a tool category. It’s a process - it’s how you continuously integrate pieces of code together.&lt;/p&gt;

&lt;p&gt;Anyway, why do you need this process anyway? Because you’re scared. You’re terrified that integration broke something.&lt;/p&gt;

&lt;p&gt;So what do you do? You look for approval. An automation system that runs all the tests all the time is our approval of choice.&lt;/p&gt;

&lt;p&gt;That’s how CI became a tool category. Because in its heart, it’s a simple automation pipeline.&lt;/p&gt;

&lt;p&gt;So, that automation’s holy grail is speed, right?&lt;/p&gt;

&lt;p&gt;Wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mission was to kill “Works on my machine”
&lt;/h2&gt;

&lt;p&gt;Remember when we wrote software in a cave, and we had a sticker on our computers – “Works on my machine. Don’t run it on another cave”?&lt;/p&gt;

&lt;p&gt;Ah, the good old days.&lt;/p&gt;

&lt;p&gt;Because the CI automation #1 OG mission was to kill “Works on my machine”. How? By creating a repeatable process. Independent of all the weird installs on my machine. Multiple versions of libraries. And different configurations. And admin hacks.&lt;/p&gt;

&lt;p&gt;The CI builds, packages, runs and tests the software every time the same way. That way, if a test turns red, you know something bad happened, because it was green until now. And why your stomach turns, when it flakes between red and green – that’s the feeling of lost &lt;a href="https://testingil.com/2023/09/the-4-attributes-of-testability-reproducibility.html" rel="noopener noreferrer"&gt;repeatability&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Yes, repeatability brings bliss. Well, it did, before AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then AI showed up
&lt;/h2&gt;

&lt;p&gt;If your app does not touch AI (although building with code agents, can sometimes count as “touch”), you’ll continue to feel that bliss.&lt;/p&gt;

&lt;p&gt;But if you’re developing AI-based features, or agents, or vibe-coding, you’re in for a new experience every time you push your code (or prompts) into CI.&lt;/p&gt;

&lt;p&gt;Things are not repeatable anymore. Models change, sometimes without warning. And always under your feet. And when a model changes, does it trigger a run?&lt;/p&gt;

&lt;p&gt;You wish! Your alert system is malfunctioning.&lt;/p&gt;

&lt;p&gt;And the worst part is not a regression. Although if it’s a bug in a prompt, you may not be able to &lt;a href="https://testingil.com/2026/07/testing-ai-generated-code-prompt-not-a-fix.html" rel="noopener noreferrer"&gt;fix it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No, the worst part is that Green today doesn’t tell you what kind of Green it is. Things are no longer Working or not, they are Work-ish. But even that’s not the same work-ish every day.&lt;/p&gt;

&lt;p&gt;So we’ve got fewer triggers, results we can’t read, and on top of it – every run means something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s the solution?
&lt;/h2&gt;

&lt;p&gt;Repeatability gives us confidence. CI is the process, and tools, that give us the approval we seek, and the confidence we have comes from that repeatability.&lt;/p&gt;

&lt;p&gt;We can’t rely on the trigger anymore, but we can initiate our own runs. And since one run is not enough, we need to run more and look at the trends. Catch drift before it ships.&lt;/p&gt;

&lt;p&gt;What happens to quality when AI meets CI? We need to get back to the reasoning, and change how we manage quality.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://testingil.com/2026/08/ai-vs-ci-repeatability.html" rel="noopener noreferrer"&gt;testingil.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm Gil Zilberfeld. I teach API testing and test automation, and I write about what AI-generated code does to quality.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>programming</category>
      <category>codequality</category>
    </item>
    <item>
      <title>It's Almost Like You Need an Actual Programmer</title>
      <dc:creator>Gil Zilberfeld</dc:creator>
      <pubDate>Thu, 13 Aug 2026 07:07:33 +0000</pubDate>
      <link>https://dev.to/testingil/its-almost-like-you-need-an-actual-programmer-19ko</link>
      <guid>https://dev.to/testingil/its-almost-like-you-need-an-actual-programmer-19ko</guid>
      <description>&lt;p&gt;Vibe coding ain’t what it used to be.&lt;/p&gt;

&lt;p&gt;Back in the old days (2 years ago), we conjured up apps with our own programming language.&lt;/p&gt;

&lt;p&gt;Turns out, it does work, but more for prototypes. If you want an actual working production app, you need that thing from before. How do the old timers call it? Ah yes. Code.&lt;/p&gt;

&lt;p&gt;So our builder says to the genie: “Code me this”.&lt;br&gt;
And the genie does build this. Mostly.&lt;/p&gt;

&lt;p&gt;When we’ve got a prototype and it’s working, two things happen. The first thing is management thinks they have an actual product. In our case, it’s the builder that thinks “code me this” is simply a translation layer.&lt;/p&gt;

&lt;p&gt;But then, another thing happens – we now have to take care of our puppy. I mean the code.&lt;/p&gt;

&lt;p&gt;As long as we don’t need to touch it, it doesn’t matter what it looks like. But then we do.&lt;/p&gt;

&lt;p&gt;So what does our hero think? What worked before, will work again. He tells his favorite code agent – “build me my greatest feature yet”.&lt;/p&gt;

&lt;p&gt;But then weird things start happening. Bugs that weren’t there. Multiple tries of code changes – costly ones, mind you. Performance slows down.&lt;/p&gt;

&lt;p&gt;It’s almost like you need an actual programmer to do the work.&lt;br&gt;
And you do. You know what helps developers? And coding agents?&lt;/p&gt;

&lt;p&gt;Clean code. Readable, maintainable code. The classics are still with us.&lt;/p&gt;

&lt;p&gt;Now, coding agents are getting better at producing code. However, they are only  as good as the code they are trained on. Now think – what do you think the average level of code out there is?&lt;/p&gt;

&lt;p&gt;Exactly. That’s what you’re getting.&lt;/p&gt;

&lt;p&gt;So if you are on a transition from prompts to code, it may look like continuing vibing is the shortest way to more features. Yet, the first thing you need is a good platform to grow your code.&lt;/p&gt;

&lt;p&gt;Now it’s time to take control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the code.
&lt;/h2&gt;

&lt;p&gt;You’ll do this first anyway. The code is the only truth you have. The prompts you used before are scattered across forty chat sessions and there were never any docs.&lt;/p&gt;

&lt;p&gt;Just know what you’re up against. Agents drop a lot of code, and after ten files your eyes glaze over. You won’t read all of it, but try to understand the important bits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write down what it should do.
&lt;/h2&gt;

&lt;p&gt;Ask the agent to derive documentation from the codebase. It’s fast and it beats no docs at all.&lt;/p&gt;

&lt;p&gt;But know what you got. Those docs describe what the code does, not what it should do. If there’s a bug in there, it appears as a requirement. Review and sieve out the wrong stuff.&lt;/p&gt;

&lt;p&gt;If you can find them, collect your prompts. They were the intent for building the app.&lt;/p&gt;

&lt;p&gt;Review both, and drop everything that doesn’t add up. Now you have a documented system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now write tests. Against the requirements.
&lt;/h2&gt;

&lt;p&gt;It’s tempting to generate tests for what’s already there. And for legacy apps, I recommend capturing existing behavior of undocumented knowledge built up for ten years.&lt;/p&gt;

&lt;p&gt;But here? You’re better set. The intent is still around. Capture what the code does today and you’ve just made every mistake a requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then you can change it.
&lt;/h2&gt;

&lt;p&gt;Including asking the genie to change it for you – which is the part everyone wants to skip to.&lt;/p&gt;

&lt;p&gt;But now, with documentation and tests in place, now it’s a lot safer to make changes.&lt;/p&gt;

&lt;p&gt;Next you need to understand the principles of Clean Code. If you don’t, you may ask the genie to change the code for you, but you’ll get more of the same. We don’t want more of that mess.&lt;/p&gt;

&lt;p&gt;Exactly like programming. Who knows, maybe you’ll become one eventually.&lt;/p&gt;

&lt;p&gt;So what do you say – Are you ready for clean up?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://testingil.com/2026/08/its-almost-like-you-need-an-actual-programmer.html" rel="noopener noreferrer"&gt;testingil.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm Gil Zilberfeld. I teach API testing and test automation, and I write about what AI-generated code does to quality.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>programming</category>
      <category>codequality</category>
    </item>
    <item>
      <title>The New Technical Debt</title>
      <dc:creator>Gil Zilberfeld</dc:creator>
      <pubDate>Thu, 13 Aug 2026 07:06:32 +0000</pubDate>
      <link>https://dev.to/testingil/the-new-technical-debt-4ol4</link>
      <guid>https://dev.to/testingil/the-new-technical-debt-4ol4</guid>
      <description>&lt;p&gt;Is AI code debt the new technical debt? As I keep learning, generating code and examining it – it’s worse.&lt;/p&gt;

&lt;p&gt;In the old days, we worked hard to create technical debt. Just kidding, it was easy.&lt;/p&gt;

&lt;p&gt;Technical debt has many definitions, and origin stories. But one thing is common: We leave the code as it is, knowing it could be better. The debt is the gap of effort of making it better.&lt;/p&gt;

&lt;p&gt;And why the gap? Because we know we’ll see that code again. And when we do, it’ll be hard to change. Better code would have made it easier.&lt;/p&gt;

&lt;p&gt;Now we’re in the age of genies. They can write any code. They can change any code. Do we need to worry about AI code debt?&lt;/p&gt;

&lt;p&gt;Sure we do.&lt;/p&gt;

&lt;p&gt;AI code debt is exactly the same as technical debt – we’re leaving the code as it is, knowing it could be better. The gap is still the effort of making it better.&lt;/p&gt;

&lt;p&gt;But this time the gap is a lot bigger. There’s a lot more code, it’s probably a lot more complex, and some of it – let’s be frank – is code we didn’t review. So the gap is a lot bigger than we guess.&lt;/p&gt;

&lt;p&gt;But that’s a bot problem, right? The code agent will deal with all the needed changes. We don’t need to even look at the code.&lt;/p&gt;

&lt;p&gt;Nah, you know you will. You know what code is generated, and it’s not how you would have written it. And coding agents have the same problem of making sense of complex code bases as us.&lt;/p&gt;

&lt;p&gt;And they’ll make mistakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can the code agent clean the code up by itself?
&lt;/h2&gt;

&lt;p&gt;Cleaning is not just “make it readable”. It’s preparing it for more changes, reducing dependencies and isolating interfaces – all in the context of future plans. And the agent doesn’t have this context.&lt;/p&gt;

&lt;p&gt;In fact, it will assume another context, and we get stuck with the code and the assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you pay down AI code debt?
&lt;/h2&gt;

&lt;p&gt;Same as always: &lt;a href="https://testingil.com/2026/08/its-almost-like-you-need-an-actual-programmer.html" rel="noopener noreferrer"&gt;find the code you know you’ll touch again&lt;/a&gt;, and make that code easier to change. The problem starts when you don’t know where that code is.&lt;/p&gt;

&lt;p&gt;Because, you didn’t write it. And you didn’t review all of it. If any.&lt;/p&gt;

&lt;p&gt;Putting a price on technical debt before was an exercise in imagination. Now it’s pure fantasy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you avoid it next time?
&lt;/h2&gt;

&lt;p&gt;First know what code was generated. And for that you need to enforce smaller code generation.&lt;/p&gt;

&lt;p&gt;If you don’t enforce it, you’ll have a lot more to review. And if that happens you won’t review it all. It’s a human thing.&lt;/p&gt;

&lt;p&gt;Then, you can &lt;a href="https://testingil.com/2026/07/testing-ai-generated-code-prompt-not-a-fix.html" rel="noopener noreferrer"&gt;wish the genie&lt;/a&gt; to refactor it to take the shape you want. Genies are good at transformations. And if the genie breaks something, your tests will tell you.&lt;/p&gt;

&lt;p&gt;You do have tests, right?&lt;/p&gt;

&lt;p&gt;The old technical debt was based on maintenance work. Now we have bigger maintenance queued up, along with risks of unverified code. Not cool.&lt;/p&gt;

&lt;p&gt;So, first, we need to be aware of the AI code debt – we’re creating code that will cost a lot more to maintain, than “regular” code.&lt;/p&gt;

&lt;p&gt;Before, we thought “it’s ok, we’ll take care of that later”, and then, when the bill came it was a lot more than we thought.&lt;/p&gt;

&lt;p&gt;Now? Expect a much bigger one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions people ask about AI code debt
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is AI code debt?
&lt;/h3&gt;

&lt;p&gt;AI code debt is technical debt created by generated code: you leave the code as it is, knowing it could be better, and the debt is the effort of making it better. The difference is scale. There’s more of it, it’s more complex, and some of it was never reviewed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is AI code debt different from technical debt?
&lt;/h3&gt;

&lt;p&gt;Not in kind, only in size and visibility. The old debt was something you put there and remembered. This debt arrived while you were reading something else, so you don’t know where it is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can an AI agent clean up its own code debt?
&lt;/h3&gt;

&lt;p&gt;Not on its own. Cleaning up means preparing code for changes you plan to make, and the agent doesn’t have that context. It will assume a different one, and you’re left with the code and the assumptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you check that an AI refactor didn’t break anything?
&lt;/h3&gt;

&lt;p&gt;With tests you wrote before the refactor. Directing the genie to reshape code is fine as long as something independent tells you when it breaks.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://testingil.com/2026/08/ai-code-debt.html" rel="noopener noreferrer"&gt;testingil.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm Gil Zilberfeld. I teach API testing and test automation, and I write about what AI-generated code does to quality.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>programming</category>
      <category>codequality</category>
    </item>
    <item>
      <title>You Can't Fix A Bug With A Prompt</title>
      <dc:creator>Gil Zilberfeld</dc:creator>
      <pubDate>Thu, 06 Aug 2026 10:46:27 +0000</pubDate>
      <link>https://dev.to/testingil/you-cant-fix-a-bug-with-a-prompt-3ini</link>
      <guid>https://dev.to/testingil/you-cant-fix-a-bug-with-a-prompt-3ini</guid>
      <description>&lt;p&gt;Let's talk about fixing bugs. My second favorite activity after creating them.&lt;/p&gt;

&lt;p&gt;How do I know the bug is fixed? Well, I've been taught by wiser and more experienced people than me (way back when), that if you want to make sure the bug never shows its face again - write an automated test for it.&lt;/p&gt;

&lt;p&gt;Ok, I admit that there were times I didn't write a test. Some fixes are so trivial, that sometimes a test is a luxury.&lt;/p&gt;

&lt;p&gt;But even then, I was working on a hidden assumption. Just like in Fallout, code never changes. Until it does. But between those times it never changes.&lt;/p&gt;

&lt;p&gt;I fix the bug. From this point until it actually changes by a human, or a bot or someone in-between - that code will compile, or transpile, or whatever we call "runs" the same way. A statement will execute, a condition evaluated, an exception caught - every time in the same way.&lt;/p&gt;

&lt;p&gt;And now we come to modern programming languages: Prompts. Agents, prompts, workflows - they don't run the same way every time. What they do is run their interpretation of the request. If they run tools - they run the deterministic parts. If they run sub-agents, they run interpretations based on other interpretations.&lt;/p&gt;

&lt;p&gt;Interpretations work mostly the same way, until they don't. When I was teaching my agent to develop in TDD, I had a couple of requests. One of them was to not create code without a test.&lt;/p&gt;

&lt;p&gt;Which I thought was a very normal request from an agent. In fact, when I started out by telling it - we're working in TDD - I assumed it knows what TDD is. Ha.&lt;/p&gt;

&lt;p&gt;Always remember that what LLMs know is exactly what most of the population knows. And usually the "don't create any code without a test" falls through the cracks.&lt;/p&gt;

&lt;p&gt;So I made it official: One of the agent rules was exactly that. This was a legitimate bug fix. At least I thought so.&lt;/p&gt;

&lt;p&gt;But it really was a suggestion. Which the agent considered, and depending on its mood, sometimes did, and sometimes didn't.&lt;/p&gt;

&lt;p&gt;I won't go into the full solution (still in progress, if you want me to elaborate, comment), but part of it was to run a targeted coverage tool - a deterministic one, check it and stop the process if it found extra code. The TDD sequence looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Per step:
&lt;span class="p"&gt;1.&lt;/span&gt; Write test(s).
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="sb"&gt;`node scripts/tdd.mjs red &amp;lt;test-file&amp;gt;`&lt;/span&gt; — all newly added tests must fail. Pre-existing passing tests in the same file are allowed to remain passing.
&lt;span class="p"&gt;3.&lt;/span&gt; Implement minimum to pass.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="sb"&gt;`node scripts/tdd.mjs targeted &amp;lt;test-file&amp;gt;`&lt;/span&gt; — targeted coverage + pass check.
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="sb"&gt;`node scripts/tdd.mjs lint`&lt;/span&gt; — ESLint.
&lt;span class="p"&gt;6.&lt;/span&gt; &lt;span class="sb"&gt;`node scripts/tdd.mjs full`&lt;/span&gt; — full suite + coverage.
&lt;span class="p"&gt;7.&lt;/span&gt; Script says STOP. Human reviews.
&lt;span class="p"&gt;8.&lt;/span&gt; Human runs &lt;span class="sb"&gt;`node scripts/tdd.mjs commit "message"`&lt;/span&gt;.
&lt;span class="p"&gt;9.&lt;/span&gt; Human confirms next step. AI runs &lt;span class="sb"&gt;`/clear`&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But each step here is the suggestion. The real enforcement is done in the tdd.mjs code. Real code.&lt;/p&gt;

&lt;p&gt;But this is just an example. The real problem is that more and more "code" is not programmed. It's interpreted. That means that bugs are a lot more flaky to catch, but also are not permanently fixable.&lt;/p&gt;

&lt;p&gt;And don't get me started on companies switching model capabilities every other Tuesday. In the past, updating versions was a whole ceremony because we were worried something would break.&lt;/p&gt;

&lt;p&gt;Now LLM providers do it for us without us knowing.&lt;br&gt;
We can live with that. We should make sure we know.&lt;/p&gt;

&lt;p&gt;And remember - bug fixes in prompts are not real bug fixes. They are more like wishes. Which may or may not come true.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://testingil.com/2026/07/testing-ai-generated-code-prompt-not-a-fix.html" rel="noopener noreferrer"&gt;testingil.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm Gil Zilberfeld. I teach API testing and test automation, and I write about what AI-generated code does to quality.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>programming</category>
      <category>codequality</category>
    </item>
  </channel>
</rss>
