<?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: Remo H. Jansen</title>
    <description>The latest articles on DEV Community by Remo H. Jansen (@remojansen).</description>
    <link>https://dev.to/remojansen</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%2F24875%2F8708b5ec-0a58-4900-9c87-6f5ab2540dd7.png</url>
      <title>DEV Community: Remo H. Jansen</title>
      <link>https://dev.to/remojansen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/remojansen"/>
    <language>en</language>
    <item>
      <title>Your Platform Engineering Investment Is Not Paying Off. Here's Why.</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Wed, 21 Oct 2026 12:50:56 +0000</pubDate>
      <link>https://dev.to/remojansen/your-platform-engineering-investment-is-not-paying-off-heres-why-b6l</link>
      <guid>https://dev.to/remojansen/your-platform-engineering-investment-is-not-paying-off-heres-why-b6l</guid>
      <description>&lt;p&gt;&lt;em&gt;Building an internal platform is only half the job. The real return comes when developers trust it, want to use it, and help make it better.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Platform engineering has become a strategic investment for many engineering organisations. Teams are building internal developer platforms, standardising CI/CD pipelines, creating self-service infrastructure, and providing tools designed to make developers more productive.&lt;/p&gt;

&lt;p&gt;The promise is compelling: reduce cognitive load, eliminate duplicated effort, improve consistency, strengthen security, and let product teams focus on delivering business value rather than managing infrastructure.&lt;/p&gt;

&lt;p&gt;Organisations invest significant time, money, and engineering talent to make this happen.&lt;/p&gt;

&lt;p&gt;And yet, something often gets lost along the way.&lt;/p&gt;

&lt;p&gt;The platform gets delivered. The migration happens. The documentation is published. The new workflow becomes the official standard.&lt;/p&gt;

&lt;p&gt;But developers are still frustrated.&lt;/p&gt;

&lt;p&gt;They encounter confusing errors, unreliable workflows, missing capabilities, and problems that require them to ask another team for help. They learn which workarounds are necessary, which parts of the platform they can trust, and which problems are easier to avoid altogether.&lt;/p&gt;

&lt;p&gt;Eventually, they comply with the new way of working. But compliance is not enthusiasm, and adoption is not necessarily success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The organisation has invested in a platform, but it has not fully realised the return on that investment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why does this happen, and what can we do about it?&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The last 10% matters more than you think
&lt;/h2&gt;

&lt;p&gt;Platform teams are often very good at delivering the big things.&lt;/p&gt;

&lt;p&gt;They build the infrastructure, establish common patterns, automate the happy path, integrate the necessary services, and provide a consistent interface for developers.&lt;/p&gt;

&lt;p&gt;These are difficult and valuable achievements.&lt;/p&gt;

&lt;p&gt;The problem is what happens next.&lt;/p&gt;

&lt;p&gt;The platform works, but not always reliably. The common workflow is straightforward, but the unusual case is painful. An error occurs, but the message doesn't explain what went wrong or how to fix it. A pipeline fails, and determining whether the problem is in the application, the configuration, or the platform itself becomes an investigation.&lt;/p&gt;

&lt;p&gt;None of these problems necessarily looks significant in isolation.&lt;/p&gt;

&lt;p&gt;Collectively, however, they define the developer experience.&lt;/p&gt;

&lt;p&gt;Consider two internal platforms that provide exactly the same capabilities.&lt;/p&gt;

&lt;p&gt;With the first, a developer can complete a task in minutes when everything works, but diagnosing a failure takes hours and requires support from the platform team.&lt;/p&gt;

&lt;p&gt;With the second, the task takes the same amount of time when everything works, but failures are clearly explained, diagnostics are available, and the developer can resolve most problems independently.&lt;/p&gt;

&lt;p&gt;Technically, both platforms may be equivalent. In practice, they deliver very different levels of value.&lt;/p&gt;

&lt;p&gt;This is the last-mile problem in platform engineering.&lt;/p&gt;

&lt;p&gt;We invest heavily in capabilities, but sometimes underestimate the effort required to make those capabilities dependable, intuitive, and pleasant to use.&lt;/p&gt;

&lt;p&gt;The last 10% might be the least glamorous part of the roadmap. It is also where much of the difference between a usable platform and a genuinely valuable one is created.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Developers don't fall in love with roadmaps. They fall in love with experiences.
&lt;/h2&gt;

&lt;p&gt;Imagine that your organisation announces a major investment in a new developer platform.&lt;/p&gt;

&lt;p&gt;There is an ambitious roadmap, a dedicated team, a polished launch presentation, and a clear strategic rationale.&lt;/p&gt;

&lt;p&gt;Developers are encouraged to migrate their applications and embrace the new tooling.&lt;/p&gt;

&lt;p&gt;Initially, there is curiosity. People try the platform, explore its capabilities, and perhaps even get excited about what it could eventually become.&lt;/p&gt;

&lt;p&gt;Then they start using it for real work.&lt;/p&gt;

&lt;p&gt;They encounter friction. Some workflows are slower than expected. Documentation doesn't cover their situation. Failures are difficult to diagnose. Requests for improvements disappear into a queue.&lt;/p&gt;

&lt;p&gt;Over time, the initial excitement fades.&lt;/p&gt;

&lt;p&gt;Developers stop exploring new capabilities. They stop reporting minor bugs because the process feels disproportionate to the problem. They stop suggesting improvements because they don't expect much to happen. They learn the minimum required to get their jobs done.&lt;/p&gt;

&lt;p&gt;The platform becomes something they have to use rather than something they want to use.&lt;/p&gt;

&lt;p&gt;This distinction matters.&lt;/p&gt;

&lt;p&gt;When developers genuinely value a tool, they become its advocates. They recommend it to colleagues, experiment with new features, report problems, suggest improvements, and invest time in helping it evolve.&lt;/p&gt;

&lt;p&gt;When they merely tolerate it, they do the minimum required.&lt;/p&gt;

&lt;p&gt;This creates a vicious cycle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The platform has usability problems.&lt;/li&gt;
&lt;li&gt;Developers become reluctant to engage with it.&lt;/li&gt;
&lt;li&gt;The platform team receives less useful feedback and fewer contributions.&lt;/li&gt;
&lt;li&gt;Problems remain unresolved or are discovered later than they otherwise would be.&lt;/li&gt;
&lt;li&gt;The developer experience deteriorates, reinforcing the original reluctance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a platform that may look successful on a dashboard but is not reaching its full potential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You cannot mandate genuine enthusiasm. You have to earn it through the experience you deliver.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The hidden cost of making developers dependent on the platform team
&lt;/h2&gt;

&lt;p&gt;A successful internal platform should increase developer autonomy.&lt;/p&gt;

&lt;p&gt;Developers should be able to provision resources, deploy applications, understand failures, and solve common problems without having to coordinate with a central team for every step.&lt;/p&gt;

&lt;p&gt;Yet many platform implementations inadvertently create new dependencies.&lt;/p&gt;

&lt;p&gt;A pipeline fails, so the developer raises a ticket.&lt;/p&gt;

&lt;p&gt;A configuration behaves unexpectedly, so they contact the platform team.&lt;/p&gt;

&lt;p&gt;A feature is missing, so they submit a request and wait.&lt;/p&gt;

&lt;p&gt;A bug needs fixing, but the relevant code is owned by another team, and the only available path is through its backlog.&lt;/p&gt;

&lt;p&gt;The platform may have automated many manual tasks, but the organisation has replaced one kind of dependency with another.&lt;/p&gt;

&lt;p&gt;This is particularly costly because platform teams are usually responsible for shared capabilities used by many product teams. Every unnecessary support interaction consumes capacity that could otherwise go towards improving the platform itself.&lt;/p&gt;

&lt;p&gt;There is also an opportunity cost for the consuming teams. Developers spend time waiting, investigating workarounds, explaining issues, and coordinating with people who understand the platform better than they do.&lt;/p&gt;

&lt;p&gt;A platform that requires constant human intervention to operate has not fully delivered on the promise of self-service.&lt;/p&gt;

&lt;p&gt;Of course, some interactions with platform specialists are necessary. Complex infrastructure, security-sensitive changes, and architectural decisions often need expert involvement.&lt;/p&gt;

&lt;p&gt;The goal isn't to eliminate the platform team. It is to eliminate unnecessary dependencies on it.&lt;/p&gt;

&lt;p&gt;A good platform enables developers to solve the problems they are equipped to solve, while making it easy to involve specialists when their expertise is genuinely needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Why can't developers help fix the platform?
&lt;/h2&gt;

&lt;p&gt;Here is a scenario that should be familiar to many engineering teams.&lt;/p&gt;

&lt;p&gt;A developer encounters a failure in a shared deployment pipeline. They suspect a defect in the pipeline itself rather than their application.&lt;/p&gt;

&lt;p&gt;What happens next?&lt;/p&gt;

&lt;p&gt;Perhaps they open a ticket in an IT service management system. They provide logs, explain what they were doing, and wait for someone to investigate.&lt;/p&gt;

&lt;p&gt;Another team encounters the same problem. They open another ticket, provide similar information, and wait too.&lt;/p&gt;

&lt;p&gt;Eventually, a platform engineer investigates both reports, identifies the underlying defect, implements a fix, and releases an update.&lt;/p&gt;

&lt;p&gt;This process might work. But it is unnecessarily expensive if the developers encountering the problem could have collaborated directly with the maintainers.&lt;/p&gt;

&lt;p&gt;Now imagine a different workflow.&lt;/p&gt;

&lt;p&gt;The developer navigates to the shared platform's source repository and asks an AI coding agent to investigate the failure.&lt;/p&gt;

&lt;p&gt;The agent examines the available logs and configuration, helps determine whether the problem originates in the application or the shared platform, and searches existing issues for similar reports.&lt;/p&gt;

&lt;p&gt;If an issue already exists, the developer can contribute evidence and confirm that another application is affected. If no issue exists, the agent helps prepare a new one with useful diagnostic information.&lt;/p&gt;

&lt;p&gt;Other teams can discover the issue, contribute their findings, and discuss a solution in the same place.&lt;/p&gt;

&lt;p&gt;Perhaps a developer from one of those teams identifies the root cause and proposes a fix through a pull request. The maintainers review it, run the necessary tests, and merge it.&lt;/p&gt;

&lt;p&gt;The platform team still owns the platform. It still defines standards, reviews changes, and ensures quality.&lt;/p&gt;

&lt;p&gt;But it is no longer the only team capable of improving it.&lt;/p&gt;

&lt;p&gt;This is the difference between a support model and a contribution model.&lt;/p&gt;

&lt;p&gt;In the first, consumers report problems and maintainers solve them.&lt;/p&gt;

&lt;p&gt;In the second, consumers and maintainers collaborate to solve problems together.&lt;/p&gt;

&lt;p&gt;That is the foundation of an inner-source culture: applying the collaborative practices of open source within an organisation.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. AI makes this opportunity much more compelling
&lt;/h2&gt;

&lt;p&gt;The contribution model described above isn't entirely new. Inner-source practices have existed for years.&lt;/p&gt;

&lt;p&gt;What is changing is the cost of participation.&lt;/p&gt;

&lt;p&gt;Historically, contributing to a shared platform could require considerable effort. A developer needed to understand the repository structure, locate the relevant code, reproduce the problem, navigate contribution guidelines, and prepare a useful issue or pull request.&lt;/p&gt;

&lt;p&gt;For someone unfamiliar with the platform, that initial investment could be substantial.&lt;/p&gt;

&lt;p&gt;AI coding agents can reduce this barrier.&lt;/p&gt;

&lt;p&gt;With appropriate repository access and tooling, an agent can help developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand unfamiliar platform code.&lt;/li&gt;
&lt;li&gt;Diagnose failures using logs, configuration, and source code.&lt;/li&gt;
&lt;li&gt;Determine whether an issue is likely to originate in the application or the shared platform.&lt;/li&gt;
&lt;li&gt;Search existing issues and documentation for known problems.&lt;/li&gt;
&lt;li&gt;Produce well-structured bug reports with relevant diagnostic evidence.&lt;/li&gt;
&lt;li&gt;Identify potential fixes and prepare draft pull requests.&lt;/li&gt;
&lt;li&gt;Write or improve tests to reproduce a defect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These capabilities do not guarantee correct diagnoses or safe changes. Agents can be wrong, miss context, or propose fixes that introduce regressions. Human review, automated testing, access controls, and appropriate security boundaries remain essential.&lt;/p&gt;

&lt;p&gt;But the potential is significant.&lt;/p&gt;

&lt;p&gt;AI can make it easier for developers to cross the boundary between consuming a platform and contributing to it.&lt;/p&gt;

&lt;p&gt;This is particularly valuable in large organisations, where the people most affected by a platform defect may be the people best positioned to reproduce it, understand its impact, or even propose a solution.&lt;/p&gt;

&lt;p&gt;The platform team doesn't have to become less important. Its expertise can be applied where it creates the most value: architectural direction, quality, reliability, difficult problems, and enabling contributions from across the organisation.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Your tooling choices can either enable or undermine collaboration
&lt;/h2&gt;

&lt;p&gt;Culture matters, but culture doesn't exist independently of the systems people use every day.&lt;/p&gt;

&lt;p&gt;If source code lives in one place, issues in another, documentation in a third, and technical discussions in a fourth, contributing to a shared platform becomes harder than it needs to be.&lt;/p&gt;

&lt;p&gt;Developers must navigate multiple systems, maintain separate accounts or permissions, repeat information, and reconstruct context that is scattered across different locations.&lt;/p&gt;

&lt;p&gt;The organisation may have all the necessary tools. Yet the overall workflow remains fragmented.&lt;/p&gt;

&lt;p&gt;This is especially problematic when the official process encourages developers to report a problem through a ticketing system but offers no straightforward path to investigate the underlying code or contribute a fix.&lt;/p&gt;

&lt;p&gt;A more collaborative approach is to bring technical work closer to the source.&lt;/p&gt;

&lt;p&gt;For code-centric platform engineering, a repository-centred workflow can provide a natural home for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source code and version history.&lt;/li&gt;
&lt;li&gt;Issues, defects, and feature requests.&lt;/li&gt;
&lt;li&gt;Technical documentation and contribution guidelines.&lt;/li&gt;
&lt;li&gt;Pull requests, reviews, and design discussions.&lt;/li&gt;
&lt;li&gt;Automated testing and continuous integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub is one example of a platform that supports this model. Other tools can support similar workflows. The specific product is less important than the principle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The place where a problem is reported should also be a place where people can understand it, discuss it, and contribute to fixing it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There may still be good reasons to retain separate systems for service management, compliance, incident response, or formal approvals. The objective isn't to force every organisational process into a single tool. It's to avoid unnecessary separation between the technical artefacts and the people trying to improve them.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Platform engineering needs a product mindset
&lt;/h2&gt;

&lt;p&gt;Perhaps the most fundamental change is to how we define success.&lt;/p&gt;

&lt;p&gt;Many engineering initiatives are organised around delivery milestones: build the platform, release the capability, migrate the applications, and declare the project complete.&lt;/p&gt;

&lt;p&gt;But internal platforms aren't finished when they launch.&lt;/p&gt;

&lt;p&gt;They are products with users, competitors, changing requirements, operational costs, and an ongoing need for improvement.&lt;/p&gt;

&lt;p&gt;Those users happen to be colleagues rather than external customers. That doesn't make their experience any less important.&lt;/p&gt;

&lt;p&gt;A product mindset means treating feedback as a continuous input, prioritising usability alongside capability, and measuring whether the platform actually helps developers achieve their goals.&lt;/p&gt;

&lt;p&gt;It also means accepting that the best feature to build next may not be a new capability.&lt;/p&gt;

&lt;p&gt;It might be fixing an unreliable workflow. Improving an error message. Making a common failure self-diagnosable. Reducing the time required to onboard an application. Removing a manual approval that no longer adds value.&lt;/p&gt;

&lt;p&gt;These improvements may be less impressive in a launch announcement, but they can have a substantial impact across hundreds or thousands of developers.&lt;/p&gt;

&lt;p&gt;The platform team should therefore ask not just, "What should we build next?" but also, "What prevents developers from getting value from what we have already built?"&lt;/p&gt;

&lt;p&gt;That second question is often where the most immediate returns can be found.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Measure value, not just activity
&lt;/h2&gt;

&lt;p&gt;If we want platform investments to deliver better returns, we need to measure outcomes rather than relying exclusively on delivery metrics.&lt;/p&gt;

&lt;p&gt;Counting onboarded applications, available features, pipeline executions, or registered users can tell us something about reach and activity. They don't necessarily tell us whether developers are better off.&lt;/p&gt;

&lt;p&gt;A more useful measurement framework might include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer experience&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How satisfied are developers with the platform?&lt;/li&gt;
&lt;li&gt;How often do they encounter friction in common workflows?&lt;/li&gt;
&lt;li&gt;Do they trust the platform for critical work?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Reliability and productivity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How frequently do platform-related failures occur?&lt;/li&gt;
&lt;li&gt;How long does it take to diagnose and resolve them?&lt;/li&gt;
&lt;li&gt;How much developer time is spent waiting for support or working around limitations?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Autonomy and self-service&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What proportion of common problems can developers resolve independently?&lt;/li&gt;
&lt;li&gt;How often do they need human intervention?&lt;/li&gt;
&lt;li&gt;How long does it take to onboard an application or complete a routine task?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contribution and continuous improvement&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How easy is it to report a defect with enough information to act on it?&lt;/li&gt;
&lt;li&gt;Can consuming teams contribute changes?&lt;/li&gt;
&lt;li&gt;How long does it take to review and release a valid contribution?&lt;/li&gt;
&lt;li&gt;Are developers actively helping improve the platform?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These measures should be interpreted together rather than turned into isolated targets. For example, a high number of pull requests isn't necessarily evidence of success if those contributions are low quality or reflect a platform full of defects.&lt;/p&gt;

&lt;p&gt;The aim is to understand whether the platform is reducing friction, enabling autonomy, and delivering value to the teams that depend on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. What should organisations do differently?
&lt;/h2&gt;

&lt;p&gt;The answer isn't to abandon platform engineering or to assume that every problem can be solved by changing tools.&lt;/p&gt;

&lt;p&gt;The opportunity is to improve how platforms are built, operated, and evolved.&lt;/p&gt;

&lt;p&gt;Here are five practical starting points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Prioritise the last mile.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reserve meaningful capacity for reliability, usability, diagnostics, documentation, and the removal of recurring friction. Don't allow new feature development to consume the entire roadmap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Make common failures self-diagnosable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Invest in actionable error messages, structured logs, troubleshooting guidance, and diagnostic tooling. Developers should be able to understand what failed and what to do next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Make contribution a first-class workflow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Document how to report issues, propose changes, run tests, and contribute fixes. Make it possible for consuming teams to participate without needing to become platform experts first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Use AI to lower the cost of participation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Where appropriate, provide agents with access to the relevant source code, documentation, issues, and diagnostic tools. Let them help with investigation and contribution, while retaining human oversight and appropriate safeguards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Measure whether developers actually benefit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gather feedback, track reliability and resolution times, and examine the friction developers encounter in real workflows. Use that evidence to determine what to improve next.&lt;/p&gt;

&lt;p&gt;None of these requires a massive transformation programme to get started. A team can begin with one frequently failing workflow, one repository, and a clear commitment to making problems easier to diagnose and fix.&lt;/p&gt;

&lt;p&gt;The important thing is to close the feedback loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: The return on platform engineering is earned after delivery
&lt;/h2&gt;

&lt;p&gt;Platform engineering offers enormous potential. Shared infrastructure, standardised workflows, self-service capabilities, and reusable tooling can make engineering organisations more productive, consistent, and secure.&lt;/p&gt;

&lt;p&gt;But building these capabilities is only part of the job.&lt;/p&gt;

&lt;p&gt;The return on that investment depends on what happens when developers use the platform every day: whether it works reliably, whether problems are easy to solve, whether feedback leads to improvements, and whether the people who depend on it can help make it better.&lt;/p&gt;

&lt;p&gt;A platform that developers are required to use can achieve broad adoption without earning their trust.&lt;/p&gt;

&lt;p&gt;A platform that developers trust can achieve something much more valuable: voluntary engagement, advocacy, and continuous improvement.&lt;/p&gt;

&lt;p&gt;That is why the last 10% matters. It is why self-service must mean more than automating the happy path. And it is why collaboration should be built into the platform's operating model rather than treated as an administrative process around it.&lt;/p&gt;

&lt;p&gt;The next evolution of platform engineering should not simply be about building more platforms or adding more capabilities.&lt;/p&gt;

&lt;p&gt;It should be about making existing platforms better to use, easier to understand, and easier to improve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real measure of a platform isn't how much engineering went into building it. It's how much friction it removes for everyone who depends on it — and how effectively those people can help it evolve.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is how platform investments become lasting engineering value.&lt;/p&gt;

</description>
      <category>devex</category>
      <category>productivity</category>
      <category>platformengineering</category>
      <category>ai</category>
    </item>
    <item>
      <title>From Never Getting Selected to a 1-in-3 Success Rate: Did AI Help Me Write Better CFPs, or Is AI Selecting Them?</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Mon, 19 Oct 2026 15:25:47 +0000</pubDate>
      <link>https://dev.to/remojansen/from-never-getting-selected-to-a-1-in-3-success-rate-did-ai-help-me-write-better-cfps-or-is-ai-57hc</link>
      <guid>https://dev.to/remojansen/from-never-getting-selected-to-a-1-in-3-success-rate-did-ai-help-me-write-better-cfps-or-is-ai-57hc</guid>
      <description>&lt;p&gt;For years, I was involved in developer advocacy.&lt;/p&gt;

&lt;p&gt;I organised meetups, spoke at many of them, and was invited to conferences by people in my network. At one point, I was even a Microsoft MVP, partly as a result of all that developer advocacy work.&lt;/p&gt;

&lt;p&gt;I had experience. I had technical topics to talk about. I had a network of people who knew me and my work.&lt;/p&gt;

&lt;p&gt;But there was one thing I could never seem to get right: getting selected through a conference Call for Papers (CFP).&lt;/p&gt;

&lt;p&gt;I tried. A lot.&lt;/p&gt;

&lt;p&gt;I submitted proposals to conference after conference, and the result was almost always the same: rejection.&lt;/p&gt;

&lt;p&gt;It was frustrating. I could be invited to speak at a conference by someone who knew my work, yet struggle to get selected when submitting a proposal through the official process.&lt;/p&gt;

&lt;p&gt;Eventually, I started wondering whether the problem was the content of my talks or the way I presented them.&lt;/p&gt;

&lt;p&gt;This year, I tried something different&lt;/p&gt;

&lt;p&gt;Instead of starting with a conference CFP and trying to write a proposal from scratch, I started with something I was already comfortable doing: writing a blog post.&lt;/p&gt;

&lt;p&gt;I would choose a topic I wanted to speak about and write an article about it. Then I would give an AI agent two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My blog post.&lt;/li&gt;
&lt;li&gt;The website of the conference I wanted to submit a proposal to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would ask the agent to use my article as the foundation for a conference proposal, taking the event's audience, themes, and submission guidelines into account.&lt;/p&gt;

&lt;p&gt;The idea was simple: I would focus on the technical content and the ideas I wanted to share, while AI would help me turn them into a proposal tailored to the conference.&lt;/p&gt;

&lt;p&gt;And then something unexpected happened.&lt;/p&gt;

&lt;p&gt;The results changed dramatically&lt;/p&gt;

&lt;p&gt;For years, I had submitted proposals without getting selected.&lt;/p&gt;

&lt;p&gt;With this new approach, I experienced a one-in-three acceptance rate.&lt;/p&gt;

&lt;p&gt;That's a striking difference from my previous experience.&lt;/p&gt;

&lt;p&gt;I can't prove that AI alone caused the improvement. I may have chosen different topics, targeted different conferences, or simply submitted proposals that were a better fit. But the change was significant enough to make me wonder what was really happening.&lt;/p&gt;

&lt;p&gt;Had I finally found a better way to sell my ideas?&lt;/p&gt;

&lt;p&gt;Or was something else going on?&lt;/p&gt;

&lt;p&gt;The question I can't stop asking&lt;/p&gt;

&lt;p&gt;There are two possible explanations that interest me.&lt;/p&gt;

&lt;p&gt;Possibility 1: AI is better at selling my ideas than I am&lt;/p&gt;

&lt;p&gt;Perhaps I was never particularly good at writing conference proposals.&lt;/p&gt;

&lt;p&gt;That doesn't mean I wasn't good at presenting, explaining technical concepts, or engaging an audience. Those are different skills.&lt;/p&gt;

&lt;p&gt;A CFP proposal is a piece of persuasive writing. It has to convince a reviewer that a particular talk deserves a limited slot in a conference programme. It needs to communicate the value of the session, identify its audience, explain what attendees will learn, and distinguish itself from other submissions.&lt;/p&gt;

&lt;p&gt;Maybe I was good at the technical side of developer advocacy but not as good at selling the value of my talks on paper.&lt;/p&gt;

&lt;p&gt;If so, AI is helping me communicate the value of my own ideas more effectively.&lt;/p&gt;

&lt;p&gt;There's nothing inherently wrong with that. We already use editors, colleagues, mentors, and writing tools to improve how we communicate.&lt;/p&gt;

&lt;p&gt;But it does raise an uncomfortable question: how many good talks have been rejected over the years because their authors weren't particularly good at writing CFP proposals?&lt;/p&gt;

&lt;p&gt;How much technical talent have conferences missed because the people evaluating submissions couldn't see the value behind an imperfect abstract?&lt;/p&gt;

&lt;p&gt;Possibility 2: Are the reviewers using AI too?&lt;/p&gt;

&lt;p&gt;Here's where things get more interesting.&lt;/p&gt;

&lt;p&gt;What if the improvement isn't just about AI helping me write better proposals? What if AI is also involved in evaluating them?&lt;/p&gt;

&lt;p&gt;Some conference organisers may use LLMs to help review, summarise, categorise, or shortlist CFP submissions. Others may rely entirely on human reviewers, and many may use a mixture of approaches.&lt;/p&gt;

&lt;p&gt;I don't know whether the conferences that accepted my proposals used AI in their selection processes.&lt;/p&gt;

&lt;p&gt;But if they did, it raises a fascinating possibility.&lt;/p&gt;

&lt;p&gt;Perhaps my AI-generated proposals are better at communicating with the people evaluating them. Or perhaps they are better at matching the language, structure, and criteria that an AI-assisted review process is designed to identify.&lt;/p&gt;

&lt;p&gt;If an LLM helps me frame my proposal and another LLM helps evaluate it, have I improved my communication with the conference organisers, or have I learned to produce something that another AI system is more likely to recognise as a strong submission?&lt;/p&gt;

&lt;p&gt;Those are not necessarily the same thing.&lt;/p&gt;

&lt;p&gt;A proposal can be clear, well structured, and closely aligned with a conference's stated themes without the underlying talk necessarily being more original or valuable.&lt;/p&gt;

&lt;p&gt;Conversely, an excellent talk might be overlooked because its proposal doesn't communicate its strengths effectively.&lt;/p&gt;

&lt;p&gt;Are we getting better at communicating ideas, or just better at optimising the text that gets those ideas selected?&lt;/p&gt;

&lt;p&gt;I don't have an answer. But I think it's a question worth asking.&lt;/p&gt;

&lt;p&gt;Maybe the real problem was never my technical expertise&lt;/p&gt;

&lt;p&gt;There's another possibility: the two explanations aren't mutually exclusive.&lt;/p&gt;

&lt;p&gt;AI may be helping me write better proposals while also making my submissions more aligned with the selection criteria, regardless of whether a human or an AI-assisted process is involved.&lt;/p&gt;

&lt;p&gt;Giving an agent both my article and the conference website provides useful context. Rather than asking it to produce a generic abstract, I'm asking it to connect my ideas to a specific audience and event.&lt;/p&gt;

&lt;p&gt;That could lead to clearer titles, more focused descriptions, more explicit learning outcomes, and a stronger explanation of why the session belongs at that conference.&lt;/p&gt;

&lt;p&gt;These are useful improvements whether the reviewer is a person, an LLM, or a combination of both.&lt;/p&gt;

&lt;p&gt;The important distinction is that a better proposal doesn't automatically mean a better talk. It means the value of the proposed talk may be easier to understand.&lt;/p&gt;

&lt;p&gt;And perhaps that was the missing piece all along.&lt;/p&gt;

&lt;p&gt;How I'd approach this experiment now&lt;/p&gt;

&lt;p&gt;If you're a developer advocate, engineer, technical leader, or aspiring conference speaker, here's the workflow I'd recommend experimenting with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write the article first. Develop the technical ideas in your own words before worrying about selling them.&lt;/li&gt;
&lt;li&gt;Give AI the conference context. Include the conference website, CFP criteria, target audience, and submission requirements.&lt;/li&gt;
&lt;li&gt;Ask for a tailored proposal. Have the agent explain the talk's value to that specific audience, rather than simply summarising your article.&lt;/li&gt;
&lt;li&gt;Review everything yourself. Make sure the proposal is technically accurate, reflects what you'll actually present, and still sounds like you.&lt;/li&gt;
&lt;li&gt;Track the outcomes. Record submissions, acceptances, rejections, topics, and the approach used to create each proposal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If I wanted to investigate the bigger question, I'd go further. I'd compare proposals written entirely by me with AI-assisted versions of the same ideas, ideally across comparable conferences and with enough submissions to draw more meaningful conclusions.&lt;/p&gt;

&lt;p&gt;I'd also want to know how much AI is actually being used in CFP evaluation. Without that information, it's impossible to conclude that AI-assisted submissions are succeeding because they are being evaluated by AI.&lt;/p&gt;

&lt;p&gt;My one-in-three result is an observation, not a controlled experiment.&lt;/p&gt;

&lt;p&gt;But it's an observation that has changed how I approach conference submissions.&lt;/p&gt;

&lt;p&gt;The question I'd like to leave you with&lt;/p&gt;

&lt;p&gt;For years, I struggled to get my proposals accepted despite having experience speaking at meetups, organising communities, and contributing to developer advocacy.&lt;/p&gt;

&lt;p&gt;Then I changed how I created my proposals, introduced AI into the process, and started seeing a very different result.&lt;/p&gt;

&lt;p&gt;Maybe AI is simply helping me communicate my expertise better.&lt;/p&gt;

&lt;p&gt;Maybe it is helping me optimise for a selection process that increasingly involves AI.&lt;/p&gt;

&lt;p&gt;Maybe it's a bit of both.&lt;/p&gt;

&lt;p&gt;I don't know yet.&lt;/p&gt;

&lt;p&gt;But I find the question much more interesting than the simple conclusion that AI can write a better abstract.&lt;/p&gt;

&lt;p&gt;If AI can help us write proposals that get selected, and AI is also helping evaluate proposals, what exactly are we optimising for: better talks, better communication, or better compatibility between AI systems?&lt;/p&gt;

&lt;p&gt;I'd genuinely like to hear from conference organisers, CFP reviewers, and other speakers.&lt;/p&gt;

&lt;p&gt;Are you using LLMs to write or refine your submissions? Are you using them to review submissions? And have you noticed a difference?&lt;/p&gt;

&lt;p&gt;Because I suspect this is a conversation the developer community needs to have.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>techtalks</category>
      <category>community</category>
    </item>
    <item>
      <title>Halo is the new Doom and most software will soon be effectively open source (by force or by choice)</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sun, 18 Oct 2026 21:50:00 +0000</pubDate>
      <link>https://dev.to/remojansen/halo-is-the-new-doom-and-most-software-will-soon-be-effectively-open-source-by-force-or-by-choice-mab</link>
      <guid>https://dev.to/remojansen/halo-is-the-new-doom-and-most-software-will-soon-be-effectively-open-source-by-force-or-by-choice-mab</guid>
      <description>&lt;p&gt;Seven months ago I published &lt;a href="https://dev.to/remojansen/source-code-is-now-a-common-good-and-saas-is-mostly-dead-gke"&gt;“Source code is now a common good, and SaaS is mostly dead.”&lt;/a&gt; I argued that AI had collapsed the economic cost of clean-room reimplementation, that pure software expression was losing its scarcity, and that the SaaS model built on high-margin code would face an existential squeeze—except where real data moats or network effects remained.&lt;/p&gt;

&lt;p&gt;I was wrong about the timeline.&lt;br&gt;&lt;br&gt;
It didn’t take five to ten years.&lt;br&gt;&lt;br&gt;
This month the premonition became visible reality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Halo everywhere — including 100+ player co-op on PC
&lt;/h3&gt;

&lt;p&gt;In the space of a few days we watched &lt;em&gt;Halo: Combat Evolved&lt;/em&gt; appear on platforms it was never meant for, and get radically expanded where it already existed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Halo 64&lt;/strong&gt; (Jack Tulli) — a playable multiplayer (and emerging campaign) port running on real Nintendo 64 hardware. Built on the halo-ce-universal decompilation, with a custom renderer, four-player split-screen, the original 13 maps, bots, classic modes, and even a Firefight mode the original Xbox version never had. Claude assisted heavily in the coding.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Halo: Dreamcast Evolved&lt;/strong&gt; — extended gameplay of the Pillar of Autumn and other levels running on actual Dreamcast hardware. The CPU is more than three times slower and the system has a quarter of the RAM of the original Xbox, so performance is still rough, but the core systems are already ported and being optimized in public.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native PC (and beyond) with massively expanded player counts&lt;/strong&gt; — the same decompilation work that enabled the console ports also produced native Windows, Linux, and Android builds (OpenCE / halo-ce-universal and related projects). These support system-link / online multiplayer for up to &lt;strong&gt;128 players&lt;/strong&gt;. Campaign co-op limits have been raised as well; 32-player campaign co-op is already being demonstrated, with work continuing toward the same high player counts. Browser versions of the original Xbox game have also appeared with 128-player rooms and split-screen co-op.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not asset flips or simple ports. They rest on prior decompilation work that reached near byte-matching fidelity. What changed is the speed of the remaining work. A single developer (or small team) plus modern agents can now finish the last mile—new renderer, platform integration, expanded netcode, extra modes—in days or weeks instead of years. The result is a franchise that once defined the Xbox suddenly running on N64, Dreamcast, modern PCs, phones, and browsers, with player counts the original hardware could never support.&lt;/p&gt;

&lt;p&gt;Halo is becoming the new Doom: the game that runs on everything, because the barriers that used to stop it have collapsed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demon's Souls Remake: from ~1 FPS to 60+ (and nearly 120) in roughly a month
&lt;/h3&gt;

&lt;p&gt;PS5 emulation provided the other high-visibility stress test.  &lt;/p&gt;

&lt;p&gt;In early September, &lt;em&gt;Demon's Souls Remake&lt;/em&gt; on KyTyPS5 and its forks was crawling at 1–2 FPS even on top-tier hardware after finally reaching in-game states. Within days it jumped into the 10–18 FPS range. By mid-September temporary 30 FPS markers appeared. By mid-October, custom builds were delivering over 60 FPS at 1440p with original PS5 graphics settings on an RTX 5070 + Ryzen 7 9800X3D, and approaching 120 FPS with DLSS Frame Generation. The full game had already become completable earlier in the month.&lt;/p&gt;

&lt;p&gt;The historical pace of console emulation does not look like this.&lt;/p&gt;

&lt;h3&gt;
  
  
  REA — Reverse Engineer Anything
&lt;/h3&gt;

&lt;p&gt;While the ports and the emulator were making noise, a different tool exploded: &lt;strong&gt;REA&lt;/strong&gt; (morluto/rea).  &lt;/p&gt;

&lt;p&gt;An MCP server and CLI that lets coding agents (Claude Code, Codex, Cursor, and others) reverse-engineer applications, native binaries, websites, and runtime behavior without source code. It orchestrates existing tools (Ghidra, Hopper, IDA, browser instrumentation) and returns evidence-backed explanations. In roughly two weeks it accumulated hundreds of thousands of stars.&lt;/p&gt;

&lt;p&gt;The practical effect is that an agent can now be pointed at a feature and produce a usable understanding plus a path to independent reimplementation. Combined with the clean-room pattern I described in March, the barrier between “I can observe the behavior” and “I can recreate the behavior under a different license or on different hardware” continues to fall.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Adobe and Office “Craft” ports — imperfect, but the signal is loud
&lt;/h3&gt;

&lt;p&gt;Early October also brought the ArtCraft projects (led by Brandon Thomas): open-source, Rust-based applications described as clean-room reimplementations of major Adobe tools — PhotoCraft (Photoshop), FilmCraft (Premiere), LightCraft (Lightroom), and equivalents for Illustrator, After Effects, InDesign, and Acrobat. Built with heavy assistance from Claude.  &lt;/p&gt;

&lt;p&gt;A few days later the same effort expanded to Microsoft Office: WordCraft, GridCraft (Excel), and DeckCraft (PowerPoint).&lt;/p&gt;

&lt;p&gt;None of these are finished products. The teams themselves rate them as early alpha—feature parity and “ready for real work” numbers typically sit in the 45–60% range depending on the metric and app. File compatibility, edge cases, and polish remain incomplete.  &lt;/p&gt;

&lt;p&gt;They are imperfect. That is exactly why they matter as signals.  &lt;/p&gt;

&lt;p&gt;These are public demonstrations that a small team + frontier models can now produce recognizable, runnable, file-compatible approximations of two of the most heavily protected, highest-margin software suites in existence in a matter of weeks. The UI patterns, core workflows, and file formats that previously required years of specialized effort are being reconstructed rapidly enough that the projects are already usable for lighter tasks and improving in public view.&lt;/p&gt;

&lt;h3&gt;
  
  
  What these stories share
&lt;/h3&gt;

&lt;p&gt;They are not isolated stunts. They are symptoms of the same underlying shift I described in March:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decompilation and reverse-engineering tooling has matured.
&lt;/li&gt;
&lt;li&gt;Frontier models are competent enough at low-level and systems code to accelerate the remaining human work dramatically.
&lt;/li&gt;
&lt;li&gt;Agentic workflows (and tools like REA) make the process more systematic and less dependent on rare specialist knowledge.
&lt;/li&gt;
&lt;li&gt;The economic cost of “make a working version of X on platform Y” or “understand how Z is implemented so I can rebuild it” has collapsed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where is this going?
&lt;/h3&gt;

&lt;p&gt;In the original article I concluded that most software would become effectively open source—by force or by choice—and that the only sustainable thing left to charge for would be convenience. I was thinking primarily about SaaS. I had not fully considered how the same forces would hit other markets.&lt;/p&gt;

&lt;p&gt;Now that I am watching it play out in games, I think the game industry is even more exposed.&lt;/p&gt;

&lt;p&gt;AAA studios were already struggling with rising costs, risk-averse sequels, live-service fatigue, and audience fragmentation. The ability to rapidly reimplement, port, expand, and redistribute games—especially older or mid-tier titles—removes one of the remaining economic moats: the difficulty of making a working version exist somewhere else. When a decompiled classic can run on N64, Dreamcast, phones, browsers, and PCs with 128-player lobbies within weeks of the tooling maturing, the value of exclusive platform deals, long development cycles, and even some forms of DRM starts to look fragile.&lt;/p&gt;

&lt;p&gt;Even games that embrace community content and modding are not automatically safe. Modding communities have historically extended the life of games; the new tools accelerate both the creation of those mods and the independent recreation of the underlying experience itself. The distinction between “official” and “community” versions becomes harder to maintain when the technical barrier to a full alternative keeps falling.&lt;/p&gt;

&lt;p&gt;The original prediction still holds, only broader:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most software will become effectively open source—by force (because protection becomes impractical) or by choice (because fighting it is more expensive than adapting).
&lt;/li&gt;
&lt;li&gt;The residual value will concentrate in convenience, operations, trust, data network effects, real-time services, and experiences that cannot be trivially recreated offline or offline-first.
&lt;/li&gt;
&lt;li&gt;Pure expression of code, whether in a SaaS dashboard or a single-player campaign, loses scarcity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For games this may prove especially brutal. The industry already operates on high fixed costs and hit-driven economics. If the cost of independent recreation and redistribution keeps collapsing, the pressure on traditional publishing and exclusivity models will intensify. Some studios will adapt by doubling down on live services, social layers, competitive integrity, and continuous content that is hard to mirror. Others will not.&lt;/p&gt;

&lt;p&gt;Seven months ago I wrote that source code was becoming a common good and that SaaS was mostly dead.&lt;br&gt;&lt;br&gt;
This month Halo became the new Doom, emulators jumped from 1 FPS to 100, reverse-engineering agents went mainstream, and clean-room approximations of Adobe and Office appeared in public.  &lt;/p&gt;

&lt;p&gt;The direction is clearer than it was in March.&lt;br&gt;&lt;br&gt;
Most software will soon be effectively open source—by force or by choice.&lt;br&gt;&lt;br&gt;
The only remaining question is how many markets realize it in time to adapt.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>saas</category>
    </item>
    <item>
      <title>SDLC != ADLC != ASDLC</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sat, 17 Oct 2026 23:38:50 +0000</pubDate>
      <link>https://dev.to/remojansen/sdlc-adlc-asdlc-4057</link>
      <guid>https://dev.to/remojansen/sdlc-adlc-asdlc-4057</guid>
      <description>&lt;p&gt;I recently came across this definition:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Agentic Development Lifecycle (ADLC)—also known as the Agent Software Development Lifecycle—is a software engineering methodology designed for building, testing, deploying, and governing AI agent systems rather than traditional deterministic code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sentence made something click. A lot of people (myself included, until recently) have been casually treating &lt;strong&gt;ADLC&lt;/strong&gt; and &lt;strong&gt;ASDLC&lt;/strong&gt; as interchangeable. They’re not.&lt;/p&gt;

&lt;p&gt;Once you separate them, the confusion starts to dissolve.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Three Terms, Cleanly Separated
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Full Name&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Primary focus&lt;/th&gt;
&lt;th&gt;What is being built?&lt;/th&gt;
&lt;th&gt;Who does most of the work?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDLC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Software Development Lifecycle&lt;/td&gt;
&lt;td&gt;The classic methodology for building software&lt;/td&gt;
&lt;td&gt;Deterministic systems&lt;/td&gt;
&lt;td&gt;Traditional applications &amp;amp; services&lt;/td&gt;
&lt;td&gt;Humans (tools assist)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ADLC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent / Agentic Development Lifecycle&lt;/td&gt;
&lt;td&gt;A specialized lifecycle for creating AI agents&lt;/td&gt;
&lt;td&gt;Probabilistic, tool-using, adaptive systems&lt;/td&gt;
&lt;td&gt;AI agents and multi-agent systems&lt;/td&gt;
&lt;td&gt;Mixed (humans + agents), with heavy emphasis on evaluation &amp;amp; governance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASDLC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agentic Software Development Lifecycle&lt;/td&gt;
&lt;td&gt;The traditional SDLC performed &lt;em&gt;with&lt;/em&gt; AI agents as workers&lt;/td&gt;
&lt;td&gt;Any software, delivered agentically&lt;/td&gt;
&lt;td&gt;Applications, services, infrastructure… or even agents&lt;/td&gt;
&lt;td&gt;Agents execute; humans set intent, guardrails, and approve&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why the Mix-Up Happens
&lt;/h3&gt;

&lt;p&gt;Both terms contain the words “Agentic” and “Development Lifecycle,” so people collapse them. On top of that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some writers use “ADLC” loosely to mean “the new way we develop software now that agents exist.”&lt;/li&gt;
&lt;li&gt;Others (IBM, Arthur.ai, Glean, Atlan, etc.) use ADLC more precisely: the lifecycle &lt;em&gt;for building agents themselves&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Meanwhile, “Agentic SDLC” / ASDLC has become the clearer label for “we’re using agents to ship regular software.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a muddy conversation where people argue past each other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the Distinction Actually Matters
&lt;/h3&gt;

&lt;p&gt;If you’re building an &lt;strong&gt;agent&lt;/strong&gt;, you care about different things than if you’re using agents to build a normal product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Non-determinism and evaluation harnesses become first-class concerns.&lt;/li&gt;
&lt;li&gt;Observability, containment, and continuous behavioral monitoring matter more than classic “green tests.”&lt;/li&gt;
&lt;li&gt;The “done” state is fuzzier. Agents keep running and adapting after deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treating that work with a regular (or even agent-assisted) SDLC often leads to brittle agents that look good in demos and then drift or fail in production.&lt;/p&gt;

&lt;p&gt;Conversely, if you’re just trying to ship a web app or an internal tool faster with coding agents, you don’t necessarily need the full ADLC machinery. You need a well-governed &lt;strong&gt;ASDLC&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Mental Model
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SDLC&lt;/strong&gt; → Building normal software the old way
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ADLC&lt;/strong&gt; → Building &lt;em&gt;agents&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ASDLC&lt;/strong&gt; → Building &lt;em&gt;anything&lt;/em&gt; (including agents) &lt;em&gt;with&lt;/em&gt; agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you start using the terms this way, a lot of the current discourse becomes much clearer.&lt;/p&gt;

&lt;p&gt;Have you noticed the same mixing of ADLC and ASDLC in your circles? I’d love to hear how your team is currently labeling these ideas.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>agents</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Agentic Manifesto: What Should the Agile Manifesto Look Like in the Age of AI?</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sat, 17 Oct 2026 01:40:40 +0000</pubDate>
      <link>https://dev.to/remojansen/the-agentic-manifesto-what-should-the-agile-manifesto-look-like-in-the-age-of-ai-3k1g</link>
      <guid>https://dev.to/remojansen/the-agentic-manifesto-what-should-the-agile-manifesto-look-like-in-the-age-of-ai-3k1g</guid>
      <description>&lt;p&gt;I've been spending a lot of time thinking about where all the recent advancements in AI are going to take the software industry.&lt;/p&gt;

&lt;p&gt;Not just what AI coding agents mean for developers today, or how much faster we can write code, but what happens when these capabilities fundamentally change the economics of building software.&lt;/p&gt;

&lt;p&gt;Over the last few months, I've written about several aspects of this transformation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/from-rigidity-to-explicitness-how-ai-changes-the-role-of-constraints-in-software-5cp5"&gt;From Rigidity to Explicitness: How AI Changes the Role of Constraints in Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/the-industrial-revolution-of-software-is-here-14f6"&gt;The Industrial Revolution of Software Is Here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632"&gt;When Code Gets Cheap, Verification Becomes Expensive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5"&gt;Revisiting the Toyota Production System in the Age of Coding Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/scrum-is-finally-dead-and-we-have-to-thank-coding-agents-for-that-18bi"&gt;Scrum Is Finally Dead, and We Have to Thank Coding Agents for That&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/maye-enterprise-software-doesnt-have-to-suck-anymore-2163"&gt;Maybe Enterprise Software Doesn't Have to Suck Anymore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/source-code-is-now-a-common-good-and-saas-is-mostly-dead-gke"&gt;Source Code Is Now a Common Good, and SaaS Is Mostly Dead&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each article explores a different part of the same transformation. Together, they've led me to a bigger question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If AI agents fundamentally change how we build software, should we reconsider the principles that guide how we develop it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think the answer is yes.&lt;/p&gt;

&lt;p&gt;And I thought it would be interesting to start a conversation about what the Agile Manifesto might look like today, in a world where AI agents are becoming increasingly capable of building software autonomously.&lt;/p&gt;

&lt;p&gt;This is an attempt to start that conversation. It's not a declaration that I've figured everything out, and it's certainly not an argument that everything Agile taught us is suddenly wrong.&lt;/p&gt;

&lt;p&gt;Quite the opposite. I think many of the original Agile values remain as relevant as ever. But the context in which we apply them is changing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why revisit the Agile Manifesto?
&lt;/h2&gt;

&lt;p&gt;The Agile Manifesto was written in 2001, when software development was a very different activity.&lt;/p&gt;

&lt;p&gt;Its authors challenged heavyweight processes, excessive documentation, rigid plans, and organisational structures that often got in the way of delivering working software.&lt;/p&gt;

&lt;p&gt;They established four values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individuals and interactions over processes and tools.&lt;/li&gt;
&lt;li&gt;Working software over comprehensive documentation.&lt;/li&gt;
&lt;li&gt;Customer collaboration over contract negotiation.&lt;/li&gt;
&lt;li&gt;Responding to change over following a plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These values helped shape how an entire generation of engineers and organisations approached software development.&lt;/p&gt;

&lt;p&gt;But consider what happens when AI agents can implement features, modify existing systems, generate tests, refactor code, and work across entire codebases with increasingly little human intervention.&lt;/p&gt;

&lt;p&gt;The bottleneck starts to move.&lt;/p&gt;

&lt;p&gt;Writing code becomes cheaper. Producing multiple implementations becomes easier. Experimenting with different approaches becomes more affordable.&lt;/p&gt;

&lt;p&gt;But we still need to know whether the software does what we intended, whether it introduces vulnerabilities, whether it behaves correctly in production, and whether it actually solves the customer's problem.&lt;/p&gt;

&lt;p&gt;In many cases, the harder problem is no longer producing a solution. It's establishing that the solution is worth trusting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When code gets cheap, verification becomes expensive.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is not simply a tooling change. It has consequences for team structures, software architecture, engineering practices, product discovery, and the economics of custom software.&lt;/p&gt;

&lt;p&gt;If we can produce software at a rate that exceeds our ability to verify and maintain it, then increasing development capacity alone will not solve our problems.&lt;/p&gt;

&lt;p&gt;We need to rethink the system in which software is produced.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Agile to Agentic
&lt;/h2&gt;

&lt;p&gt;I don't think the answer is to discard Agile and replace it with a methodology that prescribes how to use AI coding agents.&lt;/p&gt;

&lt;p&gt;That would miss the point.&lt;/p&gt;

&lt;p&gt;The more interesting question is whether the underlying values and principles of software development should evolve to reflect this new reality.&lt;/p&gt;

&lt;p&gt;Here are some of the shifts I believe deserve our attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. From producing software to verifying outcomes
&lt;/h3&gt;

&lt;p&gt;Working software was a major improvement over plans and documents as a measure of progress.&lt;/p&gt;

&lt;p&gt;But in an agentic world, generating working code is becoming easier. Even passing tests does not necessarily mean we've built the right thing.&lt;/p&gt;

&lt;p&gt;We need to focus on verified outcomes: software that demonstrably satisfies its requirements, behaves within its intended constraints, and delivers value to customers.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. From implicit assumptions to explicit intent
&lt;/h3&gt;

&lt;p&gt;AI agents can operate with considerable autonomy, but they need to understand what they are trying to achieve and what they must not do.&lt;/p&gt;

&lt;p&gt;Constraints, specifications, architectural boundaries, acceptance criteria, and executable policies become increasingly valuable because they make intent easier to interpret and verify.&lt;/p&gt;

&lt;p&gt;Explicitness isn't the ultimate goal. It's a means of achieving more reliable outcomes while enabling greater autonomy.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. From supervising implementation to designing autonomous systems
&lt;/h3&gt;

&lt;p&gt;When humans perform most implementation work, we organise teams around people writing, reviewing, and integrating code.&lt;/p&gt;

&lt;p&gt;When agents can do much of that work, we need to think differently about the development system itself.&lt;/p&gt;

&lt;p&gt;How much autonomy can we safely support? Which decisions require human judgment? Where should verification happen? How do we prevent failures from propagating?&lt;/p&gt;

&lt;p&gt;The goal should not be to remove humans from software development. It should be to use human judgment, creativity, and ownership where they matter most.&lt;/p&gt;

&lt;p&gt;We may end up with fewer engineers who can accomplish significantly more, but also carry greater responsibility for the systems they create and operate.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. From optimising implementation to optimising the whole system
&lt;/h3&gt;

&lt;p&gt;The Toyota Production System offers a useful perspective here.&lt;/p&gt;

&lt;p&gt;Improving the productivity of an individual step does not necessarily improve the performance of the entire system.&lt;/p&gt;

&lt;p&gt;If agents produce code ten times faster but verification, integration, and maintenance remain unchanged, we may simply create a larger queue of work waiting for those activities.&lt;/p&gt;

&lt;p&gt;We need to optimise the flow of verified value, not the volume of code generated.&lt;/p&gt;

&lt;p&gt;With these ideas in mind, I started wondering what a new manifesto might look like.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Agentic Manifesto
&lt;/h1&gt;

&lt;p&gt;We are uncovering better ways of developing software by building with intelligent agents and learning from the systems in which they operate.&lt;/p&gt;

&lt;p&gt;Through this work, we have come to value:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verified outcomes over generated output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicit intent over implicit assumptions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human judgment and ownership over human supervision&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safe, continuous flow over controlled, sequential handoffs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is, while there is value in the items on the right, we value the items on the left more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principles behind the Agentic Manifesto
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;We follow these principles:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Our highest priority is to deliver valuable, verified outcomes to customers through early and continuous delivery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal is not to produce more code, complete more tasks, or deploy more agents. It is to solve meaningful problems and establish that we've solved them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Welcome changing requirements and new information. Design systems that make change cheap, verifiable, and reversible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI makes experimentation and implementation cheaper. We should take advantage of that flexibility while ensuring that changes can be evaluated and corrected without creating unnecessary risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Deliver working software frequently, with automated verification integrated throughout development.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Short feedback loops remain essential. Agents should be able to implement, test, evaluate, and refine changes continuously rather than generating large quantities of code that must be reviewed later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Make intent explicit enough for humans and agents to understand what must be achieved and what must never be violated.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Requirements, constraints, invariants, acceptance criteria, and architectural boundaries should be expressed clearly and made executable wherever practical. Explicitness enables autonomy; it does not eliminate the need for judgment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Build verification into the development process, and require evidence proportional to the consequences of failure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quality should not depend on hoping that generated code is correct or relying exclusively on human review. Use automated tests, static analysis, security checks, formal methods, runtime monitoring, and independent evaluation where appropriate. Higher-risk changes require stronger evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Build quality into the production system rather than relying on inspection at the end.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Detect abnormalities as early as possible, prevent defects from propagating, and stop work when critical verification fails. A system that produces code faster but allows defects to accumulate is not a better system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Give agents the maximum autonomy that can be safely supported by explicit boundaries, reliable feedback, and effective controls.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Autonomy should be earned through evidence and constrained by risk. Agents should be able to make routine decisions independently while respecting permissions, architectural rules, operational limits, and escalation requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Preserve human judgment, creativity, and ownership as the capabilities of autonomous systems increase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Delegate implementation, not responsibility. Humans should focus on defining problems, resolving ambiguity, making consequential decisions, and taking accountability for outcomes. Greater leverage demands greater responsibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Learn continuously from customers and from the behaviour of software in production.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Specifications and tests cannot anticipate everything. Real usage, operational signals, incidents, and customer feedback must inform both the software and the system that produces it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Prefer simplicity and maintainability over unnecessary complexity, even when implementation is cheap.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The fact that an agent can generate a feature quickly does not mean we should build it. Every additional feature, abstraction, dependency, and architectural decision creates potential costs that extend beyond implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Optimise for the flow of verified value, not the utilisation of people, the volume of generated code, or the number of agents deployed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A productive system minimises unnecessary queues, handoffs, rework, and delays between an idea and a verified outcome. Increasing output without improving the entire system merely moves the bottleneck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Continuously improve the system that produces software.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every defect, failed verification, production incident, and unexpected agent behaviour is an opportunity to improve our specifications, constraints, tests, architecture, and feedback loops. The production system itself must evolve as our capabilities change.&lt;/p&gt;




&lt;h2&gt;
  
  
  What does this mean for the future of software development?
&lt;/h2&gt;

&lt;p&gt;I believe AI is changing more than the productivity of individual developers.&lt;/p&gt;

&lt;p&gt;It is changing the economics of software itself.&lt;/p&gt;

&lt;p&gt;If code becomes a common good, the ability to produce an implementation becomes a weaker competitive advantage. The value shifts towards understanding problems, delivering differentiated outcomes, possessing valuable data and distribution, operating reliable services, and establishing trust.&lt;/p&gt;

&lt;p&gt;This could fundamentally change enterprise software.&lt;/p&gt;

&lt;p&gt;Organisations may increasingly build and adapt software around their own needs instead of accepting the limitations, complexity, and cost of generic products. Custom software that was previously too expensive to justify could become economically viable.&lt;/p&gt;

&lt;p&gt;But this future won't be realised simply by giving everyone access to coding agents.&lt;/p&gt;

&lt;p&gt;We need production systems that can support the resulting increase in output without sacrificing correctness, security, maintainability, or human accountability.&lt;/p&gt;

&lt;p&gt;That's why I think verification should sit at the centre of an Agentic Manifesto.&lt;/p&gt;

&lt;p&gt;Not because every line of code needs a formal proof, or because humans should spend their days supervising machines, but because the ability to produce software is becoming less scarce while the ability to establish that software is correct, valuable, and safe remains essential.&lt;/p&gt;

&lt;p&gt;The opportunity is to build systems that let us produce more valuable software with less unnecessary effort, while increasing our confidence in what we deliver.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you think?
&lt;/h2&gt;

&lt;p&gt;This is a first attempt, and I'm very interested in hearing what others think.&lt;/p&gt;

&lt;p&gt;A few questions I'd particularly like to explore with the community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Are we approaching a point where the Agile Manifesto needs a successor, or are its original values sufficient for the agentic era?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Is verification the right centre of gravity for a new manifesto, or am I overestimating its importance?&lt;/li&gt;
&lt;li&gt;What should happen to team structures and engineering roles when a smaller number of engineers can direct much larger amounts of autonomous work?&lt;/li&gt;
&lt;li&gt;If code becomes a commodity, where will the sustainable competitive advantage in software actually come from?&lt;/li&gt;
&lt;li&gt;Which of these 12 principles would you change, remove, or add?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm especially interested in disagreements and alternative perspectives. I'd rather have these ideas challenged now than present a polished manifesto that fails to address the real problems we will face.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Agentic Manifesto isn't a finished answer. It's an invitation to work out what software development should become next.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What would you change?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Mutation Testing with TypeScript: How to Verify Your Tests in the Age of AI Coding Agents</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Wed, 14 Oct 2026 22:28:14 +0000</pubDate>
      <link>https://dev.to/remojansen/mutation-testing-with-typescript-how-to-verify-your-tests-in-the-age-of-ai-coding-agents-neh</link>
      <guid>https://dev.to/remojansen/mutation-testing-with-typescript-how-to-verify-your-tests-in-the-age-of-ai-coding-agents-neh</guid>
      <description>&lt;p&gt;&lt;strong&gt;Your tests pass. But would they catch a bug?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine asking an AI coding agent to implement a feature. A few minutes later, it has generated the implementation, written unit tests, and opened a pull request.&lt;/p&gt;

&lt;p&gt;The CI pipeline is green. All tests pass. Code coverage looks good.&lt;/p&gt;

&lt;p&gt;Can you trust the change?&lt;/p&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;The implementation and its tests may share the same misunderstanding of the requirements. The tests might execute every line without checking the behavior that matters. And a test suite that passes today might not detect a regression tomorrow.&lt;/p&gt;

&lt;p&gt;As AI makes code generation faster, we need to think more carefully about how we verify the code we produce.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll explore one technique that can help: &lt;strong&gt;mutation testing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We'll build a small TypeScript project, introduce a bug deliberately, install StrykerJS, and use mutation testing to discover weaknesses in our tests. Then we'll explore how the same technique can help us verify AI-generated pull requests.&lt;/p&gt;

&lt;p&gt;By the end, you'll understand not just how mutation testing works, but why it can become an important part of a multi-layer verification strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Let's start with a simple problem
&lt;/h2&gt;

&lt;p&gt;Imagine we're building an online shop. One of our business rules is that orders worth £100 or more qualify for free shipping.&lt;/p&gt;

&lt;p&gt;Let's implement that rule in TypeScript.&lt;/p&gt;

&lt;p&gt;Create a file named &lt;code&gt;src/shipping.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;orderTotal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;orderTotal&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Orders below £100 pay £10 shipping.&lt;/li&gt;
&lt;li&gt;Orders worth £100 or more get free shipping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now let's write some unit tests.&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;src/shipping.test.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vitest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;calculateShipping&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./shipping&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calculateShipping&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;charges shipping for small orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;offers free shipping for large orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx vitest run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both tests pass.&lt;/p&gt;

&lt;p&gt;Great! We have an implementation, some unit tests, and a green test suite.&lt;/p&gt;

&lt;p&gt;But let's ask a slightly different question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would happen if somebody accidentally changed &lt;code&gt;&amp;gt;=&lt;/code&gt; to &lt;code&gt;&amp;gt;&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our implementation would become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;orderTotal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;orderTotal&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now an order worth exactly £100 is charged shipping, even though the requirement says it should qualify for free shipping.&lt;/p&gt;

&lt;p&gt;We've introduced a bug.&lt;/p&gt;

&lt;p&gt;Run the existing tests again.&lt;/p&gt;

&lt;p&gt;They still pass!&lt;/p&gt;

&lt;p&gt;Why? Because we tested orders worth £50 and £150, but we never tested the boundary at £100.&lt;/p&gt;

&lt;p&gt;Our tests execute the function, but they don't distinguish the correct implementation from this incorrect one.&lt;/p&gt;

&lt;p&gt;This is the problem mutation testing helps us investigate.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What is mutation testing?
&lt;/h2&gt;

&lt;p&gt;Mutation testing is a technique for evaluating how effectively your tests detect certain defects.&lt;/p&gt;

&lt;p&gt;Instead of simply running your tests against your implementation, a mutation-testing tool deliberately makes small changes to your production code and runs the tests against each modified version.&lt;/p&gt;

&lt;p&gt;These changes are called &lt;em&gt;mutations&lt;/em&gt;. Each modified version is called a &lt;em&gt;mutant&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For example, a mutation-testing tool might make changes such as:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Original code&lt;/th&gt;
&lt;th&gt;Mutated code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a &amp;gt;= b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a &amp;gt; b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a + b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a - b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;isValid &amp;amp;&amp;amp; isActive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`isValid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{% raw %}&lt;code&gt;return true&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;return false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The tool then observes whether your tests detect the change.&lt;/p&gt;

&lt;p&gt;There are two particularly important outcomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Killed mutant:&lt;/strong&gt; At least one test fails because of the mutation. Your tests detected the change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Survived mutant:&lt;/strong&gt; The tests still pass. Your tests didn't detect the change.&lt;/p&gt;

&lt;p&gt;Let's apply this to our shipping example.&lt;/p&gt;

&lt;p&gt;The original implementation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;orderTotal&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A mutant changes it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;orderTotal&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our existing tests still pass, so the mutant survives.&lt;/p&gt;

&lt;p&gt;That's a useful finding. It tells us that the test suite doesn't distinguish these two implementations.&lt;/p&gt;

&lt;p&gt;Notice what we're evaluating: we're not simply asking whether the implementation works for our current examples. We're asking whether the tests can detect selected changes that might introduce defects.&lt;/p&gt;

&lt;p&gt;This is a different question from ordinary unit testing and code coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Code coverage isn't the same as test effectiveness
&lt;/h2&gt;

&lt;p&gt;You may already measure code coverage in your projects.&lt;/p&gt;

&lt;p&gt;Coverage tells you which parts of your code were executed during testing. It's useful, but it doesn't necessarily tell you whether your assertions are strong enough.&lt;/p&gt;

&lt;p&gt;Consider this test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calculates shipping&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function executes. Depending on the coverage measurement, the test may contribute to branch or line coverage.&lt;/p&gt;

&lt;p&gt;But the test doesn't assert the expected result.&lt;/p&gt;

&lt;p&gt;The implementation could return £10 instead of £0, and the test would still pass.&lt;/p&gt;

&lt;p&gt;Now consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;offers free shipping at exactly £100&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This test checks the actual business rule.&lt;/p&gt;

&lt;p&gt;It also kills our mutant because the mutated implementation returns £10.&lt;/p&gt;

&lt;p&gt;We can summarize the difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code coverage:&lt;/strong&gt; Did our tests execute this code?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assertions:&lt;/strong&gt; Did our tests verify the expected behavior?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutation testing:&lt;/strong&gt; Would our tests detect selected changes to the implementation?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These techniques complement each other. Mutation testing doesn't replace coverage, and a mutation score doesn't prove correctness. Together, however, they can provide more useful evidence about the effectiveness of a test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Let's set up StrykerJS
&lt;/h2&gt;

&lt;p&gt;We'll use &lt;a href="https://stryker-mutator.io/" rel="noopener noreferrer"&gt;StrykerJS&lt;/a&gt;, a mutation-testing framework for JavaScript and TypeScript.&lt;/p&gt;

&lt;p&gt;We'll assume you already have Node.js and npm installed.&lt;/p&gt;

&lt;p&gt;If you're following along from scratch, create a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;mutation-testing-demo
&lt;span class="nb"&gt;cd &lt;/span&gt;mutation-testing-demo
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install TypeScript and Vitest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; typescript vitest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the &lt;code&gt;src&lt;/code&gt; directory and add the two files from the previous sections.&lt;/p&gt;

&lt;p&gt;Now run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx vitest run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure your tests pass before continuing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Initialize StrykerJS
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx stryker init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow the prompts to configure Stryker for your project. Select TypeScript and the Vitest test runner where applicable.&lt;/p&gt;

&lt;p&gt;Stryker's setup options can vary with the version and project configuration, so follow the current prompts rather than assuming every project requires an identical configuration.&lt;/p&gt;

&lt;p&gt;Official documentation: &lt;a href="https://stryker-mutator.io/docs/stryker-js/getting-started/" rel="noopener noreferrer"&gt;StrykerJS — Getting Started&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once initialization is complete, inspect the generated configuration and make sure the mutation scope includes our production file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/shipping.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our test file, &lt;code&gt;src/shipping.test.ts&lt;/code&gt;, should not be treated as production code to mutate.&lt;/p&gt;

&lt;p&gt;You can configure the mutation scope explicitly if necessary. For example, in a TypeScript Stryker configuration, the relevant pattern might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;mutate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/**/*.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;!src/**/*.test.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the configuration generated by your installed version as the starting point, and adapt it to your repository's conventions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run your first mutation test
&lt;/h3&gt;

&lt;p&gt;Execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx stryker run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stryker will run your tests, generate mutations in the configured production code, and evaluate the results.&lt;/p&gt;

&lt;p&gt;The first run may take longer than your ordinary unit tests because Stryker needs to evaluate multiple mutants.&lt;/p&gt;

&lt;p&gt;Once it finishes, inspect the terminal output and generated HTML report.&lt;/p&gt;

&lt;p&gt;Look for surviving mutants associated with the comparison in &lt;code&gt;calculateShipping&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the comparison changes from &lt;code&gt;&amp;gt;=&lt;/code&gt; to &lt;code&gt;&amp;gt;&lt;/code&gt; and all our tests still pass, we've found the weakness we deliberately introduced.&lt;/p&gt;

&lt;p&gt;Congratulations: you've just used mutation testing to discover a gap in your test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Understand the mutation report
&lt;/h2&gt;

&lt;p&gt;A mutation report contains more than just a score.&lt;/p&gt;

&lt;p&gt;The most useful outcomes to understand are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Killed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A test detected the mutation and failed. This is generally what we want for a meaningful behavioral change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Survived&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tests passed despite the mutation. Investigate whether this reveals missing test coverage or an assertion that doesn't adequately verify the requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No coverage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mutated code wasn't exercised by the relevant tests. You may need to investigate whether the code is tested at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeout&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tool couldn't obtain a normal result within its configured time limit. This doesn't necessarily mean your tests detected the mutation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Equivalent mutant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mutation doesn't change observable behavior for the relevant inputs. No meaningful test can distinguish it from the original implementation.&lt;/p&gt;

&lt;p&gt;Not every surviving mutant is a defect, and not every mutant needs to be killed. Some mutations are equivalent, some aren't meaningful for your requirements, and some may reveal behavior you don't actually need to constrain.&lt;/p&gt;

&lt;p&gt;The purpose of the report is to help you make better decisions about your tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about the mutation score?
&lt;/h3&gt;

&lt;p&gt;Stryker calculates a mutation score based on the results of mutation testing.&lt;/p&gt;

&lt;p&gt;A simplified formula is:&lt;/p&gt;

&lt;p&gt;Mutation score = killed mutants / valid mutants × 100%&lt;/p&gt;

&lt;p&gt;For example, suppose a run produces 100 valid mutants and your tests kill 80 of them. The mutation score is 80%.&lt;/p&gt;

&lt;p&gt;That can be a useful signal, but be careful about treating it as a universal quality metric.&lt;/p&gt;

&lt;p&gt;Two projects can have the same mutation score while having very different levels of risk. The score depends on the mutations generated, the code being analyzed, and which results are excluded.&lt;/p&gt;

&lt;p&gt;A surviving mutation in payment authorization may matter much more than a surviving mutation in an unimportant formatting helper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus on understanding meaningful surviving mutants, not maximizing a percentage at any cost.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Improve the tests and run mutation testing again
&lt;/h2&gt;

&lt;p&gt;Let's fix the weakness we discovered.&lt;/p&gt;

&lt;p&gt;Our business rule is explicit: orders worth £100 or more qualify for free shipping.&lt;/p&gt;

&lt;p&gt;We should test the boundary directly.&lt;/p&gt;

&lt;p&gt;Add this test to &lt;code&gt;src/shipping.test.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;offers free shipping at exactly £100&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the ordinary test suite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx vitest run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test passes against the correct implementation.&lt;/p&gt;

&lt;p&gt;Now run mutation testing again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx stryker run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mutation that changes &lt;code&gt;&amp;gt;=&lt;/code&gt; to &lt;code&gt;&amp;gt;&lt;/code&gt; should now be killed by the boundary test.&lt;/p&gt;

&lt;p&gt;We've improved the test suite because it now detects a meaningful defect.&lt;/p&gt;

&lt;p&gt;Notice that we didn't add a test just to improve a score. We added one because the requirement explicitly defines what should happen at the boundary.&lt;/p&gt;

&lt;p&gt;This distinction is important.&lt;/p&gt;

&lt;p&gt;A mutation-testing report is a source of questions, not an instruction to write more assertions blindly.&lt;/p&gt;

&lt;p&gt;For every surviving mutant, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does this change affect behavior that matters?&lt;/li&gt;
&lt;li&gt;What does the requirement say the correct behavior should be?&lt;/li&gt;
&lt;li&gt;Should the test suite detect this change?&lt;/li&gt;
&lt;li&gt;If so, what is the smallest meaningful test that would detect it?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach fits naturally into Test-Driven Development.&lt;/p&gt;

&lt;p&gt;TDD helps us implement behavior from requirements. Mutation testing challenges whether our tests can detect selected deviations from that behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. From local experiments to pull request verification
&lt;/h2&gt;

&lt;p&gt;So far, we've run mutation testing manually.&lt;/p&gt;

&lt;p&gt;The next step is to integrate it into CI.&lt;/p&gt;

&lt;p&gt;Imagine an AI coding agent creates a PR that modifies &lt;code&gt;calculateShipping&lt;/code&gt; and adds several unit tests.&lt;/p&gt;

&lt;p&gt;The ordinary CI pipeline runs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Type-checking.&lt;/li&gt;
&lt;li&gt;Linting.&lt;/li&gt;
&lt;li&gt;Unit and integration tests.&lt;/li&gt;
&lt;li&gt;Other project-specific checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything passes.&lt;/p&gt;

&lt;p&gt;Now Stryker runs against the configured production code. It discovers that the tests don't detect a meaningful mutation in the shipping calculation.&lt;/p&gt;

&lt;p&gt;The PR report can expose that weakness before the change is merged.&lt;/p&gt;

&lt;p&gt;This is particularly useful for AI-generated code because the implementation and its tests may have been produced by the same agent, based on the same interpretation of the requirements.&lt;/p&gt;

&lt;p&gt;The tests passing is evidence that the implementation satisfies the assertions the agent wrote. It isn't independent evidence that those assertions capture every important requirement.&lt;/p&gt;

&lt;p&gt;Mutation testing adds another challenge: it deliberately changes the implementation and checks whether the test suite notices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should mutation testing block every PR?
&lt;/h3&gt;

&lt;p&gt;I'd start with a gradual approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1: Report findings without blocking merges.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run mutation testing on a small set of important modules. Learn how long it takes, inspect surviving mutants, and identify noisy or irrelevant results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2: Gate critical code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Introduce stronger requirements for areas where correctness is particularly important, such as permissions, pricing, validation, or state transitions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 3: Track regressions over time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use scheduled runs and historical reports to identify weaknesses across the broader codebase.&lt;/p&gt;

&lt;p&gt;For larger projects, Stryker's incremental mode can reuse eligible previous results to reduce the work needed on subsequent runs. See the &lt;a href="https://stryker-mutator.io/docs/stryker-js/incremental/" rel="noopener noreferrer"&gt;incremental testing documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One important distinction: mutating changed production files is not the same as testing only the new tests in a PR. You want relevant existing tests to participate in verifying the changed behavior as well.&lt;/p&gt;

&lt;p&gt;You should also avoid making a repository-wide mutation score an immediate merge requirement. A small PR shouldn't necessarily be responsible for fixing every weakness in a legacy test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Let the AI agent investigate surviving mutants
&lt;/h2&gt;

&lt;p&gt;We can take the workflow a step further.&lt;/p&gt;

&lt;p&gt;Instead of using mutation testing only as a CI gate, we can feed its findings back to the AI agent.&lt;/p&gt;

&lt;p&gt;Imagine this sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An agent implements a feature and writes unit tests.&lt;/li&gt;
&lt;li&gt;CI runs the ordinary checks.&lt;/li&gt;
&lt;li&gt;Stryker finds a surviving mutation.&lt;/li&gt;
&lt;li&gt;The agent receives the mutation report and relevant requirements.&lt;/li&gt;
&lt;li&gt;The agent determines whether the mutation exposes a genuine testing gap.&lt;/li&gt;
&lt;li&gt;The agent proposes an additional test or explains why the mutant isn't meaningful.&lt;/li&gt;
&lt;li&gt;CI reruns the checks against the revised PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For our shipping example, the agent might receive a report showing that changing &lt;code&gt;&amp;gt;=&lt;/code&gt; to &lt;code&gt;&amp;gt;&lt;/code&gt; doesn't cause any tests to fail.&lt;/p&gt;

&lt;p&gt;The agent can then inspect the business rule and recognize that the boundary at £100 is important.&lt;/p&gt;

&lt;p&gt;It adds the boundary test, reruns the suite, and verifies that the mutation is now killed.&lt;/p&gt;

&lt;p&gt;This creates a feedback loop in which the agent can improve not just the implementation, but also the evidence we have about that implementation.&lt;/p&gt;

&lt;p&gt;However, there's a critical caveat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't let the agent blindly optimize the mutation score.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An agent could make a mutant fail by adding an assertion that encodes an incorrect assumption. It could also change production code simply to make the existing tests pass.&lt;/p&gt;

&lt;p&gt;The correct behavior must come from explicit requirements, domain rules, or other trustworthy sources—not from the mutation report alone.&lt;/p&gt;

&lt;p&gt;The agent can propose a fix, but the final verification should run independently in CI against the revised commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Mutation testing is one layer in a Swiss cheese model
&lt;/h2&gt;

&lt;p&gt;This brings us to the broader reason mutation testing matters.&lt;/p&gt;

&lt;p&gt;No single verification technique catches every defect.&lt;/p&gt;

&lt;p&gt;Type checking can detect certain classes of errors, but it doesn't establish that a business rule is correct.&lt;/p&gt;

&lt;p&gt;Unit tests can verify specified behavior, but they only check the cases and assertions we've written.&lt;/p&gt;

&lt;p&gt;Mutation testing can challenge the effectiveness of those tests, but it can't guarantee that the original requirements were understood correctly.&lt;/p&gt;

&lt;p&gt;Integration tests can expose problems between components, but they won't necessarily identify every defect in an individual component.&lt;/p&gt;

&lt;p&gt;Code review can identify design and requirement problems, but human reviewers also have limited time and attention.&lt;/p&gt;

&lt;p&gt;Each layer has gaps.&lt;/p&gt;

&lt;p&gt;This is the idea behind a Swiss cheese model of verification: arrange multiple imperfect defenses so that a defect that passes through one layer has other opportunities to be detected.&lt;/p&gt;

&lt;p&gt;A practical model might include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1: Types and static analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Catch incompatible interfaces, invalid types, and selected classes of programming mistakes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2: Unit and integration tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check specified behavior, interactions, and component integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3: Mutation testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Challenge whether tests detect selected changes to the implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 4: Contract and architecture checks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verify boundaries, invariants, and integration assumptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 5: Independent review and production feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Identify misunderstood requirements, broader design risks, and failures that automated checks miss.&lt;/p&gt;

&lt;p&gt;The layers are complementary. They aren't completely independent: mutation testing relies on the test suite, and both can be based on the same misunderstood requirement.&lt;/p&gt;

&lt;p&gt;But combining different forms of verification can provide stronger evidence than relying on any one of them.&lt;/p&gt;

&lt;p&gt;This connects directly to the principles discussed in &lt;a href="https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5"&gt;Revisiting the Toyota Production System in the Age of Coding Agents&lt;/a&gt;. In particular, the idea of building quality into the production process is relevant here: detect abnormalities as early as possible, rather than allowing them to move downstream.&lt;/p&gt;

&lt;p&gt;Mutation testing can be one of the automated checks that helps us detect weaknesses before a pull request is merged.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Why this matters when code generation scales
&lt;/h2&gt;

&lt;p&gt;AI changes the economics of software development.&lt;/p&gt;

&lt;p&gt;An agent can produce a substantial implementation and its accompanying tests much faster than a human might write them manually.&lt;/p&gt;

&lt;p&gt;But generating code is not the same as establishing that the code is correct.&lt;/p&gt;

&lt;p&gt;If the volume of changes increases dramatically, manually reviewing every implementation and every test may become increasingly difficult.&lt;/p&gt;

&lt;p&gt;We need verification mechanisms that scale with the rate of change.&lt;/p&gt;

&lt;p&gt;This is the connection to &lt;a href="https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632"&gt;When Code Gets Cheap, Verification Becomes Expensive&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mutation testing is not a complete solution to that problem. It has a computational cost, and it only evaluates the mutations it generates. It cannot establish that the implementation satisfies every requirement or that every important defect is represented by a mutation.&lt;/p&gt;

&lt;p&gt;What it can do is make one important question cheaper to investigate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can our tests detect plausible defects in the code we're producing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And because the process can be automated, we can apply that challenge repeatedly as code changes.&lt;/p&gt;

&lt;p&gt;The objective isn't to maximize code generation or mutation scores in isolation. It's to increase our ability to produce and verify valuable changes without letting the volume of generated code overwhelm our verification capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Mutation testing is a relatively simple idea with important consequences.&lt;/p&gt;

&lt;p&gt;We deliberately modify production code, run our tests, and observe whether those tests detect the changes. When meaningful mutants survive, we investigate whether our tests are missing important behavioral checks.&lt;/p&gt;

&lt;p&gt;With TypeScript and StrykerJS, it's possible to introduce this technique into an existing project without replacing your test runner or abandoning your current TDD workflow.&lt;/p&gt;

&lt;p&gt;And when AI agents generate code and tests, mutation testing provides a useful additional challenge: rather than accepting a green test suite at face value, we can investigate whether it detects selected mistakes.&lt;/p&gt;

&lt;p&gt;It doesn't prove that our code is correct. No single testing technique does.&lt;/p&gt;

&lt;p&gt;But that's precisely why it belongs in a multi-layer verification strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When code generation scales, verification must scale with it. Mutation testing helps us challenge one of the most important defenses we already have: our tests.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Further reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/from-rigidity-to-explicitness-how-ai-changes-the-role-of-constraints-in-software-5cp5"&gt;From Rigidity to Explicitness: How AI Changes the Role of Constraints in Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632"&gt;When Code Gets Cheap, Verification Becomes Expensive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5"&gt;Revisiting the Toyota Production System in the Age of Coding Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stryker-mutator.io/docs/stryker-js/getting-started/" rel="noopener noreferrer"&gt;StrykerJS documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
      <category>coding</category>
    </item>
    <item>
      <title>From Building Products to Building Factories: The Industrial Revolution of Software Engineering Is Here</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Mon, 12 Oct 2026 22:48:45 +0000</pubDate>
      <link>https://dev.to/remojansen/the-industrial-revolution-of-software-is-here-14f6</link>
      <guid>https://dev.to/remojansen/the-industrial-revolution-of-software-is-here-14f6</guid>
      <description>&lt;p&gt;The Industrial Revolution changed much more than how goods were manufactured. It transformed how people worked, how businesses operated, how cities grew, and how economies created value.&lt;/p&gt;

&lt;p&gt;I believe software engineering is approaching a similar transformation.&lt;/p&gt;

&lt;p&gt;We are moving from a world where engineers primarily produce software themselves to one where engineers increasingly build and operate systems that produce software for them.&lt;/p&gt;

&lt;p&gt;Coding agents are the catalyst, but the real transformation is much bigger than AI writing code. It is about changing the entire system through which software is designed, built, tested, and delivered.&lt;/p&gt;

&lt;p&gt;To understand where we might be heading, it helps to look back at the original Industrial Revolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed during the Industrial Revolution?
&lt;/h2&gt;

&lt;p&gt;Beginning in Britain in the second half of the eighteenth century, the Industrial Revolution transformed an economy dominated by agriculture, hand production, and small workshops into one increasingly organised around machinery, factories, and large-scale manufacturing.&lt;/p&gt;

&lt;p&gt;Several fundamental changes drove this transformation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Hand tools became machines.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Skilled craftspeople had traditionally produced goods by hand. New machinery allowed the same kinds of work to be performed faster and at a much greater scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Small workshops became factories.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Production moved from homes and small workshops into factories where machinery, workers, materials, and processes could be coordinated in one place. The factory became a new unit of production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Human and animal power gave way to new sources of energy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Steam engines, powered largely by coal, enabled machinery to operate at scales and in locations that had previously been impractical. Later, electricity transformed factories further.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Transport networks connected production at scale.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Canals, railways, and steamships made it possible to move raw materials and finished goods more efficiently. Factories could serve markets far beyond their immediate surroundings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Standardisation enabled mass production.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Repeatable processes and increasingly standardised components made production more consistent and scalable. Manufacturing became less dependent on every individual craftsperson completing every step from beginning to end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. The organisation of work and the economy changed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Factories created new roles, management structures, and patterns of employment. Human labour did not disappear, but its nature changed. People increasingly operated, maintained, managed, and improved systems of production.&lt;/p&gt;

&lt;p&gt;The important point is that the Industrial Revolution was not simply a story about machines replacing manual labour.&lt;/p&gt;

&lt;p&gt;It was a transformation of the entire production system.&lt;/p&gt;

&lt;p&gt;And that is where I see a parallel with software engineering today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The software industry's industrial revolution
&lt;/h2&gt;

&lt;p&gt;Let's map these changes to software engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Hand tools → Machines → Coding agents
&lt;/h3&gt;

&lt;p&gt;In traditional software development, engineers are directly responsible for much of the implementation work. They translate requirements into code, write tests, debug failures, and make changes across a codebase.&lt;/p&gt;

&lt;p&gt;Tools have always helped. Compilers, IDEs, libraries, frameworks, and CI/CD systems have made engineers more productive. But the engineer has generally remained the primary executor of the work.&lt;/p&gt;

&lt;p&gt;Coding agents change that relationship.&lt;/p&gt;

&lt;p&gt;An engineer can now delegate implementation, testing, debugging, code exploration, and other tasks to agents. Instead of manually performing every step, the engineer increasingly specifies the desired outcome, provides context, delegates work, and evaluates the results.&lt;/p&gt;

&lt;p&gt;The shift is not simply from one coding tool to another.&lt;/p&gt;

&lt;p&gt;It is from engineers using tools to produce software towards engineers directing agents that produce software.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Small workshops → Factories → Agentic software factories
&lt;/h3&gt;

&lt;p&gt;A traditional software squad resembles a small workshop in some respects. A group of engineers collaborates to design, implement, test, and deliver a product or feature.&lt;/p&gt;

&lt;p&gt;Hiring more engineers and creating more squads has historically been a common way to increase development capacity.&lt;/p&gt;

&lt;p&gt;But what happens when a significant portion of implementation can be delegated to agents?&lt;/p&gt;

&lt;p&gt;We can begin to imagine agentic software factories: production systems that coordinate agents across many tasks, repositories, and workflows.&lt;/p&gt;

&lt;p&gt;Rather than scaling only by adding more human teams, organisations could scale by increasing the capacity of their agentic production systems.&lt;/p&gt;

&lt;p&gt;A factory might coordinate hundreds or potentially thousands of agents, each working on specialised tasks, while shared infrastructure manages dependencies, execution, testing, verification, and delivery.&lt;/p&gt;

&lt;p&gt;This does not mean that thousands of agents will automatically produce thousands of times more useful software. Coordination, context, dependencies, and verification all introduce constraints.&lt;/p&gt;

&lt;p&gt;The opportunity is to create a production system that scales without requiring human execution capacity to grow proportionally.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Human and animal power → Steam engines → Compute and datacentres
&lt;/h3&gt;

&lt;p&gt;Industrial machinery needed power. Steam engines and, later, electricity provided the energy that allowed factories to operate at scale.&lt;/p&gt;

&lt;p&gt;Agentic software production has its own equivalent.&lt;/p&gt;

&lt;p&gt;AI agents depend on models, inference, compute infrastructure, memory, storage, and electricity. Datacentres provide much of the physical infrastructure behind this new capability.&lt;/p&gt;

&lt;p&gt;This changes the economics of software production.&lt;/p&gt;

&lt;p&gt;In a traditional model, increasing implementation capacity often means hiring more engineers. In an agentic model, increasing execution capacity may also mean allocating more compute, using more capable models, and improving the infrastructure that coordinates agents.&lt;/p&gt;

&lt;p&gt;Human expertise remains essential, but compute becomes an increasingly important production input.&lt;/p&gt;

&lt;p&gt;And just as access to energy helped determine where and how industrial production could scale, access to affordable and reliable compute may influence how agentic software factories are designed and operated.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Canals and railways → Orchestration and automated workflows
&lt;/h3&gt;

&lt;p&gt;Factories could not scale in isolation. They needed ways to move materials between production stages and connect suppliers with markets.&lt;/p&gt;

&lt;p&gt;Agentic software factories need their own infrastructure for moving work.&lt;/p&gt;

&lt;p&gt;Agents must receive tasks, access the right context, use tools, coordinate with other agents, and hand their work to subsequent stages. Their outputs must move through code review, testing, integration, security checks, and deployment.&lt;/p&gt;

&lt;p&gt;APIs, task queues, orchestration systems, version control, CI/CD pipelines, and observability become the connective infrastructure of the factory.&lt;/p&gt;

&lt;p&gt;The challenge is no longer only how to make an individual agent effective. It is how to move work reliably through the entire production system.&lt;/p&gt;

&lt;p&gt;A highly capable agent inside a poorly designed workflow may accomplish very little. A well-designed system can combine specialised capabilities into a reliable process.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Craft production → Standardisation and repeatable processes
&lt;/h3&gt;

&lt;p&gt;Mass manufacturing did not emerge simply because factories acquired more machines. Production also became more repeatable.&lt;/p&gt;

&lt;p&gt;Agentic software production faces the same challenge.&lt;/p&gt;

&lt;p&gt;Agents need clear specifications, stable interfaces, appropriate context, reusable capabilities, and objective ways to evaluate their work.&lt;/p&gt;

&lt;p&gt;Without these, adding agents can multiply inconsistent implementations, conflicting changes, and rework.&lt;/p&gt;

&lt;p&gt;Standardised workflows and automated evaluations make it easier to delegate work without requiring a human to intervene at every step.&lt;/p&gt;

&lt;p&gt;This is also where software architecture becomes particularly important. Good boundaries allow work to be divided into tasks that can be performed and verified independently. Poor boundaries create dependencies that make parallel execution difficult.&lt;/p&gt;

&lt;p&gt;The lesson is straightforward: scaling production requires designing the work so that it can be reliably delegated, integrated, and checked.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Manual production → Factory operation and management
&lt;/h3&gt;

&lt;p&gt;Perhaps the most important change concerns the role of the engineer.&lt;/p&gt;

&lt;p&gt;Industrialisation did not eliminate humans from manufacturing. It changed what they did.&lt;/p&gt;

&lt;p&gt;People designed factories, installed machinery, maintained equipment, managed production, controlled quality, and improved processes. Machines performed more of the repetitive physical work, but the system still required human direction and expertise.&lt;/p&gt;

&lt;p&gt;The same distinction matters for software.&lt;/p&gt;

&lt;p&gt;Engineers will not simply disappear from the production process. Their responsibilities may increasingly move towards designing and operating the systems that produce software.&lt;/p&gt;

&lt;p&gt;And this leads to the central idea of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineers will build the factories that build software
&lt;/h2&gt;

&lt;p&gt;Consider a modern car factory.&lt;/p&gt;

&lt;p&gt;Robots assemble components and perform repeatable operations with speed and precision. But the factory itself was designed by humans. Humans selected and installed the robots, designed the production line, defined its operating procedures, established quality controls, and created the systems that coordinate the process.&lt;/p&gt;

&lt;p&gt;Humans also decide which cars to build, how they should work, and what quality standards they must meet.&lt;/p&gt;

&lt;p&gt;The robots manufacture the cars. Humans build and operate the system that makes this production possible.&lt;/p&gt;

&lt;p&gt;I believe agentic software engineering is moving towards a similar model.&lt;/p&gt;

&lt;p&gt;Agents will increasingly perform implementation work, but humans will design the architecture, build the orchestration systems, establish the specifications, create verification mechanisms, and operate the production environment.&lt;/p&gt;

&lt;p&gt;The distinction is between building software and building the system that builds software.&lt;/p&gt;

&lt;p&gt;These are related, but they are not the same discipline.&lt;/p&gt;

&lt;p&gt;In a traditional workflow, an engineer might receive a requirement, design the solution, write the code, test it, fix defects, and deliver the change.&lt;/p&gt;

&lt;p&gt;In an agentic workflow, an engineer might instead define the desired outcome, break the problem into verifiable tasks, establish constraints, delegate implementation to agents, and ensure that the resulting changes satisfy the required standards.&lt;/p&gt;

&lt;p&gt;The engineer is no longer necessarily the person performing every operation. They become the person responsible for making sure the production system performs those operations correctly.&lt;/p&gt;

&lt;p&gt;This does not mean that every engineer will stop coding. Direct implementation will remain valuable, particularly for complex problems, architecture, debugging, and situations where agents cannot reliably complete the work.&lt;/p&gt;

&lt;p&gt;But the centre of gravity can shift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineers won't just build software. They'll build the factories that build software.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineer becomes a factory architect and operator
&lt;/h2&gt;

&lt;p&gt;If this transformation continues, several capabilities may become increasingly important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Designing for delegation.&lt;/strong&gt; Software architecture will need to support work that can be divided into well-defined, relatively independent tasks. Clear boundaries, contracts, and interfaces will help agents work in parallel without constantly conflicting with one another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defining intent and specifications.&lt;/strong&gt; Agents need to know what to build, what constraints to respect, and what success looks like. Ambiguity that a human team might resolve through conversation can become expensive when propagated across many agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building verification systems.&lt;/strong&gt; Producing code is not the same as producing correct software. Automated tests, static analysis, security checks, integration tests, and higher-level evaluations become essential parts of the production system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orchestrating work.&lt;/strong&gt; Engineers will need to decide how tasks are decomposed, assigned, prioritised, coordinated, and integrated. More agents do not necessarily mean more useful output if they are working on conflicting or poorly defined tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operating and improving the factory.&lt;/strong&gt; Engineers will need to understand throughput, bottlenecks, failure rates, rework, latency, compute consumption, and cost. The goal is not to maximise the number of agents running. It is to maximise the amount of valuable, verified software the system can deliver.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retaining human judgment and accountability.&lt;/strong&gt; Product decisions, architectural trade-offs, risk acceptance, and responsibility for outcomes cannot simply be delegated away. Automation changes how work is executed, but organisations still need people accountable for what they deliver.&lt;/p&gt;

&lt;p&gt;In other words, the engineer's job increasingly becomes designing the conditions under which software can be produced reliably.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Toyota Production System matters
&lt;/h2&gt;

&lt;p&gt;This brings me to a subject I explored in my previous article, &lt;a href="https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5"&gt;&lt;em&gt;Revisiting the Toyota Production System (TPS) in the Age of Coding Agents&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Toyota Production System is relevant because it focuses on how to organise production, not merely on the capabilities of individual machines.&lt;/p&gt;

&lt;p&gt;Two factories can have similar equipment and very different results. The way work flows through the factory, how defects are detected, how quality is maintained, and how the system improves over time all matter.&lt;/p&gt;

&lt;p&gt;The same is true of agentic software engineering.&lt;/p&gt;

&lt;p&gt;Giving an organisation access to powerful coding agents does not automatically give it an effective software factory.&lt;/p&gt;

&lt;p&gt;We need production systems that make it possible to detect failures early, prevent defective work from moving downstream, limit unnecessary work in progress, and continuously improve the process.&lt;/p&gt;

&lt;p&gt;Several ideas from manufacturing are especially relevant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jidoka: build quality into the process.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the Toyota Production System, automation is paired with the ability to detect abnormalities and stop when something goes wrong. The aim is not to manufacture defective products faster.&lt;/p&gt;

&lt;p&gt;For software agents, the equivalent is to make verification part of the workflow. An agent's output should not automatically be treated as completed work simply because the agent says it has finished. Failed tests, violated constraints, security issues, and integration problems should prevent work from progressing until they are addressed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Just-in-time production: avoid accumulating unfinished work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Launching hundreds of agents simultaneously may look impressive, but it can create a large inventory of partially completed changes that compete for attention and integration capacity.&lt;/p&gt;

&lt;p&gt;The objective should be to deliver work when it is needed, in manageable increments, while keeping work in progress under control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poka-yoke: make mistakes difficult to propagate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mistake-proofing means designing a process so that common errors are prevented or caught automatically.&lt;/p&gt;

&lt;p&gt;In software factories, this might mean enforcing interface contracts, requiring automated checks, restricting permissions, validating outputs against specifications, and preventing unsafe changes from reaching production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kaizen: continuously improve the production system.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every failed task, rejected change, integration conflict, and repeated agent mistake provides information about the factory.&lt;/p&gt;

&lt;p&gt;Rather than treating every failure as an isolated incident, we can use it to improve specifications, tools, tests, workflows, and reusable agent capabilities.&lt;/p&gt;

&lt;p&gt;These principles become more important as execution scales. If an agent makes a mistake, the impact may be limited. If a poorly designed workflow allows thousands of agents to repeat that mistake, the problem becomes systemic.&lt;/p&gt;

&lt;p&gt;The more automated the factory becomes, the more important it is to engineer the production system itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The new bottleneck is not necessarily coding
&lt;/h2&gt;

&lt;p&gt;If agents make implementation cheaper and faster, what becomes scarce?&lt;/p&gt;

&lt;p&gt;It depends on the problem, the technology, and the organisation. But several constraints may become more prominent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing what to build.&lt;/strong&gt; A factory can produce enormous quantities of output without creating much value if it is producing the wrong things. Product judgment and problem selection remain critical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Providing clear context.&lt;/strong&gt; Agents need access to relevant requirements, architectural decisions, existing code, and constraints. Missing or contradictory context can undermine even capable models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coordinating parallel work.&lt;/strong&gt; Some tasks can be performed independently; others have dependencies that limit how much parallelism is useful. More agents can introduce coordination overhead rather than remove it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verifying correctness.&lt;/strong&gt; Generating an implementation may become relatively inexpensive, while proving that it is correct, secure, maintainable, and fit for purpose remains difficult.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managing cost and resources.&lt;/strong&gt; Agent execution consumes compute and other resources. A system that generates more code but requires disproportionate verification and rework may not be economically attractive.&lt;/p&gt;

&lt;p&gt;This is why I don't think the defining metric of an agentic software factory should be the number of agents it runs or the volume of code it produces.&lt;/p&gt;

&lt;p&gt;The more meaningful question is:&lt;/p&gt;

&lt;p&gt;How much valuable, reliable software can it deliver, at what cost, and with what level of human intervention?&lt;/p&gt;

&lt;p&gt;That is a production question, not merely a coding question.&lt;/p&gt;

&lt;h2&gt;
  
  
  From engineering capacity to production capacity
&lt;/h2&gt;

&lt;p&gt;Traditionally, organisations have often treated engineering capacity as a function of team size. More developers mean more potential implementation capacity, although coordination costs and other constraints complicate the relationship.&lt;/p&gt;

&lt;p&gt;Agentic software factories introduce another possibility.&lt;/p&gt;

&lt;p&gt;A relatively small group of engineers could operate a production system that delegates substantial implementation work to agents. The organisation's capacity may depend increasingly on the quality of its architecture, workflows, verification mechanisms, and compute infrastructure.&lt;/p&gt;

&lt;p&gt;This does not guarantee that teams will become smaller or that software development will become cheaper in every case. Requirements still need to be understood, complex systems still need to be designed, and generated changes still need to be integrated and maintained.&lt;/p&gt;

&lt;p&gt;But it changes the potential economics of building software.&lt;/p&gt;

&lt;p&gt;If implementation becomes cheaper, organisations may be able to pursue projects that were previously too expensive, maintain more software, experiment more frequently, or build more specialised products.&lt;/p&gt;

&lt;p&gt;At the same time, cheaper production could encourage organisations to generate far more software than they can meaningfully maintain. Without good production controls, lower implementation costs could simply create larger maintenance burdens.&lt;/p&gt;

&lt;p&gt;The objective is not to maximise software production at any cost.&lt;/p&gt;

&lt;p&gt;It is to make the production of useful software more scalable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The factory is not the datacentre
&lt;/h2&gt;

&lt;p&gt;One distinction is worth making.&lt;/p&gt;

&lt;p&gt;Datacentres provide the compute infrastructure that powers AI models and agents, but they are not the software factory itself.&lt;/p&gt;

&lt;p&gt;A software factory is the complete system that turns intent into verified software. It includes the agents, models, tools, codebase, specifications, workflows, orchestration, tests, deployment mechanisms, monitoring, and human operating model.&lt;/p&gt;

&lt;p&gt;Two organisations could have access to similar models and compute resources but achieve very different results because their production systems differ.&lt;/p&gt;

&lt;p&gt;One might have agents making overlapping changes, producing inconsistent implementations, and relying on humans to discover defects late in the process.&lt;/p&gt;

&lt;p&gt;Another might use explicit task boundaries, isolated execution environments, automated verification, controlled integration, and feedback loops to improve reliability.&lt;/p&gt;

&lt;p&gt;The difference is not simply the intelligence of the agents.&lt;/p&gt;

&lt;p&gt;It is the quality of the factory.&lt;/p&gt;

&lt;p&gt;That is why I believe building and operating agentic software factories will become an important engineering discipline in its own right.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Industrial Revolution is about the system, not the machine
&lt;/h2&gt;

&lt;p&gt;The historical analogy is not exact. Software is not a physical product, AI agents are not industrial robots in every meaningful respect, and software production has different constraints from manufacturing cars or textiles.&lt;/p&gt;

&lt;p&gt;Nor does every software organisation need thousands of agents. The right degree of automation will depend on the work being performed, the cost of mistakes, and the economics of the system.&lt;/p&gt;

&lt;p&gt;But the underlying parallel is compelling.&lt;/p&gt;

&lt;p&gt;The original Industrial Revolution transformed production by combining machines, energy, factories, transport networks, standardisation, and new ways of organising labour.&lt;/p&gt;

&lt;p&gt;The emerging transformation in software combines coding agents, compute infrastructure, orchestration, reusable capabilities, automated verification, and new ways of organising engineering work.&lt;/p&gt;

&lt;p&gt;The breakthrough is not any one component. It is how the components work together.&lt;/p&gt;

&lt;p&gt;And the human role remains central, although it may change substantially.&lt;/p&gt;

&lt;p&gt;Humans designed the factories that allowed machines to manufacture goods at scale. In an agentic software world, engineers will increasingly design, build, operate, and improve the factories that allow agents to produce software at scale.&lt;/p&gt;

&lt;p&gt;We should therefore spend less time thinking only about how to make an individual coding agent more productive and more time thinking about how to build a production system that reliably turns ideas into working software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The future of software engineering may not be about having more engineers writing code. It may be about having more engineers building better systems for producing software.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Industrial Revolution of Software Is Here.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>career</category>
      <category>software</category>
    </item>
    <item>
      <title>Building Agentic Engineering Resilience: Using VS Code Copilot Automations + Datadog MCP for Recurrent Error Detection and Fixing</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sat, 10 Oct 2026 11:57:49 +0000</pubDate>
      <link>https://dev.to/remojansen/building-agentic-engineering-resilience-using-vs-code-copilot-automations-datadog-mcp-for-4jg2</link>
      <guid>https://dev.to/remojansen/building-agentic-engineering-resilience-using-vs-code-copilot-automations-datadog-mcp-for-4jg2</guid>
      <description>&lt;p&gt;In the agentic engineering world, coding agents generate a lot of code quickly. The bottleneck shifts from &lt;em&gt;writing&lt;/em&gt; code to &lt;em&gt;verifying&lt;/em&gt; it. I’ve written about this shift before — the need for explicit systems and multilayer verification (see my earlier posts on &lt;a href="https://dev.to/remojansen"&gt;dev.to/remojansen&lt;/a&gt;, especially &lt;em&gt;When Code Gets Cheap, Verification Becomes Expensive&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;This post documents one concrete, useful layer of verification you can build today: a scheduled automation that periodically hunts for recurrent 4xx/5xx errors (or high-error-rate endpoints), performs root-cause analysis, and attempts a TDD-style fix. Over time this compounds into greater system resilience.&lt;/p&gt;

&lt;p&gt;We’ll use two recent capabilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automations (Preview)&lt;/strong&gt; in VS Code + GitHub Copilot
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Datadog MCP Server&lt;/strong&gt; so the agent can query real observability data&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Automations (Preview) in VS Code GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;Automations let you save an agent task (prompt + session configuration) and run it on demand or on a recurring schedule (hourly, daily, or weekly). Routine work no longer has to be started manually.&lt;/p&gt;

&lt;p&gt;From the &lt;a href="https://code.visualstudio.com/updates/v1_137#_automations-preview" rel="noopener noreferrer"&gt;VS Code 1.137 release notes&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable the setting &lt;code&gt;chat.automations.enabled&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Agents&lt;/strong&gt; window and select &lt;strong&gt;Automations&lt;/strong&gt; in the sidebar.&lt;/li&gt;
&lt;li&gt;Start from a template (catch up on changes, triage issues, find bugs) or write your own prompt and schedule.&lt;/li&gt;
&lt;li&gt;Run on demand first to review behavior, then enable the schedule.&lt;/li&gt;
&lt;li&gt;Automations are in Preview and rolling out gradually (off by default on Stable, on by default in Insiders).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to enable and create one
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Settings and set &lt;code&gt;chat.automations.enabled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open the Agents window → &lt;strong&gt;Automations&lt;/strong&gt; → &lt;strong&gt;Create Automation&lt;/strong&gt; (or pick a template).&lt;/li&gt;
&lt;li&gt;Give it a clear name and a precise prompt that states the task, scope, and expected output.&lt;/li&gt;
&lt;li&gt;Choose workspace, agent, model, and permission level.&lt;/li&gt;
&lt;li&gt;Set Schedule to &lt;strong&gt;Manual&lt;/strong&gt; first, create it, run it with &lt;strong&gt;Run now&lt;/strong&gt;, review the session, then edit and switch to Weekly (or Daily) once you’re happy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Important operational notes from the official docs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The machine / Agent Host must be available for scheduled runs.&lt;/li&gt;
&lt;li&gt;An automation runs one session at a time.&lt;/li&gt;
&lt;li&gt;Review the agent’s permission level carefully before enabling unattended schedules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Official documentation: &lt;a href="https://code.visualstudio.com/docs/agents/run/automations" rel="noopener noreferrer"&gt;Create and manage agent automations&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Enabling the Datadog MCP Server in VS Code
&lt;/h2&gt;

&lt;p&gt;The Datadog MCP Server gives the agent structured access to logs, APM, metrics, error tracking, etc.&lt;/p&gt;

&lt;p&gt;Recommended path (from the &lt;a href="https://docs.datadoghq.com/mcp_server/setup/?tab=vscode" rel="noopener noreferrer"&gt;official Datadog docs&lt;/a&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the official &lt;strong&gt;Datadog&lt;/strong&gt; extension for VS Code.&lt;/li&gt;
&lt;li&gt;Sign in to your Datadog account inside the extension.&lt;/li&gt;
&lt;li&gt;Run the command &lt;strong&gt;Datadog: Open MCP Configuration Assistant&lt;/strong&gt; and follow the guided setup.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alternatively (manual):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the command palette → &lt;strong&gt;MCP: Open User Configuration&lt;/strong&gt; (or edit &lt;code&gt;.vscode/mcp.json&lt;/code&gt; / user MCP config).&lt;/li&gt;
&lt;li&gt;Add a server entry pointing at the Datadog MCP endpoint for your site, e.g.:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"datadog"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.datadoghq.com/v1/mcp?toolsets=apm,error-tracking,logs"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Use the correct regional endpoint for your Datadog site. Replace or expand the &lt;code&gt;toolsets&lt;/code&gt; query parameter as needed.)&lt;/p&gt;

&lt;p&gt;After configuration, start the server and complete the OAuth flow when prompted. Confirm the tools appear in the agent’s tool picker.&lt;/p&gt;

&lt;h3&gt;
  
  
  Critical warning: the 128-tool limit
&lt;/h3&gt;

&lt;p&gt;GitHub Copilot (and the underlying models) enforce a hard limit of &lt;strong&gt;128 tools per request&lt;/strong&gt;. Many MCP servers (including Datadog when all toolsets are enabled, plus other MCPs you may have) easily exceed this. When the limit is hit you get errors such as “You may not include more than 128 tools in your request” and other tools become unavailable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best practice&lt;/strong&gt;: load only the toolsets you actually need by using the &lt;code&gt;toolsets&lt;/code&gt; query parameter in the MCP URL (or the equivalent filtering mechanism). Example toolsets relevant to error hunting: &lt;code&gt;apm&lt;/code&gt;, &lt;code&gt;error-tracking&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;. Avoid &lt;code&gt;toolsets=all&lt;/code&gt; unless you are certain the total stays under the limit or you use virtual tools / selective enabling in the tools picker.&lt;/p&gt;

&lt;p&gt;You can also deselect tools or entire MCP servers in the Chat / Agent tools picker for a given session.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. A Verification Layer for Recurrent Errors
&lt;/h2&gt;

&lt;p&gt;Agents produce a lot of code; the systems that stay healthy are the ones that continuously look for the same classes of failure and close the loop with a test + fix.&lt;/p&gt;

&lt;p&gt;Here’s a practical pattern:&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills (slash commands / reusable prompts) you can develop
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;/find-top-recurrent-errors&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Query Datadog (via MCP) for the top 5 repeating 4xx/5xx errors or the endpoints with the highest error rates over the last 7 days. Surface frequency, sample traces/logs, and affected services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;/root-cause-analysis&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Given the error data, dig into traces, logs, recent deployments, and code paths to propose a concrete root cause.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;/tdd-bug-fix&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Write a failing test that reproduces the root cause, then implement the minimal fix that makes the test pass. Prefer small, reviewable changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Putting it together in an Automation
&lt;/h3&gt;

&lt;p&gt;Create an automation that runs, for example, every Monday morning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a reliability-focused agent.

1. Use the Datadog MCP tools to identify the top 5 recurrent 4xx/5xx errors (or endpoints with the highest error rates) from the past 7 days.
2. For each, run a focused root-cause analysis using available traces, logs, and code context.
3. For the highest-impact issue that looks fixable in this codebase, follow a TDD approach:
   - Write a test that reproduces the failure.
   - Implement the smallest correct fix.
   - Ensure the test passes and no obvious regressions are introduced.
4. Summarize findings, the proposed fix, and any remaining risks. Do not push or merge; leave changes for human review.

Prefer precision over volume. If data is insufficient, say so clearly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schedule it weekly (or daily if your error volume is high). Start with Manual runs until the prompt and permissions feel solid.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foxt08agvvhbxgctmnr9o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foxt08agvvhbxgctmnr9o.png" alt=" " width="800" height="841"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over successive weeks the automation surfaces the same recurring problems, the skills improve, and the codebase gradually becomes more resilient because the verification loop is explicit and repeated.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;When code generation is cheap, the expensive part is making sure the system keeps working under real traffic. A scheduled agent that looks at production error patterns, reasons about root cause, and produces a test + fix is one concrete multilayer verification practice you can put in place today.&lt;/p&gt;

&lt;p&gt;It is not a replacement for human review, observability culture, or proper incident process — it is an additional, automated layer that compounds over time.&lt;/p&gt;

&lt;p&gt;Try the automation with a conservative permission level and a carefully scoped toolset first. Iterate on the prompt and the skills. The goal is not fully autonomous fixing; it is reliable, repeatable detection and a high-quality starting point for a human engineer.&lt;/p&gt;

&lt;p&gt;Happy (and more resilient) coding.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sre</category>
      <category>agents</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>From T-Shirt Sizes to Token Quotes?</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sat, 10 Oct 2026 02:11:08 +0000</pubDate>
      <link>https://dev.to/remojansen/from-t-shirt-sizes-to-token-quotes-3m0o</link>
      <guid>https://dev.to/remojansen/from-t-shirt-sizes-to-token-quotes-3m0o</guid>
      <description>&lt;p&gt;I'll start with my position, because the rest of the article depends on it.&lt;/p&gt;

&lt;p&gt;I'm against estimation. I have been for a long time. My team has already stopped estimating and stopped doing sprint planning, and I have no plans to bring either back. One thing is left: when upper management asks how big something is, we still answer with a t-shirt size.&lt;/p&gt;

&lt;p&gt;Even that has started to feel wrong.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/remojansen/scrum-is-finally-dead-and-we-have-to-thank-coding-agents-for-that-18bi"&gt;an earlier article&lt;/a&gt; I argued that coding agents are finally killing Scrum. In &lt;a href="https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632"&gt;another&lt;/a&gt; I argued that when code gets cheap, verification gets expensive. This article follows from both. If teams no longer estimate, and producing code is no longer the constraint, what should we say when the organisation still asks &lt;em&gt;"how big is this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm not going to try to bring estimation back to teams. My question is narrower: &lt;strong&gt;if an organisation still needs a size signal, what should that signal be?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My hypothesis is that &lt;strong&gt;token quotes&lt;/strong&gt; could replace t-shirt sizes.&lt;/p&gt;

&lt;p&gt;I want to be careful about how much confidence that deserves. This is a hypothesis, not a finding. I don't have a dataset of token quotes compared with actual results, and I haven't run the experiment. Some of what follows rests on arguments I've made before and still stand by, mainly that verification has become the bottleneck. Some of it is speculation about a metric nobody has tested yet, including me. I'll try to keep the two apart, and I've included a section on how to test the idea and what would show it to be wrong. Any numbers in this article are illustrative.&lt;/p&gt;

&lt;p&gt;I should also be clear about context. I'm describing a team that does most of its implementation work with coding agents, in an organisation that tolerates working without sprint commitments. Plenty of teams don't work like that, and I come back to where this does and doesn't apply near the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estimation never really worked
&lt;/h2&gt;

&lt;p&gt;We all know the problems.&lt;/p&gt;

&lt;p&gt;The planning fallacy says we consistently underestimate how long things will take, even when we know about the planning fallacy. Hofstadter's Law says it always takes longer than you expect, even when you take Hofstadter's Law into account. Decades of software projects have confirmed both.&lt;/p&gt;

&lt;p&gt;Story points and t-shirt sizes were meant to fix this by moving away from time. Size work relative to other work, the reasoning went, and stop pretending you can predict hours. Then velocity came along and turned points back into time. "We do 30 points a sprint, so this epic will take four sprints." Relative estimation became absolute estimation again with an extra step.&lt;/p&gt;

&lt;p&gt;The #NoEstimates movement was right in principle. But as I argued in the Scrum article, organisations lean toward practices they can follow over principles they have to internalise. "Don't estimate" is a principle. Organisations still need &lt;em&gt;something&lt;/em&gt; to put in the box, so the box got filled with points and t-shirts.&lt;/p&gt;

&lt;p&gt;It's worth asking what management actually needs from that box. Sometimes it really is a date: a contract, a regulatory deadline, a launch tied to a marketing campaign. This article has nothing useful to say about those cases. But in my experience, most of the time the request for a date is standing in for something else. What they need is a &lt;strong&gt;relative size signal&lt;/strong&gt;. Is this bigger or smaller than that? By roughly how much? Which items are outliers we should discuss before committing? They use it to prioritise, to sequence, and to notice when something is much larger than expected.&lt;/p&gt;

&lt;p&gt;A size signal is a reasonable thing to want. The problem is how we've been producing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why t-shirt sizes feel wrong now
&lt;/h2&gt;

&lt;p&gt;A t-shirt size is &lt;strong&gt;a human's intuition about how much human effort&lt;/strong&gt; a piece of work will take. Someone who knows the codebase looks at a ticket, compares it with past work, and says "that's an M."&lt;/p&gt;

&lt;p&gt;That made sense when human implementation effort was what drove delivery. It no longer is.&lt;/p&gt;

&lt;p&gt;With coding agents, implementation time collapses, and it also gets noisy. The same ticket might take an agent four minutes or forty, depending on how much context it needs to find, how many dead ends it explores, and how clearly the intent was expressed. Wall-clock time stops being a useful signal.&lt;/p&gt;

&lt;p&gt;More importantly, the constraint has moved. As I argued in &lt;a href="https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632"&gt;When Code Gets Cheap, Verification Becomes Expensive&lt;/a&gt;, producing code and establishing that it is correct are two different activities. Agents have made the first dramatically cheaper. They haven't done the same for the second. Or, in the terms of &lt;a href="https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5"&gt;my TPS article&lt;/a&gt;, production now outpaces inspection.&lt;/p&gt;

&lt;p&gt;So a t-shirt size is now partly an intuition about a quantity that matters less than it used to. (Not entirely: a good t-shirt size often quietly includes review and risk, and that's a point I'll come back to, because token quotes don't.) It still costs real team time to produce: someone has to read the ticket, think about it, and agree with whoever else is in the room. And it can never be checked. Nobody can measure whether something "really was" an L. There's no feedback loop, so the estimates never get better.&lt;/p&gt;

&lt;p&gt;A signal that costs human time, increasingly measures the wrong thing, and can't improve looks like a bad deal. The question is whether there's a better one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The token quote
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;token quote&lt;/strong&gt; is an estimated range of tokens attached to an issue or ticket before work starts. An agent generates it in a pre-flight step: it reads the ticket, explores the relevant parts of the repository, and returns a range along with its reasoning. No code is written.&lt;/p&gt;

&lt;p&gt;The output might look like this (illustrative):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token quote: 180K (P50) – 420K (P90)
Reasoning: Touches the billing module and two API contracts.
           Billing has strong types and a schema; the notification
           service it integrates with does not, and will need exploration.
Confidence: medium. The acceptance criteria don't specify retry behaviour.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all there is to it. The useful part is what this signal is and isn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why tokens and not dollars
&lt;/h3&gt;

&lt;p&gt;When I first thought about this idea, the obvious move was to convert tokens into money. Tokens have a price, so why not report "this ticket will cost about $20"?&lt;/p&gt;

&lt;p&gt;I think that would be a mistake.&lt;/p&gt;

&lt;p&gt;A dollar figure reads as &lt;strong&gt;the cost of the work&lt;/strong&gt;. If management sees $20 next to a ticket, they'll anchor on $20. They'll forget the engineer who reviews the change, the product owner who validates it, the time spent on integration, coordination and deployment, and the operational cost of running it afterwards. The token cost is a small fraction of the total cost of a change. Showing it in currency invites exactly the wrong conclusion: that software has become almost free to build.&lt;/p&gt;

&lt;p&gt;Tokens avoid that trap because they're deliberately abstract. "1.5M tokens" doesn't look like a budget line, and nobody will mistake it for the cost of a feature. But anyone can see that 1.5M tokens is &lt;strong&gt;much bigger than 10K tokens&lt;/strong&gt;. The unit works as a relative size signal without pretending to be anything else.&lt;/p&gt;

&lt;p&gt;That is exactly what t-shirt sizes were trying to be. The aim is for token quotes to keep the useful property (relative size) and drop the misleading one (a false sense of precision about cost). Whether they really capture the &lt;em&gt;right&lt;/em&gt; relative size is the open question I come back to below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why token quotes might be better than t-shirt sizes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;They cost the team nothing.&lt;/strong&gt; An agent produces the quote. There's no meeting, no planning poker, no refinement session. This is the main reason the idea doesn't bother me as someone who is against estimation: no human time goes into it. It's a by-product, not a ceremony.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They can be checked against reality.&lt;/strong&gt; This is the property t-shirt sizes and story points never had. Issue trackers already record when work starts and when it's done, so every quote can be compared with the ticket's actual &lt;strong&gt;cycle time&lt;/strong&gt;, with nobody filling in a timesheet. For the first time, a size signal can be checked against an outcome that was measured, not one somebody estimated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They're on a continuous scale.&lt;/strong&gt; A t-shirt size has five buckets. A token quote can tell an outlier apart from something that is merely large.&lt;/p&gt;

&lt;p&gt;If management is attached to the familiar vocabulary, the labels can be kept and derived from token bands instead of gut feel. For example (illustrative thresholds only):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Token quote (P50)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;&amp;lt; 50K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;50K – 250K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;250K – 1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XL&lt;/td&gt;
&lt;td&gt;≥ 1M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The labels stay. The meeting that produced them goes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The assumption everything rests on
&lt;/h3&gt;

&lt;p&gt;All of this depends on one assumption I can't yet back up: that &lt;strong&gt;a token quote is a meaningful proxy for the size management cares about&lt;/strong&gt;. Below, I'll pin "size" down as the ticket's end-to-end cycle time.&lt;/p&gt;

&lt;p&gt;There are good reasons to doubt it. Tokens measure how much work the &lt;em&gt;agent&lt;/em&gt; did. They don't measure how much work the &lt;em&gt;humans&lt;/em&gt; will do. A one-line change to an authentication flow might cost a few thousand tokens and still need a careful security review. A large, mechanical rename across a codebase might cost a million tokens and need almost no review. If management reads token quotes as "how big is this for us", those two cases will mislead them in opposite directions.&lt;/p&gt;

&lt;p&gt;A t-shirt size from an experienced engineer usually includes that risk and review effort, even if nobody says so. A token quote doesn't. That's a real loss, and it's the strongest argument against the whole idea.&lt;/p&gt;

&lt;p&gt;My guess is that across a typical backlog, token quotes and end-to-end cycle time are correlated well enough to be useful as a relative signal, with the exceptions being exactly the high-risk, low-volume changes that should get human attention anyway. But that is a guess. It's the first thing to test, and if it turns out to be wrong, the token quote is a poor replacement for a t-shirt size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calibrating against the right thing
&lt;/h2&gt;

&lt;p&gt;At first, the quote is just the agent's guess. I don't know how good that guess will be. The agent has one advantage over a human gut feel: it actually reads the code it would need to change. It also has clear disadvantages: it lacks the organisational context, history and tacit knowledge an experienced engineer brings, and models are not known for being well calibrated about their own uncertainty. The one thing in its favour that isn't in doubt is that it's free.&lt;/p&gt;

&lt;p&gt;The obvious way to improve the guess would be to compare quoted tokens with &lt;strong&gt;actual tokens&lt;/strong&gt;, then eventually train a model on &lt;em&gt;(ticket → actual tokens)&lt;/em&gt;. That would probably work, in the narrow sense that the model would get good at predicting token consumption. But it would answer the wrong question. A perfectly calibrated prediction of how many tokens an agent will spend tells you nothing about whether token consumption is what management should care about. You'd be validating the measuring instrument, not what it measures.&lt;/p&gt;

&lt;p&gt;The comparison that matters is between the &lt;strong&gt;token quote&lt;/strong&gt; and the &lt;strong&gt;issue's cycle time&lt;/strong&gt;: how long the ticket actually took from starting work to being done, including review, rework, waiting and verification. Cycle time is the outcome the size signal is supposed to stand in for. If tokens and cycle time move together, the quote is a useful relative size signal. If they don't, it isn't, however accurately it predicts its own token usage.&lt;/p&gt;

&lt;p&gt;There's an apparent irony here: I'm against estimating time, and I'm proposing to validate against time. The difference is that cycle time is &lt;strong&gt;measured, not forecast&lt;/strong&gt;. Nobody is asked to predict it. It's recorded by the tracker as a side effect of the work, and it captures exactly what the token count misses, which is the human side: review, verification, back-and-forth on requirements.&lt;/p&gt;

&lt;p&gt;Cycle time is a noisy target, though. It includes queueing, reprioritisation, people on holiday, and tickets left blocked over a weekend. Using it well needs a consistent definition (for example, from "in progress" to "deployed"), and possibly excluding time spent explicitly blocked. Even then, expect a correlation, not a precise prediction.&lt;/p&gt;

&lt;p&gt;Actual token usage is still worth recording, but as a diagnostic, not as the validation target. A large gap between quoted and actual tokens tells you something about the agent's pre-flight step. It doesn't tell you whether the quote means anything.&lt;/p&gt;

&lt;p&gt;The long-term step, and I want to be clear that this is aspirational, would be to train your own model on historical &lt;em&gt;(token quote + ticket features → cycle time)&lt;/em&gt; data. Plausible features include the modules touched, how explicit those modules are, how clear the ticket is, whether a prototype is attached, and which model or agent did the work. At that point the token quote stops being the answer and becomes one input among several for predicting relative size. I don't know how well this would work. It's a direction, not a recipe.&lt;/p&gt;

&lt;p&gt;If the approach works at all, it might produce signals that are more useful than the number itself. These are also untested.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Going over the quote is a reason to reassess.&lt;/strong&gt; When an agent goes well past its P90, something may be wrong: an ambiguous requirement, missing context, or a hidden dependency. In the TPS article I described this kind of signal as an Andon cord: it draws attention to the problem, which isn't the same as shutting the line down. Some tasks legitimately go over, especially exploratory ones where the point is to find out what's there. So a breach should trigger &lt;strong&gt;reassessment, not an automatic stop&lt;/strong&gt;. The agent pauses at a sensible checkpoint and summarises what it has found and why the work is bigger than expected. A human then decides whether to continue with a revised quote, split the ticket, clarify the requirement, or abandon the approach. Tickets that are openly exploratory can be marked as such and given a wider range from the start. If there's a hard cap at all, it should be set well above the P90 as protection against runaway loops, not used as the main control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicitness becomes measurable.&lt;/strong&gt; In &lt;a href="https://dev.to/remojansen/from-rigidity-to-explicitness-how-ai-changes-the-role-of-constraints-in-software-5cp5"&gt;From Rigidity to Explicitness&lt;/a&gt; I argued that constraints such as types, schemas and contracts act as &lt;em&gt;context compression&lt;/em&gt;. They tell the agent what the system means, so it doesn't have to infer it. Implicit codebases force agents to spend tokens rediscovering intent. Tokens per change, broken down by module, could become an indicator of where a codebase is hard to work in: a kind of tech debt you can put a number on. Interpreting it would need care, though. Some modules are expensive because they're messy, and others because the domain is genuinely complex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spec quality becomes visible.&lt;/strong&gt; Clear tickets, and especially tickets that come with a working prototype, should produce tighter quotes than vague ones. The cost of ambiguity becomes something you can see.&lt;/p&gt;

&lt;p&gt;One caveat on comparisons: token counts are not directly comparable across models. Tokenisers differ, and so does how efficiently models reason. Historical comparisons need to record which model produced the numbers, or be normalised to a reference model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't estimate verification. Invest in reducing it.
&lt;/h2&gt;

&lt;p&gt;This is where I want to put most of the weight. It's also the part of the article that &lt;strong&gt;doesn't depend on token quotes at all&lt;/strong&gt;. If the token-quote idea turns out to be wrong, the argument in this section still holds, because it rests on my earlier articles, not on an untested metric.&lt;/p&gt;

&lt;p&gt;Once you accept that tokens are only part of the cost of a change, the obvious next step is to estimate the rest. If tokens size the machine side, why not add a verification estimate for the human side: reviewer-hours, risk classes, approval tiers?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I think that would be a mistake.&lt;/strong&gt; It would bring planning poker back, aimed at a quantity that is even harder to predict than implementation effort. How long it takes to establish that a change is correct depends on things that are hard to know in advance: what the reviewer finds, which edge cases turn up, how the change interacts with everything around it.&lt;/p&gt;

&lt;p&gt;More fundamentally, estimating verification only &lt;em&gt;predicts&lt;/em&gt; the cost of the bottleneck. Automating verification &lt;em&gt;reduces&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;I want to be precise about how far that goes. Automation doesn't eliminate verification. It takes over the parts that can be made mechanical: type errors, contract violations, regressions in covered behaviour, invalid states the system can't represent. A substantial part of verification can't be handed over that way. Someone still has to judge whether the requirement was the right one, whether the system behaves the way users actually need, whether a change opens a security hole no test was written for, and whether there are operational, legal or product risks that never show up in a pipeline. Those judgements remain human, and in an agentic workflow they become a larger share of the remaining work.&lt;/p&gt;

&lt;p&gt;The point of automation isn't to remove humans from verification. It's to stop spending scarce human attention on the mechanical checks, so it's available for the judgements only humans can make.&lt;/p&gt;

&lt;p&gt;That difference matters more than it might seem. As I argued in the verification article, implementation cost is mostly paid once, but verification cost is &lt;strong&gt;recurrent&lt;/strong&gt;. We pay it when we build a feature, and again whenever we change it, refactor it, migrate its data, upgrade its dependencies, or let an agent modify it. Any investment that lowers the cost of verification keeps paying off on every future change. Effort spent estimating verification has to be spent again for every ticket, and it doesn't make the next change any cheaper to verify.&lt;/p&gt;

&lt;p&gt;So, for teams in a position like mine, I'd suggest that &lt;strong&gt;the time that used to go into estimation is better spent on making verification scale.&lt;/strong&gt; I'm not claiming this is right for every team. If your organisation genuinely depends on forecasts, you may not be able to free that time up. But where you can, this is the trade I'd make. In practice, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Making invalid states unrepresentable.&lt;/strong&gt; Strong types, schemas, database constraints and explicit state machines turn some classes of bugs into things the system cannot express, so those particular mistakes don't need checking again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contracts at boundaries.&lt;/strong&gt; Contract tests between services and modules mean integration correctness is checked mechanically rather than rediscovered in review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A fast, tiered verification pipeline.&lt;/strong&gt; Cheap mistakes should be caught cheaply, by parsers, type checkers and static analysis, before expensive tests or human attention are needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototypes as requirements.&lt;/strong&gt; As I argued in the Scrum article, a working prototype from the person who understands the problem validates intent before the build starts. That reduces, though it doesn't remove, the "is this what you meant?" verification later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this needs a forecast. All of it makes the mechanical part of verification cheaper and faster, for humans and for agents, and leaves more human attention for the part that can't be automated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bigger changes cost more to verify, now and later
&lt;/h3&gt;

&lt;p&gt;There's one relationship between size and verification worth stating explicitly, though it doesn't need its own estimate.&lt;/p&gt;

&lt;p&gt;A large change is harder to verify today: there's more to review, more interactions to consider, and more ways for something subtle to slip through. It also leaves a larger surface of behaviour that has to be re-verified whenever related code changes. Size adds to verification cost twice: once now, and again with every future change nearby.&lt;/p&gt;

&lt;p&gt;That gives the token quote a second possible use. A large quote isn't a reason to estimate more carefully. It's a prompt to &lt;strong&gt;split the work&lt;/strong&gt; into smaller changes, each of which is cheaper to verify and leaves less behind to re-verify. The quote doesn't need to predict verification cost to be useful here. It only needs to flag size early, while splitting is still cheap, with the caveat from earlier that a small quote doesn't mean a change is low-risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to test this, and what would prove it wrong
&lt;/h2&gt;

&lt;p&gt;Because the idea is untested, the honest way to adopt it is as an experiment, not a policy. Fortunately it's a cheap experiment. Token quotes cost no team time, so they can run &lt;strong&gt;alongside&lt;/strong&gt; existing t-shirt sizes for a few months without changing anything else.&lt;/p&gt;

&lt;p&gt;Over that period, I'd want to answer four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Do token quotes track cycle time?&lt;/strong&gt; Is there a useful correlation between the quote and the ticket's measured cycle time? Do tickets in a higher token band reliably take longer end to end? This is the key assumption from earlier and the question that matters most. If the correlation is weak, token quotes are measuring agent effort and nothing management needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where do they diverge?&lt;/strong&gt; Look at the tickets where quote and cycle time disagree most. If the outliers are mostly high-risk, review-heavy changes, as I'd expect, that's a known limitation that can be flagged. If they're random, the signal is noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do they agree with experienced engineers?&lt;/strong&gt; Run t-shirt sizes and token quotes side by side, and check which one correlates better with cycle time. If the t-shirt size usually wins, the human intuition is capturing something the tokens miss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do they change decisions?&lt;/strong&gt; Did management prioritise, sequence or split work any differently because of the quotes? A signal nobody acts on isn't worth producing, however cheap it is.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notably absent from this list: "does the agent predict its own token usage accurately?" That's worth monitoring, but a quote can be perfectly calibrated against tokens and still useless as a size signal.&lt;/p&gt;

&lt;p&gt;If the answers come back mostly negative, the conclusion should be to keep t-shirt sizes, or to drop sizing altogether, rather than to keep adjusting the token quote until it looks useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;There are ways this can go wrong, and they're worth naming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goodhart's Law.&lt;/strong&gt; If teams are judged on how well they match their token quotes, the quotes will stop being informative. They're a sizing signal for management, not a performance metric. The moment they become a target, they become story points again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tokens are not cost.&lt;/strong&gt; I'll repeat this because it's the easiest mistake to make. A token quote says nothing about labour, review, coordination or operations. It shouldn't be converted to currency for reporting, however tempting that is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-determinism.&lt;/strong&gt; The same ticket, run twice, will use different numbers of tokens. That's why a quote is a range, not a point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model drift.&lt;/strong&gt; New models change token efficiency, sometimes dramatically. Historical baselines need to be revisited when the underlying model changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No new ceremony.&lt;/strong&gt; If token quotes ever turn into a meeting, with people debating whether a ticket is really 200K or 400K, the approach has failed. The whole point is that no human time goes into producing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this doesn't apply
&lt;/h2&gt;

&lt;p&gt;The argument assumes a particular setting, and it's worth being explicit about where that setting doesn't hold.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real external deadlines.&lt;/strong&gt; Fixed-price contracts, regulatory dates and coordinated launches need forecasts in time. Token quotes don't provide those, and they aren't meant to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heavy cross-team dependencies.&lt;/strong&gt; When several teams have to sequence work against each other, some form of time-based planning is often unavoidable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams where agents do little of the work.&lt;/strong&gt; If most implementation is still done by hand, human effort is still the main driver, and a t-shirt size may well remain the better signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-risk domains.&lt;/strong&gt; Where most changes need careful human review whatever their size, such as safety-critical, financial or security-sensitive systems, the gap between agent effort and total effort is at its widest. Token quotes would be at their least informative exactly where the stakes are highest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outside those cases, I think the idea is worth trying. Inside them, I'd be cautious.&lt;/p&gt;

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

&lt;p&gt;There are two separate claims in this article, and they deserve different levels of confidence.&lt;/p&gt;

&lt;p&gt;The first is one I'm fairly confident about, because it builds on arguments I've made before. In agentic development, verification is the constraint. Effort that makes verification cheaper keeps paying off on every future change, and effort spent forecasting it doesn't. Where a team has the freedom to choose, I'd put the time into verification automation rather than estimation.&lt;/p&gt;

&lt;p&gt;The second is a hypothesis. &lt;strong&gt;If&lt;/strong&gt; an organisation still needs a size signal, agent-generated token quotes &lt;strong&gt;might&lt;/strong&gt; be a better one than t-shirt sizes. They cost the team nothing, they can be checked against measured cycle time, and expressing them in tokens rather than dollars avoids presenting a partial cost as the whole cost. Whether they actually track the size that matters is an open question, and the way to answer it is to run them alongside existing sizes and look at the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In my experience, when management asks for estimates, what it most often needs is a sense of relative size, so it can prioritise and spot outliers. We've met that need with rituals that cost team time, measure human effort, and can never be checked.&lt;/p&gt;

&lt;p&gt;Token quotes could meet the same need at no cost to the team, in a unit that can be measured against reality. I think they're worth an experiment. I don't yet know whether they'll survive one.&lt;/p&gt;

&lt;p&gt;Either way, they only answer the easy question. The hard question in agentic development isn't &lt;em&gt;"how big is this?"&lt;/em&gt; It's &lt;em&gt;"when can we trust it?"&lt;/em&gt; That one can't be answered by estimating harder. It's answered by making verification cheaper.&lt;/p&gt;

&lt;p&gt;If you need a size, try tokens, and measure whether they work. If you need speed, invest in verification. Neither should require an estimation meeting.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>softwareengineering</category>
      <category>discuss</category>
    </item>
    <item>
      <title>When Code Gets Cheap, Verification Becomes Expensive: How AI changes the economics of software architecture</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Mon, 28 Sep 2026 21:52:55 +0000</pubDate>
      <link>https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632</link>
      <guid>https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632</guid>
      <description>&lt;p&gt;Recently, I was having a conversation at work about how we should implement a feature. I was advocating for one particular approach, and one of the reasons I preferred it was that I thought it would be easier for AI agents to work with. The structure was more explicit, the possible states were easier to reason about, and it would give us better opportunities to automate verification and put guardrails around future changes.&lt;/p&gt;

&lt;p&gt;One of the stakeholders pushed back with a very reasonable point: we shouldn't design software a certain way simply because it is easier for AI agents. We should design it based on what is best for our users.&lt;/p&gt;

&lt;p&gt;I agree completely.&lt;/p&gt;

&lt;p&gt;But the conversation made me realise that there is an important part of my reasoning that I hadn't articulated well. I wasn't putting the AI agent ahead of the user. I was still trying to find the solution that gave us the best combination of user experience, reliability, simplicity, time to market, implementation cost, operational cost, and long-term maintainability. The fact that an agent could understand and verify the resulting system more easily was one of the variables in that equation, not the objective itself.&lt;/p&gt;

&lt;p&gt;That distinction matters because I think AI is changing the economics of software architecture in a way that we haven't fully absorbed yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of writing software is changing
&lt;/h2&gt;

&lt;p&gt;For decades, one of the biggest constraints in software development was the cost of producing software. Developers had to understand the problem, design the solution, write the code, review it, test it, debug it, and maintain it. Engineering capacity was scarce, so reducing the amount of implementation work required was extremely valuable.&lt;/p&gt;

&lt;p&gt;AI coding agents are changing this equation. They can generate implementations, write tests, refactor code, explore unfamiliar codebases, migrate APIs, and perform many other tasks at a speed that would have been difficult to achieve with humans alone.&lt;/p&gt;

&lt;p&gt;But there is an important asymmetry here: generating code is not the same thing as establishing that the code is correct.&lt;/p&gt;

&lt;p&gt;An agent can produce a thousand lines of code in minutes. That doesn't mean we can establish in minutes that those thousand lines correctly implement the desired behaviour, don't introduce regressions, preserve important invariants, and interact correctly with the rest of the system.&lt;/p&gt;

&lt;p&gt;This means that as the marginal cost of producing code decreases, another cost becomes relatively more important: the cost of verification.&lt;/p&gt;

&lt;p&gt;And verification isn't something we pay for once.&lt;/p&gt;

&lt;p&gt;We verify software when we initially build it. We verify it when we change it. We verify it when we refactor it. We verify it when dependencies change. We verify it when another feature interacts with it. We verify it when an AI agent modifies it. We verify it when a bug is fixed. We verify it when we migrate data. We verify it when we upgrade infrastructure.&lt;/p&gt;

&lt;p&gt;Implementation costs are often largely one-off. Verification costs are recurrent.&lt;/p&gt;

&lt;p&gt;That changes the architectural equation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation cost is not the whole cost
&lt;/h2&gt;

&lt;p&gt;Imagine that we have two possible implementations for the same feature.&lt;/p&gt;

&lt;p&gt;Solution A costs $100,000 to implement, but because the architecture doesn't provide strong guarantees, every subsequent change requires significant testing, review, and regression checking.&lt;/p&gt;

&lt;p&gt;Solution B costs $120,000 to implement, but the architecture makes many invalid states impossible and gives us strong automated guarantees about the behaviour of the system.&lt;/p&gt;

&lt;p&gt;If we only look at implementation cost, Solution A appears cheaper.&lt;/p&gt;

&lt;p&gt;But software doesn't stop costing money when the initial implementation is complete.&lt;/p&gt;

&lt;p&gt;If Solution A requires an additional $20,000 every year in verification and regression work while Solution B requires only $5,000, then the initial $20,000 saving disappears very quickly. Over the lifetime of the system, the more expensive implementation can become the cheaper system.&lt;/p&gt;

&lt;p&gt;The exact numbers aren't important. The important thing is that verification is recurrent.&lt;/p&gt;

&lt;p&gt;This is why I think we need to start treating &lt;strong&gt;verifiability as an architectural concern&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When comparing two architectures, we shouldn't only ask how much they cost to build. We should also ask how cheaply and reliably we can establish that they are correct over the lifetime of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification isn't just testing
&lt;/h2&gt;

&lt;p&gt;When I talk about verification, I don't mean that we should simply write more tests.&lt;/p&gt;

&lt;p&gt;Tests are extremely useful, but there is a more powerful form of verification: designing the system so that certain classes of incorrect behaviour cannot happen in the first place.&lt;/p&gt;

&lt;p&gt;There is a huge difference between saying, "We have tests that check this invalid state doesn't happen" and saying, "This invalid state cannot be represented by the system."&lt;/p&gt;

&lt;p&gt;The latter is an architectural property.&lt;/p&gt;

&lt;p&gt;Strong types are a simple example. If a function accepts a &lt;code&gt;UserId&lt;/code&gt; rather than an arbitrary string, the type system can eliminate an entire class of mistakes before the program runs. Database constraints can prevent invalid relationships. State machines can restrict which transitions are possible. Schemas can prevent malformed data from entering a system. Idempotency can eliminate entire classes of duplicate-operation bugs. Explicit boundaries can reduce the number of possible interactions between components.&lt;/p&gt;

&lt;p&gt;In each case, we are moving some of the burden of verification away from humans and tests and into the structure of the system itself.&lt;/p&gt;

&lt;p&gt;The system becomes easier to verify because the system itself provides guarantees.&lt;/p&gt;

&lt;h2&gt;
  
  
  A database can become part of the state machine
&lt;/h2&gt;

&lt;p&gt;Consider a workflow where a piece of data moves through several states.&lt;/p&gt;

&lt;p&gt;Perhaps it starts as &lt;code&gt;Created&lt;/code&gt;, then becomes &lt;code&gt;Validated&lt;/code&gt;, then &lt;code&gt;Processed&lt;/code&gt;, and finally &lt;code&gt;Completed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One way to implement this is with a single event table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WorkflowEvents

id
workflow_id
event_type
payload
created_at
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application then needs to determine whether a particular event is valid given the previous state. The code needs to understand which transitions are allowed, whether the previous event exists, whether the payload is valid for the event type, and whether the workflow has reached an impossible state.&lt;/p&gt;

&lt;p&gt;We can write tests for all of this. We can write application-level validation. We can ask an AI agent to reason about the state machine. We can review the implementation.&lt;/p&gt;

&lt;p&gt;Another approach is to model the workflow more explicitly in the persistence layer. We could have event-specific structures where each stage references the previous stage through a foreign key, with schemas specific to that event.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Created
   ↓
Validated
   ↓
Processed
   ↓
Completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Validated&lt;/code&gt; cannot exist without a corresponding &lt;code&gt;Created&lt;/code&gt;. &lt;code&gt;Processed&lt;/code&gt; cannot exist without the appropriate &lt;code&gt;Validated&lt;/code&gt; record. &lt;code&gt;Completed&lt;/code&gt; cannot exist without the preceding state.&lt;/p&gt;

&lt;p&gt;Each event can also have a schema that expresses the data required for that particular stage.&lt;/p&gt;

&lt;p&gt;Now the database isn't just storing the state of the workflow. It is helping enforce the workflow.&lt;/p&gt;

&lt;p&gt;We have effectively moved part of the finite-state machine into the persistence model.&lt;/p&gt;

&lt;p&gt;I'm not suggesting that this is always the right design. It introduces its own complexity and trade-offs, and there are many workflows where a simpler event table or a different state-machine implementation would be preferable. The important point is not that one particular architecture is universally superior.&lt;/p&gt;

&lt;p&gt;The important point is that &lt;strong&gt;the architectural choice changes the cost of verification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With the first design, we may need to repeatedly establish through application logic and tests that invalid transitions cannot occur.&lt;/p&gt;

&lt;p&gt;With the second design, some invalid transitions simply cannot be persisted.&lt;/p&gt;

&lt;p&gt;That is a very different property.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make invalid states unrepresentable
&lt;/h2&gt;

&lt;p&gt;This is an old idea in software engineering, but AI makes it increasingly valuable.&lt;/p&gt;

&lt;p&gt;If we can make an invalid state unrepresentable, we don't need to repeatedly verify that nobody has accidentally created that state.&lt;/p&gt;

&lt;p&gt;Consider the difference between these two statements:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We have tests proving that this state should never happen."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The architecture makes this state impossible."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second statement is much more powerful.&lt;/p&gt;

&lt;p&gt;It means that a future developer doesn't need to remember the rule. A future refactor doesn't need to rediscover the rule. An AI agent doesn't need to infer the rule from a collection of tests and documentation. A code reviewer doesn't need to notice a subtle violation.&lt;/p&gt;

&lt;p&gt;The constraint is part of the system.&lt;/p&gt;

&lt;p&gt;This is what I mean when I talk about verification becoming an architectural concern. Architecture can determine not only what the system is capable of doing, but also what incorrect things the system is capable of doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI makes these properties more valuable
&lt;/h2&gt;

&lt;p&gt;This is where AI agents enter the picture, but I don't think the argument should be "design software for AI."&lt;/p&gt;

&lt;p&gt;The better argument is that AI increases the rate at which software can change.&lt;/p&gt;

&lt;p&gt;If the number of changes increases, the cost of verifying those changes becomes more important.&lt;/p&gt;

&lt;p&gt;Imagine two systems. In the first, every change requires a human to reconstruct a complicated mental model of the system and determine whether a subtle invariant has been preserved. In the second, the architecture expresses many of those invariants through types, schemas, constraints, contracts, and automated checks.&lt;/p&gt;

&lt;p&gt;The second system is not merely easier for an AI agent to work with. It is easier for everyone to work with.&lt;/p&gt;

&lt;p&gt;The agent benefits because it has stronger boundaries and clearer feedback. Developers benefit because there is less implicit behaviour to remember. Code reviewers benefit because more correctness properties are mechanically enforced. Operations benefit because fewer invalid states can reach production.&lt;/p&gt;

&lt;p&gt;AI simply makes the difference more visible because we are increasing the volume and speed of change.&lt;/p&gt;

&lt;p&gt;If AI can produce changes faster than humans can safely verify them, then architectures that reduce the cost of verification become increasingly valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification is a recurring cost
&lt;/h2&gt;

&lt;p&gt;This is probably the most important economic point.&lt;/p&gt;

&lt;p&gt;Suppose Architecture A costs 10% less to implement but requires significantly more effort to verify every time it changes.&lt;/p&gt;

&lt;p&gt;Architecture B costs 10% more to implement but gives us strong structural guarantees that dramatically reduce the cost of verification.&lt;/p&gt;

&lt;p&gt;If we only look at the initial project, Architecture A may look attractive.&lt;/p&gt;

&lt;p&gt;But software is not a project that ends when the feature ships. It is a system that continues changing for years.&lt;/p&gt;

&lt;p&gt;The implementation cost happens once. The verification cost happens again and again.&lt;/p&gt;

&lt;p&gt;Every feature built on top of the system pays some of that verification cost. Every refactor pays it. Every migration pays it. Every AI-generated change pays it.&lt;/p&gt;

&lt;p&gt;This creates a compounding effect.&lt;/p&gt;

&lt;p&gt;A small amount of additional complexity that buys a strong, reusable verification guarantee can potentially pay for itself many times over.&lt;/p&gt;

&lt;p&gt;This is why I think architecture discussions need to consider the lifetime economics of verification, rather than treating testing and verification as something that happens after architecture has already been decided.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification as a first-class quality attribute
&lt;/h2&gt;

&lt;p&gt;We already talk about architecture in terms of qualities such as performance, scalability, reliability, security, availability, and maintainability.&lt;/p&gt;

&lt;p&gt;I think we should increasingly ask another question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How verifiable is this system?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How easy is it to write tests?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How cheaply and reliably can we establish that this system is behaving correctly?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are different questions.&lt;/p&gt;

&lt;p&gt;A system can have excellent test coverage and still be difficult to verify. It might have complicated state transitions, implicit dependencies, weak contracts, highly coupled components, or many possible invalid states.&lt;/p&gt;

&lt;p&gt;Conversely, a system can be designed so that its structure itself provides useful guarantees.&lt;/p&gt;

&lt;p&gt;That could mean strong types. It could mean database constraints. It could mean explicit state machines. It could mean narrow interfaces, deterministic components, schemas, transactional boundaries, idempotent operations, or other forms of architectural constraint.&lt;/p&gt;

&lt;p&gt;The common property is that correctness becomes cheaper to establish.&lt;/p&gt;

&lt;h2&gt;
  
  
  This changes architecture trade-offs
&lt;/h2&gt;

&lt;p&gt;I think this also changes how we should evaluate competing solutions.&lt;/p&gt;

&lt;p&gt;Historically, we might ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Which solution is cheaper to build?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which one is simpler?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which one performs better?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which one is easier to maintain?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions still matter.&lt;/p&gt;

&lt;p&gt;But I think we should add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Which solution is cheaper to verify?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution makes more invalid states impossible?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution gives us stronger automated guarantees?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution makes regressions easier to detect?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution reduces the amount of behaviour that humans have to repeatedly reason about?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution gives automated agents better boundaries and feedback?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution reduces the blast radius of an incorrect change?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting thing is that these questions can change the answer.&lt;/p&gt;

&lt;p&gt;A solution that costs more to implement can be the economically better solution if it substantially reduces the recurring cost of verification.&lt;/p&gt;

&lt;p&gt;And this doesn't mean the most constrained architecture always wins. Constraints have costs too. Excessive constraints can make a system unnecessarily rigid, difficult to evolve, or more complicated than the problem warrants.&lt;/p&gt;

&lt;p&gt;The point is not to maximise constraints.&lt;/p&gt;

&lt;p&gt;The point is to recognise that &lt;strong&gt;constraints have economic value when they reduce the cost of establishing correctness&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question I now want to ask during architecture discussions
&lt;/h2&gt;

&lt;p&gt;Coming back to that conversation at work, I still agree with the stakeholder's principle: the user should come first.&lt;/p&gt;

&lt;p&gt;But I now think there is a missing dimension in how we reason about what is best for the user.&lt;/p&gt;

&lt;p&gt;The question isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which architecture is easiest for the AI?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nor is it simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which architecture is cheapest to implement?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The question is closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Which architecture gives us the best overall outcome for the user, given the lifetime cost of building, operating, changing, and verifying the system?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the answer will be the simplest possible implementation.&lt;/p&gt;

&lt;p&gt;Sometimes it will be the architecture that is easiest for an AI agent to modify.&lt;/p&gt;

&lt;p&gt;Sometimes it will be an architecture with significantly more upfront complexity because that complexity gives us guarantees that would otherwise have to be repeatedly verified.&lt;/p&gt;

&lt;p&gt;And sometimes the right answer will be something completely different.&lt;/p&gt;

&lt;p&gt;The important thing is that &lt;strong&gt;verifiability is now part of the trade-off&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture should help us prove that it is correct
&lt;/h2&gt;

&lt;p&gt;AI-assisted development is often discussed in terms of how quickly we can produce software.&lt;/p&gt;

&lt;p&gt;I think that is only half of the story.&lt;/p&gt;

&lt;p&gt;If AI makes implementation dramatically cheaper, then our scarce resource increasingly becomes the ability to establish that what we produced is correct.&lt;/p&gt;

&lt;p&gt;That means the architecture of a system is no longer just about making the desired behaviour possible. It is also about making incorrect behaviour difficult to express, easy to detect, and cheap to rule out.&lt;/p&gt;

&lt;p&gt;The most interesting architectural decisions may therefore be the ones that turn verification from a recurring human activity into a property of the system itself.&lt;/p&gt;

&lt;p&gt;Because the ultimate goal isn't to build software that AI can generate quickly.&lt;/p&gt;

&lt;p&gt;It's to build software that &lt;strong&gt;we can continuously establish is correct&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And if we can design the architecture so that the system helps us do that, then verification stops being something we bolt onto the end of development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It becomes part of the architecture.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>discuss</category>
      <category>agents</category>
    </item>
    <item>
      <title>Do We Still Need Code Reviews in the Age of Coding Agents?</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sun, 27 Sep 2026 08:25:14 +0000</pubDate>
      <link>https://dev.to/remojansen/do-we-still-need-code-reviews-in-the-age-of-coding-agents-31eg</link>
      <guid>https://dev.to/remojansen/do-we-still-need-code-reviews-in-the-age-of-coding-agents-31eg</guid>
      <description>&lt;p&gt;For most of my career, code review has been a fairly simple idea.&lt;/p&gt;

&lt;p&gt;One engineer writes some code, opens a pull request, and another engineer reviews it before it gets merged. The second engineer looks for bugs, questions design decisions, suggests improvements, and ultimately gives the team another level of confidence that the change is safe to ship.&lt;/p&gt;

&lt;p&gt;It is such a normal part of software development that we rarely stop to question the assumptions behind it.&lt;/p&gt;

&lt;p&gt;One of those assumptions is that &lt;strong&gt;another engineer wrote the code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That assumption is becoming less reliable.&lt;/p&gt;

&lt;p&gt;Today, a coding agent can implement an entire feature, run the tests, fix failures, refactor the implementation, and prepare a pull request. The engineer who opens that pull request may have spent most of their time reviewing and directing the agent rather than writing the code themselves.&lt;/p&gt;

&lt;p&gt;This makes me wonder whether our traditional code review process still makes sense.&lt;/p&gt;

&lt;p&gt;Not because I think code review is obsolete. I think the opposite is true: &lt;strong&gt;we need verification more than ever.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But I think we need to change &lt;em&gt;how&lt;/em&gt; we think about code review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was code review actually for?
&lt;/h2&gt;

&lt;p&gt;Before we decide what should happen to code review, it is worth asking what problem it was solving in the first place.&lt;/p&gt;

&lt;p&gt;When one engineer writes a change and another engineer reviews it, we get a second set of eyes. The reviewer might catch a bug the author missed, notice that an abstraction is wrong, identify an edge case, question an architectural decision, or simply ask why something was implemented in a particular way.&lt;/p&gt;

&lt;p&gt;There is also a social dimension to code review. It creates shared ownership and knowledge across a team. The code does not belong exclusively to the person who wrote it.&lt;/p&gt;

&lt;p&gt;All of that remains valuable.&lt;/p&gt;

&lt;p&gt;But not every part of the traditional process is equally valuable when the author is an AI agent.&lt;/p&gt;

&lt;p&gt;I have started thinking about coding agents as something like &lt;strong&gt;flawed peers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine that you are a seasoned engineer and you have a very fast colleague who is capable of producing an enormous amount of code. They can work tirelessly, know an impressive amount about software development, and solve many problems very well. At the same time, they are inexperienced in your particular system and can occasionally make mistakes that seem obvious in hindsight.&lt;/p&gt;

&lt;p&gt;You would not blindly merge their work.&lt;/p&gt;

&lt;p&gt;You would review it.&lt;/p&gt;

&lt;p&gt;You would give them clear constraints.&lt;/p&gt;

&lt;p&gt;You would run automated checks.&lt;/p&gt;

&lt;p&gt;You might ask another specialist to look at particularly important changes.&lt;/p&gt;

&lt;p&gt;That sounds quite a lot like the agentic development workflow we are building now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineer opening the PR is already a reviewer
&lt;/h2&gt;

&lt;p&gt;This is where I think our traditional PR rules start to become interesting.&lt;/p&gt;

&lt;p&gt;Suppose a team has historically required one human review for every pull request.&lt;/p&gt;

&lt;p&gt;The traditional workflow looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineer A writes the code → Engineer B reviews the code → merge.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now consider an agentic workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent writes the code → Engineer A reviews the code → Engineer A opens the PR → merge.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If Engineer A has genuinely reviewed the implementation, understands the change, and is willing to take ownership of it, what exactly are we gaining from requiring another human to perform a second generic review?&lt;/p&gt;

&lt;p&gt;The PR being opened does not magically make the code more trustworthy.&lt;/p&gt;

&lt;p&gt;The meaningful event happened before that: an engineer examined the work and decided that they were prepared to own it.&lt;/p&gt;

&lt;p&gt;This is why I think we should be careful about treating approval counts as a proxy for quality.&lt;/p&gt;

&lt;p&gt;If your previous process required one review, I think there is a reasonable argument that an agent-generated change which has been thoroughly reviewed by the engineer opening the PR may not need another generic human approval.&lt;/p&gt;

&lt;p&gt;If your process required two human reviews, then perhaps the agent-generated change gets one human review by the owner and one additional human review after the PR is opened.&lt;/p&gt;

&lt;p&gt;The exact policy will depend on the risk of the system and the kind of change being made.&lt;/p&gt;

&lt;p&gt;The important part is the principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The number of approval buttons pressed is not the same thing as the amount of verification performed.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trust the engineer, get ownership in return
&lt;/h2&gt;

&lt;p&gt;There is also a cultural issue here.&lt;/p&gt;

&lt;p&gt;If an experienced engineer reviews an agent-generated change, opens the PR, and says "I am happy to own this", I think we should take that statement seriously.&lt;/p&gt;

&lt;p&gt;We often say that we want engineers to have ownership.&lt;/p&gt;

&lt;p&gt;But ownership without trust is difficult to achieve.&lt;/p&gt;

&lt;p&gt;If we tell engineers that they are responsible for the code but then require another person to validate every decision they make, we are creating a system where responsibility and authority do not quite match.&lt;/p&gt;

&lt;p&gt;I would rather move toward a model where we say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You reviewed it. You understand it. You own it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In return, we should expect engineers to take that responsibility seriously.&lt;/p&gt;

&lt;p&gt;This does not mean trusting every change equally. A production database migration, authentication change, or financial transaction workflow deserves a different verification strategy from a small UI change.&lt;/p&gt;

&lt;p&gt;It means that our process should respond to &lt;strong&gt;risk and uncertainty&lt;/strong&gt;, rather than blindly applying the same number of reviewers to every pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger problem is code volume
&lt;/h2&gt;

&lt;p&gt;There is another problem that I think is even more important.&lt;/p&gt;

&lt;p&gt;Coding agents make producing code dramatically cheaper.&lt;/p&gt;

&lt;p&gt;That is fantastic.&lt;/p&gt;

&lt;p&gt;It also creates a problem.&lt;/p&gt;

&lt;p&gt;If generating code becomes cheap enough, the amount of code produced can increase much faster than the amount of human attention available to review it.&lt;/p&gt;

&lt;p&gt;We cannot solve that problem simply by adding more reviewers.&lt;/p&gt;

&lt;p&gt;If an agent produces ten times more code and our answer is to have humans manually inspect ten times more code, we have simply moved the bottleneck from writing software to verifying software.&lt;/p&gt;

&lt;p&gt;Human attention is scarce.&lt;/p&gt;

&lt;p&gt;So we need to become much more selective about where we spend it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't review what you can make unrepresentable
&lt;/h2&gt;

&lt;p&gt;This is where architecture becomes a much more important part of code review.&lt;/p&gt;

&lt;p&gt;There are many classes of bugs where I would rather not depend on a reviewer noticing the problem.&lt;/p&gt;

&lt;p&gt;I would rather design the system so that the incorrect implementation is difficult or impossible to represent.&lt;/p&gt;

&lt;p&gt;Consider a database schema.&lt;/p&gt;

&lt;p&gt;If the database requires a value to satisfy a particular constraint, we don't need to rely entirely on every application developer remembering to validate that constraint correctly. The database can enforce it.&lt;/p&gt;

&lt;p&gt;Or consider a business workflow.&lt;/p&gt;

&lt;p&gt;If a process can only move from &lt;code&gt;Pending&lt;/code&gt; to &lt;code&gt;Approved&lt;/code&gt; or &lt;code&gt;Rejected&lt;/code&gt;, we can represent those states explicitly rather than allowing arbitrary strings and hoping that every piece of application code handles them correctly.&lt;/p&gt;

&lt;p&gt;Finite state machines are a good example of this approach. The architecture itself describes which transitions are valid and which are not.&lt;/p&gt;

&lt;p&gt;The same idea applies to types, contracts, API boundaries, validation, generated code, static analysis, automated tests, and many other forms of explicitness.&lt;/p&gt;

&lt;p&gt;The goal is not to make developers more careful.&lt;/p&gt;

&lt;p&gt;The goal is to &lt;strong&gt;make certain mistakes impossible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That changes the economics of code review.&lt;/p&gt;

&lt;p&gt;Instead of asking a human to inspect every line and think about every possible failure mode, we can move some classes of verification into the system itself.&lt;/p&gt;

&lt;p&gt;The reviewer can then spend their limited cognitive capacity on the things that actually require human judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification becomes a layered system
&lt;/h2&gt;

&lt;p&gt;This suggests a different model for reviewing agent-generated code.&lt;/p&gt;

&lt;p&gt;At the bottom, we have constraints and architecture that prevent entire classes of incorrect implementations.&lt;/p&gt;

&lt;p&gt;Above that, we have automated verification: type checking, tests, static analysis, security scanners, contract tests, database constraints, CI checks, and whatever else is appropriate for the system.&lt;/p&gt;

&lt;p&gt;Then we have the engineer who reviews the change and takes ownership.&lt;/p&gt;

&lt;p&gt;And for changes where we want additional confidence, we can add another layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adversarial agents.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What if the reviewers were agents too?
&lt;/h2&gt;

&lt;p&gt;We don't necessarily have to choose between one human review and three human reviews.&lt;/p&gt;

&lt;p&gt;We can introduce specialized agents whose job is not to approve the code, but to try to find reasons why we should not trust it.&lt;/p&gt;

&lt;p&gt;Imagine an agent whose only responsibility is security.&lt;/p&gt;

&lt;p&gt;It reviews the change and asks questions such as: "Can this input be manipulated? Did we introduce an authorization bypass? Are there new injection opportunities? Did this change expose something that should remain private?"&lt;/p&gt;

&lt;p&gt;Another agent might specialize in performance.&lt;/p&gt;

&lt;p&gt;It could look for expensive queries, unnecessary allocations, N+1 database access, contention, excessive network calls, or other performance problems.&lt;/p&gt;

&lt;p&gt;We could have agents specializing in reliability, backwards compatibility, API design, testing, accessibility, architecture, or whatever concerns are particularly important to a given system.&lt;/p&gt;

&lt;p&gt;The important part is that these agents have &lt;strong&gt;specialized responsibilities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I don't want ten generic agents saying "LGTM."&lt;/p&gt;

&lt;p&gt;I want adversarial agents trying to break my confidence in the implementation.&lt;/p&gt;

&lt;p&gt;The security agent should be trying to find a security problem. The performance agent should be trying to find a performance problem. The architecture agent should be trying to find an architectural violation.&lt;/p&gt;

&lt;p&gt;And, just like the coding agent, we should remember that these are flawed peers.&lt;/p&gt;

&lt;p&gt;A security agent does not prove that our application is secure. A performance agent does not prove that the system is fast.&lt;/p&gt;

&lt;p&gt;They provide another independent attempt to find problems.&lt;/p&gt;

&lt;p&gt;That can still be extremely valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  More verification without a longer delivery cycle
&lt;/h2&gt;

&lt;p&gt;This gives us an interesting alternative to the traditional approach.&lt;/p&gt;

&lt;p&gt;Today, if a change is considered important, we might respond by adding more human reviewers.&lt;/p&gt;

&lt;p&gt;That increases the amount of human attention required and can increase the time it takes to get the change through the development process.&lt;/p&gt;

&lt;p&gt;In an agentic workflow, we have another option.&lt;/p&gt;

&lt;p&gt;We can increase the amount of verification without necessarily increasing the number of humans involved.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Coding Agent
     |
     v
Engineer reviews and takes ownership
     |
     +------&amp;gt; Security Agent
     |
     +------&amp;gt; Performance Agent
     |
     +------&amp;gt; Architecture Agent
     |
     +------&amp;gt; Testing Agent
     |
     v
Automated verification
     |
     v
Merge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not every change needs every agent.&lt;/p&gt;

&lt;p&gt;A documentation change probably does not need a performance review. A database migration probably deserves more scrutiny than changing a button label.&lt;/p&gt;

&lt;p&gt;The important thing is that verification can become &lt;strong&gt;composable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We can assemble the verification pipeline according to the risk of the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code review at scale
&lt;/h2&gt;

&lt;p&gt;This leads me to a slightly different way of thinking about code review.&lt;/p&gt;

&lt;p&gt;The answer to having more generated code is not necessarily to review more code.&lt;/p&gt;

&lt;p&gt;It is to make &lt;strong&gt;less code require human review&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We can do that in several ways.&lt;/p&gt;

&lt;p&gt;We can use architecture and constraints to make certain incorrect implementations unrepresentable.&lt;/p&gt;

&lt;p&gt;We can use automation to verify things that machines are better at checking than humans.&lt;/p&gt;

&lt;p&gt;We can use specialized adversarial agents to search for specific categories of problems.&lt;/p&gt;

&lt;p&gt;And then we can use human engineers for the decisions where human judgment actually matters.&lt;/p&gt;

&lt;p&gt;Does this solve the right problem?&lt;/p&gt;

&lt;p&gt;Is this the right abstraction?&lt;/p&gt;

&lt;p&gt;Does this fit the architecture?&lt;/p&gt;

&lt;p&gt;Are the trade-offs appropriate?&lt;/p&gt;

&lt;p&gt;Does this behavior make sense for the business?&lt;/p&gt;

&lt;p&gt;Is this something we actually want to own and operate?&lt;/p&gt;

&lt;p&gt;Those are difficult questions to reduce to a simple automated check.&lt;/p&gt;

&lt;p&gt;Checking whether a database column is nullable is not.&lt;/p&gt;

&lt;p&gt;Checking whether an API contract is backwards compatible is often automatable.&lt;/p&gt;

&lt;p&gt;Checking whether every state transition is valid can be encoded into a state machine.&lt;/p&gt;

&lt;p&gt;The more of these things we can move out of human cognition, the more effectively humans can review the things that remain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PR isn't dead
&lt;/h2&gt;

&lt;p&gt;I don't think code reviews are going away.&lt;/p&gt;

&lt;p&gt;I think the &lt;strong&gt;meaning of a code review is changing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When humans wrote most of the code, the natural workflow was for another human to inspect the author's work.&lt;/p&gt;

&lt;p&gt;When agents write most of the code, the engineer's role becomes less about being the person who typed the implementation and more about being the person who understands it, verifies it, and takes responsibility for it.&lt;/p&gt;

&lt;p&gt;That doesn't mean we should blindly trust agents.&lt;/p&gt;

&lt;p&gt;Quite the opposite.&lt;/p&gt;

&lt;p&gt;It means we should build better verification systems around them.&lt;/p&gt;

&lt;p&gt;Some verification should happen through architecture. Some through constraints. Some through automation. Some through specialized adversarial agents. And some through experienced engineers exercising judgment.&lt;/p&gt;

&lt;p&gt;The goal shouldn't be to remove verification in order to move faster.&lt;/p&gt;

&lt;p&gt;The goal should be to &lt;strong&gt;increase verification while reducing the amount of expensive human attention required for it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Maybe the question for the agentic era isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How many engineers need to review this PR?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe it is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What is the cheapest reliable way to gain confidence in this change?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the answer will still be another human.&lt;/p&gt;

&lt;p&gt;Sometimes it will be an agent.&lt;/p&gt;

&lt;p&gt;Sometimes it will be a test, a type, a database constraint, or an architectural decision that makes the bug impossible.&lt;/p&gt;

&lt;p&gt;And sometimes, if an experienced engineer has already reviewed the work and is willing to own it, perhaps the answer is simply to trust them.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>coding</category>
    </item>
    <item>
      <title>Revisiting the Toyota Production System (TPS) in the Age of Coding Agents</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Wed, 23 Sep 2026 23:36:43 +0000</pubDate>
      <link>https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5</link>
      <guid>https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5</guid>
      <description>&lt;p&gt;Software has borrowed a surprising amount from manufacturing. Not from manufacturing in the sense of “let’s put programmers on an assembly line.” Thankfully, we’ve tried enough variations of that idea already.&lt;/p&gt;

&lt;p&gt;I mean something more interesting.&lt;/p&gt;

&lt;p&gt;Some of the most influential ideas in modern software development came from looking at how Toyota transformed manufacturing. Lean Software Development, Kanban, limiting work in progress, reducing waste, optimizing flow, continuous improvement, pull systems—many of these ideas have a lineage that leads back to manufacturing.&lt;/p&gt;

&lt;p&gt;And at the center of that story is the Toyota Production System (TPS).&lt;/p&gt;

&lt;p&gt;Toyota describes TPS around two pillars: &lt;strong&gt;Jidoka&lt;/strong&gt; and &lt;strong&gt;Just-in-Time&lt;/strong&gt;. Jidoka is roughly “automation with a human touch”: when an abnormality is detected, the process stops rather than continuing to produce defective products. Just-in-Time is about producing what is needed, when it is needed, and in the amount needed.&lt;/p&gt;

&lt;p&gt;These ideas were developed for a world of physical products. But we are entering another period where software development is changing dramatically—and this time, the manufacturing analogy might be useful for a completely different reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  I. The Software Bottleneck Is Moving
&lt;/h2&gt;

&lt;p&gt;For most of the history of software development, producing software was expensive. Writing code took time. Understanding a codebase took time. Testing, debugging, and reviewing code all took time. Because developers are human, all of these activities were constrained by the number of humans available to perform them.&lt;/p&gt;

&lt;p&gt;We built processes around this constraint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IDEs to make writing code faster&lt;/li&gt;
&lt;li&gt;Languages &amp;amp; Frameworks to make code easier to express&lt;/li&gt;
&lt;li&gt;CI Systems to automate testing&lt;/li&gt;
&lt;li&gt;Agile &amp;amp; Kanban to improve feedback loops and flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then coding agents arrived. Suddenly, the cost of producing code changed. An agent can read a codebase, modify dozens of files, run commands, inspect test results, make another change, and repeat the process without waiting for a human to type every line.&lt;/p&gt;

&lt;p&gt;The production capacity of software development can increase dramatically. But if an agent can produce changes faster than we can establish that those changes are correct, we have created a new bottleneck: &lt;strong&gt;Verification&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;TRADITIONAL SOFTWARE

┌──────────────┐
│ Human writes │
│    code      │
└──────┬───────┘
       │
       ▼
┌──────────────┐
│ Verification │
└──────────────┘

Production and verification are relatively balanced.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI CODING AGENTS

┌──────────────────────────────┐
│                              │
│      CODE PRODUCTION         │
│                              │
│          ████████████        │
│          ████████████        │
│          ████████████        │
│                              │
└──────────────┬───────────────┘
               │
               ▼
        ┌──────────────┐
        │ VERIFICATION │
        │      █       │
        └──────────────┘

The factory produces faster than quality control can inspect.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a manufacturing problem, and manufacturing has spent a very long time thinking about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  II. Looking at the Factory Floor Again
&lt;/h2&gt;

&lt;p&gt;The answer is not to blindly copy Toyota. Software has no physical inventory, no physical assembly line, and no truck waiting for parts. But the underlying challenges are identical:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do you prevent defects?&lt;/li&gt;
&lt;li&gt;How do you detect problems as early as possible?&lt;/li&gt;
&lt;li&gt;What should happen when an abnormality occurs?&lt;/li&gt;
&lt;li&gt;How much unfinished work should be allowed to accumulate?&lt;/li&gt;
&lt;li&gt;How do you improve the production process rather than merely inspecting its output?&lt;/li&gt;
&lt;li&gt;How do you increase production speed without increasing the rate at which defects escape?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are the exact questions that led to modern manufacturing quality practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  III. Jidoka &amp;amp; The Software Andon Cord
&lt;/h2&gt;

&lt;p&gt;Of all the Toyota concepts, Jidoka is the most interesting for AI coding agents. The basic idea is simple: if a machine detects an abnormality, it stops. The objective isn’t simply to detect defective products at the end of the line—it is to prevent the production of more defective products in the first place by building quality directly into the process.&lt;/p&gt;

&lt;p&gt;A conventional automated system behaves like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Produce → Produce → Produce → Inspect → Discover Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jidoka aims for something different:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Produce → Produce → Detect Abnormality → STOP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine an agent working on a task. It modifies several files sequentially. Tests pass until an important invariant breaks. A naïve agent continues attempting fixes randomly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Test failed. I’ll try another approach… and another… and another.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In doing so, it accumulates a massive amount of unverified state. A Jidoka-inspired agent behaves deliberately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Makes Change
       │
       ▼
  Verification
       │
       ▼
Abnormality Detected ──► STOP ──► Investigate ──► Fix ──► Verify ──► Continue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent should not merely be capable of stopping; it should be designed to stop.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Andon Cord
&lt;/h3&gt;

&lt;p&gt;Toyota uses an Andon signal to make abnormalities visible and draw immediate attention to the point of failure. While software already uses crude signals like failed CI builds or production alerts, AI agents allow us to make every invariant an Andon cord:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Type safety violated&lt;/li&gt;
&lt;li&gt;❌ API contract changed&lt;/li&gt;
&lt;li&gt;❌ Security policy violated&lt;/li&gt;
&lt;li&gt;❌ Migration is destructive&lt;/li&gt;
&lt;li&gt;❌ Test coverage dropped&lt;/li&gt;
&lt;li&gt;❌ Performance budget exceeded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The critical distinction is that the signal is not just a passive warning displayed on a dashboard; it is an active control mechanism. The agent loses permission to continue until the abnormality is resolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. Poka-yoke: Mistake-Proofing the Environment
&lt;/h2&gt;

&lt;p&gt;Poka-yoke focuses on using fail-safe mechanisms to avoid simple mistakes entirely. We tend to frame software verification as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How can we detect whether the agent made a mistake?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A far better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can we make it impossible for the agent to make this particular mistake?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If an agent needs to modify a database, giving it unrestricted access relies on post-hoc testing to catch dangerous operations. Designing a poka-yoke environment changes the interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────┐      ┌──────────────┐      ┌──────────────┐      ┌──────────────────┐
│ Agent │ ───► │ Database Tool│ ───► │ Policy Layer │ ───► │ Allowed Operation│
└───────┘      └──────────────┘      └──────────────┘      └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A destructive operation simply isn’t available through the interface. The agent cannot execute it because the capability does not exist in that context.&lt;/p&gt;

&lt;p&gt;This applies equally to dependency installation, secret access, schema migrations, and permission changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Design Principle:&lt;/strong&gt; Don’t teach the agent not to make a mistake when you can design the system so the mistake cannot be made.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. Quality at the Source &amp;amp; WIP Limits for Uncertainty
&lt;/h2&gt;

&lt;p&gt;An agent executing a dozen changes before running verification creates a massive search space when a failure inevitably occurs. Diagnosing which assumption failed becomes exponentially harder as unverified work accumulates.&lt;/p&gt;

&lt;p&gt;AI coding agents require a concept similar to Work-in-Progress (WIP) limits. Instead of tracking open tickets, we should limit the amount of unverified change in the system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Make Small Change
            │
            ▼
         Verify
            │
            ▼
    Make Another Change
            │
            ▼
         Verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consider an agent operating with a &lt;strong&gt;Verification Debt&lt;/strong&gt; budget:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unchecked Invariant = +1&lt;/li&gt;
&lt;li&gt;Unvalidated Dependency = +1&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unverified Integration = +1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verification Debt = 0&lt;/strong&gt;: Agent proceeds freely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verification Debt = 3&lt;/strong&gt;: Agent must verify before taking further actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verification Debt = 5&lt;/strong&gt;: Agent is stopped completely.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  VI. The Economics of Inspection
&lt;/h2&gt;

&lt;p&gt;Not every verification step needs to carry the same execution cost. Cheap defects must be caught cheaply through a tiered inspection pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────────────────────────────────────┐
│              Syntax / Parsing             │  ◄── Fast / Cheap
├───────────────────────────────────────────┤
│               Type Checking               │
├───────────────────────────────────────────┤
│              Static Analysis              │
├───────────────────────────────────────────┤
│                Unit Tests                 │
├───────────────────────────────────────────┤
│               Contract Tests              │
├───────────────────────────────────────────┤
│             Integration Tests             │
├───────────────────────────────────────────┤
│              E2E / Behavioral             │
├───────────────────────────────────────────┤
│          Adversarial Verification         │  ◄── Slow / Expensive
└───────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an agent references a non-existent function, it should not require a 45-minute integration suite to catch it. In a high-throughput environment where an agent generates dozens of candidate changes an hour, optimizing the verification loop itself is critical to preventing systemic bottlenecks.&lt;/p&gt;

&lt;h2&gt;
  
  
  VII. Process Control and Root-Cause Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Statistical Process Control
&lt;/h3&gt;

&lt;p&gt;In traditional manufacturing, quality control monitors the process, not just individual outputs. If an agent’s defect rate suddenly spikes, focusing only on single test failures misses system-level shifts (e.g., context window truncation, degraded model weights, altered tool behavior, or stale API specs).&lt;/p&gt;

&lt;p&gt;Tracking process-level metrics provides visibility into the health of the system:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Target Baseline&lt;/th&gt;
&lt;th&gt;Out-of-Control State&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compile Failures / 1,000 Changes&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test Failures / 1,000 Changes&lt;/td&gt;
&lt;td&gt;3.1%&lt;/td&gt;
&lt;td&gt;8.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reverted Changes&lt;/td&gt;
&lt;td&gt;0.9%&lt;/td&gt;
&lt;td&gt;5.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Findings&lt;/td&gt;
&lt;td&gt;0.03%&lt;/td&gt;
&lt;td&gt;0.11%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When metrics breach baseline thresholds, the relevant question isn’t “Is this code change bad?” but “Has the production process itself gone out of control?”&lt;/p&gt;

&lt;h3&gt;
  
  
  Human Review Shifts Upward
&lt;/h3&gt;

&lt;p&gt;When an engineer oversees dozens of autonomous agents, manual line-by-line code review becomes impossible. The human role shifts from reviewing individual diffs to evaluating the integrity of the generation process: verification coverage, failure patterns, architectural invariants, and root causes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kaizen (Continuous Improvement)
&lt;/h3&gt;

&lt;p&gt;When a failure occurs, the agentic loop should produce process knowledge rather than simply retrying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Test Fails ──► Containment ──► Identify Abnormality ──► Root-Cause Hypothesis ──► Fix &amp;amp; Regression Protection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every failure should permanently update the system constraints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Task Fails (Stale API Docs)
              │
              ▼
    Add Contract Test
              │
              ▼
   Update Agent Constraint
              │
              ▼
  Improved Production System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  VIII. End-to-End Traceability
&lt;/h2&gt;

&lt;p&gt;When a defect manifests in production months after deployment, tracing its origin in an agent-generated codebase requires a complete provenance chain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirement → Agent Session → Model/Version → Context &amp;amp; Tools → Verification Logs → Human Approval → Commit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding defect origin shifts our diagnosis from “Who wrote this code?” to “What production process generated this code, and where did that process fail?”&lt;/p&gt;

&lt;h2&gt;
  
  
  IX. Conclusion: The Quality System Is the Deliverable
&lt;/h2&gt;

&lt;p&gt;The conversation around AI coding agents focuses heavily on the agent itself: which model, which benchmark, which context window, which reasoning capabilities.&lt;/p&gt;

&lt;p&gt;These factors matter, but the system surrounding the agent will ultimately matter more. A mediocre agent operating inside an exceptional verification environment will consistently outperform a brilliant agent operating inside a weak one.&lt;/p&gt;

&lt;p&gt;The future of autonomous software engineering is less about building an AI that never makes mistakes, and more about building a production system in which mistakes are cheap, contained, visible, and quickly corrected.&lt;/p&gt;

&lt;p&gt;The first wave of Lean software development optimized for flow, reduced batch sizes, and shorter feedback loops. The next evolution will focus on verification. As production costs drop toward zero, quality engineering becomes the primary constraint.&lt;/p&gt;

&lt;p&gt;The most important question in modern software development is no longer “How do we build software faster?”&lt;/p&gt;

&lt;p&gt;It is: &lt;strong&gt;“How do we build a system that produces software extremely fast without letting defects escape just as fast?”&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
