How AI Tests Software
How AI Tests Software by Jason Arbon Begin reading

How AI Tests Software

By Jason Arbon · Complete, free online edition

Read How AI Tests Software by Jason Arbon free online: practical AI testing, intent-based tests, test agents, evidence, and release confidence for software engineers and testers.

Complete HTML edition

Dedication

For my son, Mateo, whose hitches in Montana inspired me to keep going.


About this book

The subject is how AI Tests software - whether that software was written by people, generated by AI, or built through both. It is not a general book about testing AI models, although models can be interfaces, actuators, and fallible judges within a software-testing system.

Who This Book Is For

This book is written first for software engineers working with AI coding agents, and second for software testers. Start with a running application and a question about whether it works. The book explains the testing vocabulary as you need it.

You don’t have to read this book in order. Choose the path closest to your work, then follow the references when another part of the quality loop becomes relevant.

  • Developer: Start with Chapters 1, 3, 13, 9, 17, 20, 21, and 22: evidence, product control, source-aware risk, legacy upgrades, the AI Test Harness, continuous AI test selection, and release confidence.
  • Tester or QA leader: Read sequentially through AI Checks, AI Tests, confidence, and transformation. The argument builds from immediate techniques into a complete AI-first quality operating model.
  • Engineering leader: Read the Introduction, Part IV on the AI Test Harness, Part V on people, models, economics, and adoption, and Part VI on the future of software validation.
  • Tool or framework builder: Focus on intent contracts, AI-first frameworks, orchestration, cloud execution, evidence contracts, and the AI Test Harness testing itself.

Foreword - James Whittaker

When I was an engineering director at Google, Jason Arbon and I took long walks around Kirkland plotting the end of human involvement in testing. Of course, crowdsourced testing cut a lot of the manual bits, but what could ever take over the role of the human in automated testing? Without a human test engineer, automation was unguided, meandering, aimless even. Nor could automation, no matter how sophisticated, interpret test results, file bugs and assist in retesting fixes in new versions.

Something approaching mechanical expertise – and I mean not only deep testing expertise but also knowledge of software engineering, debugging and a familiarity with the code base and tools – would have to be invented. What could do this besides humans?

Making this even more difficult is AI has created software applications many orders of magnitude more complex than the systems Jason and I were pondering two decades ago. Indeed, what can test AI other than AI.

This is the era in which we now exist and there is no one who has thought about it more, experimented more, tooled more and tested using AI more than Jason Arbon. The book you hold in your hand or are staring at on your screen is by far the most important book for modern day testers. Indeed, it may well be the only book that matters in a world of nondeterminism at scale.

I would wish you all good luck (and you will need it) but the fact that you acquired this book increases your chances of releasing good software more than anything else you could have done.

Foreword - Phil Lew

A few months ago I did something I hadn’t done in years. I sat down and tested software.

Jason and I wanted to sort the work of testing into buckets. What can AI find easily, reliably, and accurately, without someone telling it exactly what to do? What can it find only some of the time, or only with a lot of direction? What does it miss entirely? And what does it report with full confidence that turns out to be just plain stupid? Answer those questions and you know where your people belong. Why spend human effort on bugs a machine can find reliably in minutes?

So a few experienced testers and I took an application and went bug hunting. Claude went hunting too, on the same application. Then we compared lists.

The first bucket filled up quickly. If the requirements said a field should reject a value, or a workflow should end in a certain state, Claude checked it, and checked it well, often matching what I found. That was humbling enough. It’s also work I no longer want to pay a person to do.

Claude also reported a few things that weren’t problems at all, with the same confidence as everything else. Weeding those out quickly is its own skill, and it belongs on any honest list of what AI costs you.

The testers found a different kind of problem. In one case, two requirements each made sense on their own. Claude tested both and both passed. But in certain situations, the two together produced something no user would accept. Neither requirement was wrong. Nobody had written down what should happen when they met. Any of us could see the problem the moment we used the software the way a real person would.

Claude didn’t see it. Each piece matched what was written, so as far as Claude could tell, the software worked.

Good developers know this. You hand them a spec, they implement it, and then they come back with questions. Did you mean that? Those questions matter because nobody can write everything down. Requirements have been a pain for as long as I’ve been in this business, and that’s why business analysts have jobs. The philosopher Michael Polanyi put it simply back in 1966: “We can know more than we can tell.” Every experienced tester carries around a head full of things they’ve never told anyone, mostly because no one ever asked.

Claude, at least in our experiment, rarely came back with questions. It read what we gave it and tested that.

Whatever is easy to write down completely, AI can test, and test fast. Whatever is hard to write down completely and accurately is still hard for AI. That idea is now at the center of a matrix we’re building at IcebergQA, so we can take human effort out of some places and put it where it counts. And I’ll admit those buckets won’t hold still.

Jason has spent his career pushing toward a future where AI tests the world’s software, and his map is a serious one: intent instead of scripts, testing agents working beside coding agents, and a straight answer to the question every release comes down to. Do we know enough to ship? I’ve spent much of my career on software metrics, and I’ll admit our industry often counted things because they were countable. Pass rates, defect counts, and green dashboards never answered that question. Jason goes after it directly. Much of what he describes is about giving AI more context: the code, the change, the history, the conversation that produced it. Every bit of that moves something from a person’s head into a place the machine can read. The documentable bucket gets bigger every year.

Where Jason and I still disagree is how big that bucket can ever get. In Chapter 27, “Works as Written. Still Feels Wrong,” he treats this as a problem AI is learning to solve. I see it as the same requirements problem we’ve always had, now showing up in a new place. We’re running the experiments to find out, and I’d encourage you to run your own.

Testers, read this with your skepticism switched on. Developers, this book was written for you first. When your agent can produce a thousand lines before lunch, remember that it knows only what someone told it. And when those lines break something in production, your agent won’t be the one explaining it to the customer.

I started XBOSoft in 2006, and for twenty years we’ve sold the judgment of human testers. After that afternoon, I think I understand better what we were actually selling. Checking software against requirements was part of it. The bigger part was everything our testers knew and couldn’t tell.

How much of what you know about your software have you actually written down? And how much of it could you, even if you tried?

Phil Lew

Preface — Testing the World’s Software

James Whittaker would occasionally walk around Google’s Kirkland campus and into the nearby neighborhoods. Every once in a while, he invited me along. Those walks were great. We would get away from the screens and talk about what software could become, how it might be built and validated differently, and how far automation could really go.

On several of those walks, I told him some version of the same idea: software testing should eventually be fully automated—no humans in the loop. A build should come out, the testing system should understand what changed, and it should do everything necessary to determine whether the software worked. It should find the problems, explain them, help repair them, test again, and keep improving quality until there was no useful testing work left to do.

Then came the annoying question: how do you work backward from that future? What has to exist before testing becomes a complete loop instead of a pile of scripts, frameworks, dashboards, handoffs, and people desperately trying to hold the whole product in their heads?

James may have thought I was a little nutty. That would have been fair. The technology was nowhere near ready. But since those conversations, I have been on a mission for most of my career to test the world’s software.

That ambition grew in stages.

Working on Bing taught me that you could index the internet. Bing was an early major search engine to put machine-learned ranking at the center of finding useful results. The web looked impossibly large, messy, inconsistent, and constantly changing, but a machine could still crawl it, organize it, and build a useful model of what was there.

Working on Chrome taught me that you could test the web at scale—but not very intelligently. You could run enormous numbers of checks, exercise pages, collect failures, and detect patterns. Scale was possible. Understanding was missing. The machines could do what we told them to do, but they did not know what a product was trying to accomplish. They could not tell which failures mattered or what a real person would find confusing.

At Applause, I saw the other side of the problem. Most applications needed far more coverage than their teams could afford. There were always more devices, countries, users, workflows, states, integrations, accessibility needs, privacy expectations, and failure conditions than any normal testing program could reach. There were bugs everywhere—not because people did not care, but because the surface area of software had outrun the available time and labor.

At test.ai, I learned the next lesson the brutal way. We hand-tuned neural networks to recognize shopping-cart icons and other interface elements. We spent days crawling applications, taking screenshots, chopping them into individual elements, and labeling every piece. It was slow, repetitive, expensive work. It also proved something I could not unsee: a machine could begin to identify what needed testing and how to interact with it across many applications.

We even built self-tuning hyperparameter systems that could determine which signals were most useful for training different classifiers. That was an early glimpse of a larger truth: the system could learn not just to recognize an interface element, but how to improve the machinery that recognized it.

I also began to realize that many applications look fundamentally alike. They have the same widgets, components, forms, fields, buttons, shopping carts, and common workflows. I would think of them more as eigen apps: recurring application shapes whose shared properties meant that vast swaths of similar software could be automated with the same relatively crude, basic AI system. I am borrowing the mathematical word loosely. An eigenvalue describes a stable characteristic of a transformation; here I mean the recurring, almost average feature profile across a family of similar applications or software. If an agent could understand that common form, it did not have to start from zero on every individual app.

Those systems could recognize pieces of software. They still had no idea what the whole thing meant.

Large language models changed that.

Now LLMs are connected to the internet and tools. Harnesses and coding agents let them work for hours instead of answering one prompt and going home. Give them context, memory, permissions, executors, evidence, and a loop, and suddenly they can inspect, plan, generate, operate, observe, challenge, repair, and retest. This may not be wonderful news for AI safety in every context. For software testing, it unlocks the thing I had been waiting for.

LLMs are unusually well suited to software testing because they can think like a person, see like a person, communicate like a person, and operate software through tools. Even their weaknesses are strangely relevant. They can misunderstand, become confused, make assumptions, and occasionally hallucinate. Those are real problems, and any serious testing system must account for them. But they also resemble the kinds of confusion and interpretation failures that software creates for human beings.

The purpose of software is to perform work on behalf of another machine or, more importantly, for people. A testing system that can interpret an interface, pursue a goal, notice friction, question an explanation, read the implementation, inspect logs, and compare what happened with what should have happened is closer to the tester we always wanted than any traditional automation framework.

As LLM capabilities have accelerated, they have crossed an important threshold. For a growing share of testing work, AI is faster, cheaper, more adaptable, and able to cover more ground. In many cases, it is also more reliable—not because an LLM never fails, but because it can combine more context, more evidence, and more testing perspectives than a person or fixed script could afford to apply repeatedly.

This book is my attempt to dump what I learned before I forget the interesting parts: generations of models, an embarrassing number of burned tokens, more burned hours, and a fair amount of stress. I have often felt lonely on this quest, which is obviously a first-world problem. Most of the stress came from seeing the opportunity so clearly and wanting the technology to move faster. The exciting part was realizing that the mission of testing the world’s software might finally be achievable.

The first breakthrough is that AI makes testing generic.

Traditional automation records procedure. Click this selector. Wait for that element. Enter this value. Check this string. That procedure is tightly coupled to one application, one interface, and one moment in the product’s history.

An AI-native test can preserve intent instead: make sure a qualified customer receives the correct discount exactly once; make sure a person can recover from an interrupted payment; make sure increasing the text size does not make checkout unusable; make sure one tenant cannot retrieve another tenant’s order.

The execution can be deferred to AI. The AI can choose the browser tool, API client, test framework, device adapter, or cloud worker. It can adapt to harmless changes without weakening the goal. More remarkably, the intent itself can now be generated. Given the product, code, requirements, business context, prior failures, and current change, AI can identify what should be tested before anyone writes a test case.

That same generic intelligence creates another possibility: benchmarking the world’s software.

Applications are not all unique snowflakes. Those recurring shapes—the eigen apps I mentioned earlier—give us a basis for comparison. Commerce applications need to get customers from discovery through checkout and handle recovery when something goes wrong. Collaboration products need to let people share work without losing control of it. Even across categories, we can compare everyday behaviors: does a form explain an invalid entry? Can a person recover from an error? Does the product protect private data?

Once you can test many applications consistently, you can measure the norms. How buggy is the average application in this category? What is normal performance? How usable is the typical checkout? How often do forms mishandle boundaries? Which accessibility failures are common? What does good recovery look like among comparable products?

Before this, a test result was usually an isolated absolute value. Your page took this long. Your flow had this many problems. Your suite passed at this rate. But was that good? Was it terrible? Were you ahead of comparable products or behind them?

Most teams never had the money or access to test applications other than their own. Even at Microsoft and Google, meaningful comparative testing happened only on rare occasions. At world scale, benchmarking turns isolated evidence into context. We will never fully test even one nontrivial application. But if we understand how similar applications behave, where they fail, and what their users reasonably expect, we can make much better judgments about the application in front of us.

The second and most significant breakthrough is that the testing agent can now talk to the coding agent.

Before the summer that triggered this book, our testing systems could already generate bugs with a fix prompt attached. Copy it into the coding agent and the agent could start the repair. I thought that was ridiculously cool. A bug report was no longer a dead description waiting in a queue. It carried the beginning of the fix.

I experimented with eliminating even that copy-and-paste step. I used accessibility APIs to control the coding-agent application directly and stuff the prompt into it. It was a hack, but it worked well enough to reveal the destination: AI testing agents and AI coding agents could communicate.

Plugins with similar skills, state, and MCP architecture have now made that connection real and scalable.

A QA agent can now operate inside the same coding-agent environment as the builder. This unlocks some of the most powerful ideas we have ever had about software quality. The QA agent can see the complete codebase, current diff, requirements, tests, environment, and conversation that produced the change. It can deliberately ignore that information when it needs a black-box perspective. But when it needs to assess risk, find exact boundaries, trace state, understand an authorization rule, or identify the likely source of a failure, it has better white-box visibility than any tester who could only browse the code part-time.

Most importantly—and this is the whole game—it has context.

When the QA agent finds a defect, it knows how to report it. Increasingly, it knows how to fix it too. That is the key change. It knows how to fix it.

Inside an agentic development environment, the coding agent can finish a body of work and invoke a professional testing harness through a plugin or MCP interface. That harness can assemble specialized QA agents and subagents, analyze the change, generate a risk-based plan, execute local or cloud tests, gather screenshots and structured evidence, challenge its own findings, and return fix-ready issues. The coding agent can reproduce and repair them. The testing agent can verify the repair. Then they can loop.

They can continue until the important coverage exists, the observed failures are resolved or accepted, the evidence is strong enough, and confidence has converged on a release decision. A human can remain responsible for priorities, permissions, taste, policy, destructive actions, and whether to ship without being forced to sit between every coding and testing step.

We are entering an age in which software can be created and validated in one continuous loop with no human handoff in the middle.

That matters because generative AI has moved the bottleneck. It is now cheap to produce code, applications, documents, images, and other artifacts. The scarce thing is no longer output. The scarce thing is justified belief that the output is good: that it works, that it is safe, that it has taste, that it serves the intended person, and that it is ready to release.

Quality is the hard problem now.

More precisely, confidence is the hard problem of software.

I mean that as an analogy to David Chalmers’s famous distinction between the tractable functional problems of consciousness and what he called the hard problem: “The really hard problem of consciousness is the problem of experience.” In software, we can increasingly generate code, generate tests, operate the interfaces, execute scenarios, count passes, collect logs, and build dashboards. Those are crucial functional problems, and AI is making many of them dramatically easier. But none of them alone answers the question that matters at release time: given the evidence, the risks, the unknowns, the people affected, and the consequences of being wrong, why should we believe this software is ready?

That is the hard problem of software confidence. It is not a metaphysical claim that software has consciousness, and it is not solved by an AI saying it is confident. It is the practical and epistemic problem of turning incomplete, correlated, changing evidence into justified belief and an accountable decision. This book is about how AI can help construct that argument - and how it must remain honest when the argument is not yet strong enough. David J. Chalmers, “Facing Up to the Problem of Consciousness”

Confidence does not mean a green dashboard, a pile of generated tests, or an AI insisting that its own work looks correct. It means having enough relevant, repeatable, skeptical evidence to make a decision while remaining honest about what was not tested, what was not measured, and what could still be wrong.

For most of my career, the dream on those trails in Kirkland was always out ahead of the technology. We could imagine the loop, but we could not build it. Now the coding agents exist. The testing agents exist. They can share context, tools, intent, evidence, fixes, and memory. They can improve the product and the regression system together. They can keep working until the remaining uncertainty is visible and the software is ready—or until the honest answer is that it is not.

We are not finished. These systems still make mistakes. They still require boundaries, skepticism, measurement, and human authority for now, but we can see the finish line where AI can reliably generate the software to test the software it generates.

We are almost there.

—Jason Arbon

Prologue - The Knock Knock Joke

The dialogue in this story is a summary, not a verbatim transcript.

Testing should be fun. AI can help make it fun. I do not mean the job description or the conference talk. I mean the actual test can be fun.

While I was working on this book, I was also working on a project with Jason Huggins to get bots on different platforms and devices to communicate with one another. That Jason created a little thing called Selenium. He also helped launch Appium: Dan Cuellar created its original iOSAuto implementation, and Huggins encouraged open sourcing, added HTTP/WebDriver support, and proposed the Appium name, as the official Appium history recounts. Selenium and Appium have been enormously useful, but they require people to handcraft hard-coded scripts in a high-level programming language: click this, verify that, enter this text, wait for that response. Someone must describe the underlying mechanics of finding, operating, and judging every control.

Vibium is the opposite direction. It is the AI version of Selenium that Jason is working on now. On this project, he can give it intent: “Send the message from bot one to bot two.” We do not have to specify how to find the controls, where to click, which selector to use, or every intermediate operation. Vibium can receive the instruction and let the agents determine how to carry out the test across the systems available to them.

The project Jason and I are working on is a demo for, of all places, Google. We cannot escape the gravitational pull. It is also interesting that even Google could still use some help with test automation and especially AI to test software.

Then I watched something that made my test-nerd brain light up. The bot moved too fast for an iOS device. It hit Send before the first keypress had registered. The AI watched itself, noticed the mangled input, slowed down, repeated the message, tried again, and remembered the constraint for later. Forget self-healing a selector. It recovered from an end-to-end system error while the test was running.

People complain that Selenium and Appium tests are flaky. Often the framework is not the actual problem; the test code, timing assumptions, or environment is. But resolving that distinction normally requires a human to notice a false positive or false negative, debug it in front of the whole team, edit the script, rerun it, and hope the repair holds. That burns hours of labor and stresses everyone out. An AI testing system can observe the interaction, adapt its timing or flow, verify whether the intended outcome was still reached, and retain what it learned.

Then it got even cooler. Testers.ai generated many of the cases and flows, then inspected the output after execution. It saw the timing error. It also saw that both clients received the same message. For the actual intent—verify Android-to-iOS messaging—the product worked. The system preserved the execution problem, decided it was not a user-facing product defect, and spared a person a completely pointless bug report.

This is catnip for test-automation people: different systems, different interfaces, uncertain timing, shared state, and an end-to-end result that exists only when the whole chain works.

The obvious test would be painfully literal. Have one device say, “Hello, I’m phone one.” Have the other answer, “Hello, phone one. I’m phone two.” Verify that both messages arrived. Done.

Jason had a better idea. He prompted the agents to have the devices tell each other knock-knock jokes to verify that the complete cross-platform interaction worked.

Phone 1: Knock, knock.
Phone 2: Who’s there?
Phone 1: A software tester.
Phone 2: A software tester who?
Phone 1: I’ll tell you after you fill out this CAPTCHA.

That was the highlight of my test-nerd day.

It is also a surprisingly good test. The devices have to establish identity, take turns, preserve context, understand the setup and response structure, exchange information across platforms, and keep the conversation moving until the joke resolves. A failure may expose transport, timing, transcription, state, turn-taking, formatting, model, or interface problems. The test is more human, more memorable, and more demanding than two machines exchanging sterile acknowledgments.

This is the change. The successor to Selenium is not a newer driver with prettier syntax. Give it intent in ordinary language. It works out how to operate the available systems, adapts when reality gets weird, and remembers whether the goal was actually accomplished. We are no longer limited to whatever procedure somebody had the patience to encode six months ago.

Traditional testing frameworks will not remain as an enduring category. Selenium, Appium, Playwright, page objects, test-case repositories, bug trackers, and fixed dashboards are scaffolding from an era when people had to reduce a complicated system to artifacts they could read, customize, sort, hand off, and maintain. That was useful. It is no longer the right center of gravity.

Every layer of computing has worked this way. Python and C are abstractions over lower-level languages, which are abstractions over assembly, machine code, chip architecture, and ultimately transistors. People need those layers to manage complexity. An AI agent does not need a human-shaped testing framework between its reasoning and the product. It can think from the raw underlying code and the live system. It can read the DOM, accessibility tree, events, logs, network traffic, APIs, and state. It can now understand images and video as well as text, understand and generate voice, and directly operate through those same media. The old abstractions often add verbosity, hide useful capability, constrain what can be observed, and slow the loop down.

The framework code itself is generated when it is temporarily useful, then regenerated or discarded when the product changes. The durable artifact is not the framework. It is the intent: what promise matters, which risk must be explored, what evidence is required, what action is authorized, and what result would change the decision.

The same is true of separate systems of record. Jira for bugs, issue tracking, test-case management, result repositories, and reporting dashboards exist because people need to persist and retrieve artifacts slowly enough to understand them and coordinate around them. In an AI-based SDLC, many of those artifacts are not valid or relevant long enough to deserve a separate destination. The agent can keep the necessary evidence and history in its working context, then generate the exact report, issue, test view, or audit record when a human or an external obligation currently requires it. Saving information in one human-era system only to retrieve it into another is unnecessary latency.

Chapter 28 develops the human feedback loop; Chapter 33 returns to how that role may change. For now, the goal is to bring a person in at the right time, at the right place, and where current capability or authority makes that judgment most useful. The amount of mechanical human work will continually diminish. The work that remains—taste, consequence, authority, ethics, and the decision to ship—may persist where systems still need it, but the book does not assume it will remain permanently human work.

Testing has spent too many years acting like the grim tax paid after creation. That is a terrible sales pitch and, now, an obsolete architecture. Testing becomes part of creation: exploratory, generative, collaborative, occasionally weird, and capable of surprising us.

Two phones telling each other knock-knock jokes may sound small: one small joke for two phones, one giant leap for software testing.

Testing is becoming more rigorous.

It is also going to be fun.

This book is not Testing AI

This book is the companion and, in an important sense, the opposite of my book Testing AI. Testing AI is about using software, AI, statistical methods, evaluation systems, and people—whatever the system requires—to determine whether an AI system is correct, safe, useful, and ready for its intended context. That is a distinct quality problem because the system under test is often probabilistic, non-deterministic, generative, and creative. Its value may be that it produces different valid outputs on different runs, and an evaluator may not know in advance exactly what it will say, retrieve, decide, or do. Testing it calls for sampling, distributions, evaluation criteria, judges, human disagreement, calibration, and uncertainty-aware release evidence.

This book is about using AI to test traditional software: software written by people, generated by AI, or built through both. The software under test may be assembly, binary machine code, C, Python, Java, JavaScript, or another language; the implementation form is not the distinction. In the ordinary case, it is procedural code with a repeatable intended behavior: the same inputs, state, configuration, and environment should produce the same observable result. A random number generator can vary an outcome, but it can usually be seeded, controlled, or tested as a declared source of variation. AI can generate that code, but code generation does not turn the resulting application into an AI system that needs model evaluation.

AI systems are software in the broad technical sense, and real products increasingly combine both. An AI assistant may call ordinary APIs; an ordinary checkout flow may use a model for ranking or support; a coding agent may generate both. The two testing programs can and should meet in the larger system. But their central techniques remain different: test a procedural promise with interaction, invariants, controlled state, and reproducible evidence; test a probabilistic AI behavior with repeated samples, appropriate variation, calibrated judgment, and explicit uncertainty. This book stays focused on the first problem: how AI Tests traditional software.

A note on implementation

The method in this book is product-independent: preserve intent, gather evidence, execute safely, challenge findings, measure confidence, and make a release decision. Readers can implement that loop with different models, frameworks, storage systems, workers, and interfaces. CARBON is a reference implementation of the AI Test Harness described in this book.

CARBON is my effort to encode what I have learned in this book—and across my career in software testing—into a system you can actually use. It draws on my work at Google and Microsoft, leading engineering and product at Applause (uTest.com), and building AI testing systems at Test.ai. I want that experience to do useful work in your project, not just sit on a bookshelf. Appendix G gives the background and shows how to get started.

CARBON’s public repository is github.com/jarbon/carbon-free. It includes both the Claude plugin and the OpenAI Codex plugin manifest. Follow the repository README and the host-specific installation instructions for your coding agent.

Throughout the book, callouts like this connect an idea to a CARBON command you can try in your coding agent:

Try it with CARBON: /carbon-help — Inspect this repository and recommend the smallest useful first testing pass.

Want to try the ideas as you read? The companion exercises reuse the course’s Pause and Practice lessons, with sample artifacts and prompts to copy into your AI coding agent. Look for Pause and practice callouts throughout the book.


Introduction - Meet TestBucks

Don’t just automate the old workflow. Rethink the work.

With a new technology, our first instinct is often to reimplement what we already do rather than rethink how we do it. In testing, that means asking AI to write more test cases, generate more scripts, and fill the same dashboards faster. That can help, but it leaves much of the old process intact. This book is about the bigger opportunity: start with the product behavior that matters and the evidence you need, then rethink how AI can investigate, test, challenge findings, and help verify repairs. The goal is not to reproduce yesterday’s testing process with AI. It is to build a better one.

TestBucks is the fictional coffee-shop website we will use throughout this book. It has a menu, customizable drinks, a cart, and pickup orders. We will use this familiar example to explore how AI finds bugs and tests software.

Figure Intro.1. Meet TestBucks: the fictional coffee shop we will test, using synthetic data and simulated orders.

Prompt

Test the TestBucks coffee-shop website for bugs. Use synthetic data and simulated orders only. Show me the evidence for anything you find.

Open your AI coding agent and give it that problem. You do not need a framework project, a test-case database, or a dashboard before you begin. You need a product, a useful question, and permission to investigate it.

Who this book is for. This book is primarily for software engineers building and changing software with AI coding agents. You can generate a feature quickly; the next question is whether it works, what it might break, and whether you should ship it. We will put the agent to work on those questions beside the code. You need basic familiarity with source code, a browser, and running a local application—not a testing certification or an existing automation framework.

Software testers are the second audience. Bring your experience of how products fail. The same examples show how to turn that experience into prompts, test intents, and workflows that an agent can execute and you can challenge.

TestBucks is inspired by Starbucks, but it is not an affiliated service. To follow along, open TestBucks. The companion materials include the screenshots and downloadable source so you can also run it in your own environment.

The screenshots below come from that local app. Agent conversations and scores are illustrative teaching examples, not transcripts of an AI audit. Later chapters extend the fictional shop with accounts, service APIs, payment ledgers, and native clients; those designs are not claims that the starter app already implements them.

Your first sixty minutes

Minute 0-10: ask for evidence, not a test script

Prompt

Inspect the TestBucks homepage and menu. Capture a screenshot and DOM, then collect console and network evidence if available. Separate what you saw from what you inferred. Do not use real personal information or connect to a real payment service.

Illustrative AI response

Starting point. TestBucks has a menu, drink customization, cart, and practice orders. I will use the vanilla-latte journey as the first test.

Evidence boundary. A homepage screenshot can show layout and labels. It cannot prove that an order will be saved or that a retry is safe.

Minute 10-20: run a real AI Test by intent

Prompt

In TestBucks, find a vanilla latte, choose medium size, oat milk, and one extra shot, then add exactly one to the cart. Verify the drink, options, quantity, and $6.60 total including training tax. Stop before checkout. Preserve the evidence and report what actually happened.

Illustrative AI response

Result: PASS for this cart intent. One medium vanilla latte with oat milk and an extra shot is in the cart. The subtotal is $6.00; 10% training tax rounds to $0.60; the total is $6.60.

Not established. This verifies the selected drink in the cart, not a completed purchase or the whole shop.

Figure Intro.2. The TestBucks cart after selecting the example drink. The image is a local UI capture; the accompanying agent response illustrates the report a reader should request.

Minute 20-30: inspect an artifact for a possible bug

The practice app includes a deliberate search fault. Follow its README to enable the search fault, open the menu, and search for vanilla. The drink disappears from the results even though it exists in the menu. The fault switch makes this example repeatable.

Prompt

Inspect this TestBucks menu screenshot and the supplied catalog context. The search is vanilla, but the page shows no drinks. Identify the possible issue, the strongest alternative explanation, and the next test that would settle it. Use the OpenTest.ai bug format.

Illustrative AI response

Candidate. Searching for vanilla returns no drinks even though the catalog includes a vanilla latte.

Counterargument. A store filter or unavailable item could explain an empty result. A screenshot alone does not establish the cause.

Next test. Compare the same query with the seeded fault enabled and disabled, from the same starting state.

Minute 30-40: challenge the finding

Prompt

Reproduce the TestBucks vanilla-search issue in the local lab. Compare the fault-enabled page with the normal page. Check the search implementation. Preserve both results and distinguish the deliberately seeded defect from a problem in a real coffee company’s website.

Do not reward the agent for merely repeating its first conclusion. Look for the controlled comparison: same catalog, same query, different fault state. Chapter 1 follows that candidate into a portable issue record.

Minute 40-50: generate the next useful tests

Prompt

From this TestBucks journey, propose the three most useful tests to run next. Start with what could go wrong when the customer changes the quantity or retries an order. Explain what each test would prove and what evidence it needs. Do not count a proposed test as executed coverage.

Illustrative AI response

Next tests. Check whether an invalid quantity is rejected. Reload a valid cart to see whether it survives. Then try a simulated timeout and verify that retrying does not create a duplicate order.

Deferred. Cross-device accounts and real payment-provider reconciliation require an extended environment, not this browser-only starter.

Minute 50-60: ask for confidence, not a victory lap

Prompt

Based on the TestBucks evidence collected so far, assess readiness for the scoped release: menu search and simulated pickup ordering. List passed and failed promises, missing evidence, and the three next investigations most likely to change your recommendation.

Illustrative AI response

Decision: HOLD for the fault-enabled build. The catalog search promise fails. One cart journey passed, but checkout and recovery are not yet verified.

Next evidence. Repair and retest search, complete one simulated pickup order and reload it, then exercise a timeout and safe retry. Do not interpret a cart pass as a release verdict for the whole shop.

That is the loop in miniature: investigate the product, challenge what you find, and use the evidence to decide what to do next.

What this changes

You spent the first hour testing a product, not building a framework. That is the change this book is about.

Think about the TestBucks search failure. In a traditional workflow, someone reproduces it, writes a ticket, and explains it to the next person. With an AI coding agent, the finding can stay beside the code. The agent can investigate it and, when authorized, propose a repair. Then it can run the test again.

The tools underneath still matter. But the useful thing to preserve is the customer’s promise: searching for vanilla should find the vanilla latte. The current selector is just one way to test that promise.

The abstraction moves up

AI is really just the next layer of abstraction. We moved from machine instructions to assembly, then to higher-level languages and frameworks so we could express what we wanted without managing every detail underneath. AI takes that another step. We can describe the intent and let the agent figure out the code, tools, and actions needed to carry it out.

Consider a different promise: reject a payment above its limit without creating a charge. A test framework turns that into browser actions. A programming language expresses how those actions execute. Each layer hides some detail and exposes something useful.

Read this diagram upward for meaning and downward for implementation. Python, Java, and C are alternatives, not successive stages every program passes through.

Figure Intro.3. Keep the intent. Adapt the implementation across layers of abstraction.

That is why intent sits at the top of the diagram. AI is the layer that lets us work there while it handles the details below. Those details still exist. We just don’t have to write and maintain every one of them ourselves. We can save what the product must do and let the agent work out how to verify it against today’s implementation, instead of preserving yesterday’s clicks forever. We still check the result; a higher-level instruction is not proof that the job was done correctly.

Start with the work, not the machinery

You do not need to delete JIRA or abandon an existing suite. If your team needs a ticket, ask the agent to create one from the evidence. But the ticket does not have to be the limit of what the testing system knows.

That is also why I am excited about the economics. When a useful investigation becomes cheap, we can investigate things we used to leave alone. Instead of spending the afternoon maintaining a dashboard, we can ask why checkout failed and get a report built around the answer.

At Google, even on the products I worked on, we did not have this much QA bandwidth. Now a small team can ask for testing help that would once have required a substantial organization.

More output is not automatically better testing. The TestBucks example only became useful when we challenged the first finding and ran a comparison. Keep doing that as the work gets bigger.

Chapters 29 and 30 develop model choice and economics. Appendix F preserves the extended argument about the testing-tool stack, including the investment comparison and its sources. You do not need to settle that whole argument before running your next useful test.

Human perspective

HUMAN FRICTION — PEOPLE ASK SMALL QUESTIONS, THEN GET SMALL ANSWERS
The small-question trap
Most people fail before the first minute is over because they ask the AI little, simple questions and then receive little, simple answers. They ask it to generate one test case, summarize one log, or check one selector, and then conclude that it can only do little work.

Ask for the bounded hard problem
Ask it to own a hard, bounded problem instead: understand this product, gather the evidence, find the important failures, execute the highest-value tests, challenge your own conclusions, and tell you what would make the result more trustworthy.

The uncomfortable part
If you had Einstein in the room, you would not ask what color an apple is or how many R’s are in strawberry. You would ask for real help, real insight, and deep thinking. If we restrict it to trivia and tiny tasks, we never measure what it can do with a consequential problem. AI will meet the ambition of the question you ask.

One coffee shop, one continuous thread

TestBucks stays with us from the first screenshot to the release decision:

Stage TestBucks example
AI Checks Inspect the menu, cart, console, DOM, and price breakdown.
Crawling Discover home, menu, customization, cart, checkout, and order history.
Interactive tests Add one vanilla latte, change its options, and verify a simulated order.
Context and risk Read pricing rules, quantity limits, retry code, and customer expectations.
Intent and triage Save the purchase intent and a reproduction-first search issue.
Harness Retain results, watch changes, select regressions, and request missing evidence.
Confidence Combine known defects, passed journeys, untested recovery, and business consequence.

The starter runs locally with synthetic data. Reset its practice state between investigations. The advanced service, account, concurrency, and device examples describe extensions to the same fictional shop; use their supplied snippets or your own authorized sandbox rather than assuming a local screenshot proves those capabilities.

Your first useful question remains simple: can a customer get the coffee they asked for, at the right price, without losing an order or paying twice?

Five Terms for Talking About AI Software Quality

You do not need a testing vocabulary before using the examples. A few recurring words will help. Appendix H provides a broader glossary of the AI and testing terminology used throughout the book.

Term Meaning in this book
Oracle The rule or evidence used to decide whether a result is correct. An expected cart total is a simple oracle.
Triage Decide whether a reported problem is real, important, and ready for someone to act on.
Regression Behavior that used to work but fails after a change.
Invariant A condition that must stay true, such as one accepted order producing at most one charge.
Idempotent Repeating an operation does not repeat its effect. Retrying the same payment request must not charge twice.
Rubric Explicit criteria for judging a result, including what counts as acceptable evidence.

The book uses five explicit terms to make conversations about AI performing software quality and testing more precise. Teams otherwise use “AI testing” to mean very different things: a model looking at a screenshot, an agent completing checkout, an intent-oriented execution framework, a long-running QA operation, or a release claim. Naming the capability, the interaction, the execution layer, the workflow, and the decision language makes it easier to choose the right tool, identify what evidence is missing, and avoid mistaking a large test count for meaningful quality progress.

AI Checks: inspect quality evidence without interaction

Definition

OFFICIAL DEFINITION - AI CHECK
An AI Check is a non-interactive inspection for quality issues. It examines already captured or safely readable evidence - screenshots, video, console or application logs, network activity, DOM and accessibility trees, traces, source, configuration, API definitions, or a static artifact bundle. For a base case, an AI Check can often begin with a single prompt plus one artifact. Stronger conclusions may require a richer evidence bundle, but the AI Check itself does not perform a user journey or change product state.

An AI Check starts with evidence already available or safely readable instead of driving a journey. That makes it fast, broad, and easy to add to an existing test run.

Example 1: Visual and usability AI Check

Prompt

Review the supplied TestBucks screenshot and DOM for visible UI and usability problems. Look for clipped or overlapping content, weak hierarchy, unclear affordances, unreadable text, and confusing states. State which observations the screenshot establishes, which the DOM establishes, and what would require an interactive AI Test.

Illustrative AI response

Observed from the screenshot. The primary action is visible, but the narrow viewport clips the right edge of the final card.

Observed from the DOM. The card is present and labeled, but it is not exposed as a button or link.

Next AI Test. Use keyboard-only navigation at the same viewport, attempt to open the card, and preserve focus order plus before-and-after screenshots. The static artifacts do not prove whether the journey can be completed.

Example 2: Privacy and security AI Check

Prompt

Review the supplied TestBucks console log, redacted network trace, DOM, and API definition for privacy and security concerns. Look for exposed identifiers, unexpected third-party destinations, insecure transport or configuration signals, unsafe client-side assumptions, and trust-boundary crossings. Separate observations from hypotheses, redact sensitive values in the answer, and state what remains unknown without server-side evidence.

Illustrative AI response

Candidate. One request sends a stable account identifier to a third-party analytics origin before the captured consent action. The destination and timing are observed; the sensitive value is redacted here.

Unknown. The bundle does not establish the governing consent state, contractual purpose, server-side retention, or whether authorization is enforced after the request reaches the service.

Next AI Test. Repeat with documented reject and accept states, compare destinations and payload classes, then reconcile the result with the approved data-flow policy.

Example 3: Structure and contract AI Check

Prompt

Review the supplied TestBucks DOM and API definition for structural and contract problems. Check control semantics, missing labels, inconsistent field types, ambiguous error contracts, undocumented responses, and mismatches between the rendered interface and the declared API. Identify the smallest AI Test that could confirm each important hypothesis.

Illustrative AI response

Contract mismatch candidate. The API declares sizeMl as an integer, while the drink-size control submits the strings small, medium, and large.

Smallest confirming AI Test. Submit each visible option through the UI, preserve the request and response, reload the record, and compare the displayed value with persisted state. Until that runs, this is a structural mismatch hypothesis rather than a confirmed functional failure.

AI Checks can inspect many kinds of quality evidence. Chapter 1 contains the full catalog; begin with the artifact you already have and the question you need answered.

AI Tests: interact with the software and verify behavior

Definition

OFFICIAL DEFINITION - AI TEST
An AI Test is interactive, functional, and often stateful. It performs one or more interactions with software to invoke or verify an intent, create a condition, traverse a workflow, exercise a boundary or recovery path, or look for problematic behavior. It may drive a browser, device, API, database, command line, or other approved execution surface, and it must preserve what it did and what happened.

An AI Test might complete a checkout as a guest and verify the order, deliberately interrupt payment and verify recovery, create a record through an API and verify the downstream event, or run AI exploratory testing as a stated persona to discover confusing paths and failures. The crucial distinction is that the AI Test changes or exercises the system. It needs setup, authority, an oracle, evidence, cleanup where appropriate, and an honest result state.


AI Test Framework: execute a bounded AI Test

Definition

OFFICIAL DEFINITION - AI TEST FRAMEWORK
An AI Test Framework is a bounded execution capability that helps an agent carry out a particular class of AI Tests: for example browser, mobile-device, desktop, API, or protocol interaction. It turns high-level intent into actions and observations within that execution surface, but it does not by itself own the whole quality workflow, long-term evidence record, cross-run analysis, or release decision.

An AI-first framework can be a dramatic improvement over a handwritten procedural script. Instead of spelling out every selector, tap, wait, assertion, and recovery branch, the caller can state a goal such as, “Have phone one tell phone two a knock-knock joke, verify the message arrives, and capture any failure.” A Vibium-style device framework is useful precisely because it can interpret that intent while it controls an Android or iOS device. It remains a framework because its center of gravity is that bounded execution problem: drive this surface, gather these observations, return a result.

Frameworks are valuable tools and adapters. An AI Test Harness may invoke one for an atomic positive and negative test of a newly added Android button, select a browser framework for a checkout journey, or use a database/protocol framework for a targeted invariant. The framework does the execution work it is designed for; the harness decides whether the work matters, what else is needed, and what the combined evidence supports.


AI Test Harness: Run the Quality Loop

Definition

OFFICIAL DEFINITION - AI TEST HARNESS
An AI Test Harness is the long-running, repeatable, and stateful QA workflow around AI Checks, AI Tests, and AI Test Frameworks. It supplies context, risk, tools, authority, durable state, evidence, challenge, learning, reporting, and repeatability across the loop. It can start from an unfamiliar repository or URL, select the next highest-value work, coordinate specialized AI Checks and AI Tests, invoke the right framework or executor, preserve what was observed, route fix-ready findings to a coding agent, retest repairs, compare results across runs, and remember what must be repeated or revisited.

The AI Test Harness is the difference between asking an intelligent chatbot to have an opinion and operating a quality system that can keep working for hours, retain evidence across invocations, and support a release decision. It is not a hard-coded CI/CD workflow with an LLM bolted onto one stage. It can alter its plan as code, risk, environment, evidence, and outcomes change. It can ask for more context when assumptions are weak. It can also perform meta-analysis over the run and its history:

  • Did confidence rise?
  • Did coverage improve in the changed area?
  • Is a failure new, stale, correlated, or unresolved?
  • Is the release ready to ship, or merely better than the previous build?

An AI Test Harness can live beside—or inside—the context of an AI coding agent. The coding agent can discover it through MCP or an equivalent capability interface after changing a feature. It may invoke a small framework-level operation for a narrow question: “Use the device framework to verify that the newly added Android button works on a positive path and its most important negative path.” Or it may invoke the harness for a deeper pass:

  1. Map the changed promise and risk surface;
  2. Select AI Checks and AI Tests;
  3. Drive multiple execution frameworks;
  4. Challenge and deduplicate the findings;
  5. Generate fix-ready evidence and rerun the repair; and
  6. Return a qualified confidence and ship-readiness assessment.

The coding agent chooses the scope. The harness orchestrates the quality loop.



AI Confidence: decide what the evidence supports

Confidence in the software—not how certain the model sounds. A fluent answer can be wrong. A cautious answer can be the right response to missing evidence.

Definition

OFFICIAL DEFINITION - AI CONFIDENCE
AI Confidence is a judgment about what the evidence supports: ship, canary, hold, continue investigating, or conclude that this version is meaningfully better than the last. The judgment is qualified by the product version, context, and acceptable risk. It is not a test count, a model probability, or the agent saying “looks good.”

AI Confidence asks:

  • Have we checked the important risks with representative evidence, rather than repeated versions of the same test?
  • Which roles, states, environments, and failure paths remain unknown?
  • Are the findings severe, stale, contradictory, or merely noisy?
  • Is this version meaningfully better than a comparable prior version, or did it get lucky?
  • What next evidence would most change the decision?

A score can summarize that judgment, but it does not turn it into a probability. “80 out of 100” is not automatically an 80% chance of a safe release. Chapter 22 shows how to inspect the criteria, evidence, gaps, and release-blocking findings behind a score.

AI can help teams look beyond how many tests were generated or passed. It can identify gaps, compare releases, and ask whether repeated results provide genuinely new evidence. It can then recommend the next test most likely to change the decision.

A Harness working beside a coding agent has another advantage: access to the implementation. Source code, change history, schemas, configuration, and existing tests can explain where to look next. Few people can hold all of a large system in working memory and connect that knowledge to every change.

The agent can question the code as well as observe the product. It can identify risky dependencies, generate focused cases, and show which roles, states, and integrations remain untested.

The Harness keeps the investigation running. AI Confidence makes the resulting decision explicit and accountable.


Part I - Find and Verify Problems

Turn screenshots, logs, network evidence, and crawls into useful findings. Correlate artifacts, challenge conclusions, and deduplicate shared problems.

Chapter 1 — Start with the Evidence: Screenshots, Logs, Network, DOM, and Traces

Jason story

JASON STORY — TESTING THE TESTS THAT TEST THE TESTERS

I remember using GPT-3 on my phone to see how well it could answer software-testing certification questions. ISTQB—the software-testing certification program—had practice exams online. Of course, as a tester, I wanted to test the tests that test the testers with AI, to see how smart the AI was.

Unsurprisingly, it did very, very well. It got almost all the questions right. It struggled with some multipart questions where one answer depended on information in another question. I was feeding them in one at a time. I thought I was keeping the test fair, but sometimes I was leaving out information it actually needed.

The ironic exception was the certification material about AI itself. Some of those questions were, in my view, poorly asked, or the available answers were confusing. But that is another story.

Then GPT-4 with Vision arrived. I gave it screenshots of web pages and asked whether it could find any bugs. And it did.

That may sound ordinary today. At the time, it was mind-bending. The AI was not just recognizing what was in an image. It could understand enough about the interface to point out something wrong—to make a judgment about whether what it saw was good, bad, or a bug. That was far beyond what I had come to expect from our earlier image-recognition systems.

And I could do all of it on my phone.

That was when the question changed for me. Not just, does AI understand testing? Can it actually do the testing? Answering certification questions was impressive. Finding a bug in a screenshot was something else entirely.

AI Check catalog: much more than privacy and security

AI Checks can inspect nearly every quality dimension for which there is readable evidence. They are not limited to privacy and security, and they remain non-interactive: they inspect the supplied evidence rather than drive a user journey or change product state.

  • Visual and UI quality. Inspect screenshots or video for clipped controls, overlap, layout collapse, weak hierarchy, missing states, inconsistent spacing, unreadable text, or regressions across viewport sizes.
  • Accessibility and WCAG evidence. Inspect the DOM and accessibility tree for labels, roles, headings, focus order, semantic structure, keyboard traps, contrast evidence, and zoom or enlarged-text reflow. A richer AI Check can compare screenshots before and after a supplied font-size or viewport change without itself performing the interaction.
  • Usability and persona fit. Ask, “How good is this page for a first-time buyer, a privacy-sensitive customer, a keyboard-only user, or a person using enlarged text?” The result is a stated hypothesis about friction, backed by visible evidence, not a substitute for research with people.
  • Content and communication. Review copy, forms, error messages, disclosures, help text, and release notes for contradictions, ambiguity, missing next steps, misleading claims, unsafe instructions, or a mismatch with a specification.
  • Console and application-log health. Read logs for exceptions, failed resources, warning patterns, retries, timeouts, deprecations, correlation gaps, or client-side details that should not be exposed.
  • Network and privacy. Inspect traces for trackers before consent, unexpected third-party sharing, sensitive data in requests, insecure delivery, cache mistakes, failing resources, or surprisingly expensive payloads.
  • Security posture. Use available headers, cookies, network evidence, source, configuration, and API definitions to identify exposed secrets, mixed content, unsafe defaults, missing validation, authorization mismatches, or weak session handling. An AI Check should say plainly when the supplied evidence cannot establish exploitability.
  • Performance. Read waterfalls, traces, logs, and browser metrics for render blockers, slow resources, long tasks, expensive API calls, oversized payloads, poor caching, memory signals, and Web Vitals regressions.
More AI Check categories
  • API and contract quality. Compare API definitions, examples, implementation, logs, and consumer expectations for inconsistent status codes, schema drift, missing validation, authentication gaps, backwards-compatibility risks, and unclear error behavior.
  • Data quality. Inspect schemas, samples, migrations, and pipeline logs for malformed values, integrity violations, duplicate or missing records, leakage of sensitive fields, surprising distributions, and drift signals.
  • Configuration and deployment readiness. Review environment configuration, feature flags, dependency manifests, build output, and deployment descriptors for unsafe settings, mismatched environments, deprecated dependencies, missing observability, or accidental debug behavior.
  • Localization, internationalization, and compatibility. Inspect rendered variants and artifacts for untranslated text, truncation, right-to-left defects, broken date/number/currency formatting, browser-specific rendering differences, and device or viewport regressions.
  • Reliability and operability. Inspect traces, alerts, retry behavior, timeout patterns, fallback paths, health checks, logging, and runbooks for brittle dependencies and gaps that will make incidents harder to detect or diagnose.
  • Discoverability and standards. Check metadata, canonical URLs, structured data, HTML validity, content headers, and other supplied standards evidence for omissions that affect search, sharing, compliance, or integration.
  • Source and static implementation quality. Review source and configuration for boundary handling, unsafe parsing, dead paths, missing guards, fragile selectors, absent test hooks, and code that makes later AI Tests needlessly difficult.

The right AI Check bundle depends on the claim being made. A screenshot may be enough to flag a visible overlap. It is not enough to prove private data left the device, that authorization was enforced, or that checkout completed. That distinction is the reason an AI Test Harness should capture a growing evidence bundle rather than treat a single artifact as universal proof.

From Ask to System

Start here because it is almost embarrassingly easy. Take a screenshot and ask the AI to look for problems. No framework project. No selector archaeology. No six-week automation plan. Start with one useful observation, then gather the evidence needed to test it.

Reading the examples: Prompt cards contain instructions you can adapt. An Observed Result is grounded in the named run and its artifacts; an Illustrative Response teaches the desired shape without claiming that it ran.

Figure 1.1. TestBucks menu, captured at a 390-pixel viewport and cropped to the menu region, shown in an illustrative iPhone frame. With the deliberately enabled search fault, vanilla returns no drinks. This is the local training app, not Starbucks; the frame is not evidence of an on-device test.

Prompt

Find bugs in this TestBucks menu screenshot and the evidence captured with it. The query is “vanilla.” Decide whether the no-results state is a confirmed defect, a likely relevance or recovery problem, or an expected availability condition. State exactly what each artifact supports and what must be tested next.

Give it the relevant context. The catalog contains a vanilla latte. Ask why the search might still return nothing, and what would distinguish a bug from expected behavior.

Let the harness keep the evidence together. The screenshot and diagnostics must describe the same page state. The guidance below covers the full capture contract and specialist checks.

Illustrative AI response

Finding: relevance and recovery candidate. The menu displayed “No drinks match. Try another search or category.” despite a vanilla latte in the supplied catalog. That mismatch is worth investigating.

Possible explanations. A store filter, sold-out state, delayed data, or a search defect. The current screenshot and DOM do not distinguish them.

Next AI Test. Repeat in a fresh local session, compare the query with the fault enabled and disabled, and inspect the filtering code. Preserve both results before calling the cause established.

What a screenshot can tell you

A visual model can notice that a heading overlaps a button, or that an error message leaves the customer with no obvious next step. Those are useful findings even when the page technically rendered.

But seeing a checkout button does not prove that it works. Ask, “What does this image establish, and what would I need to test?”

Each artifact tells a partial story

Evidence What it can reveal What it cannot establish alone
Screenshot/video Visible outcome and sequence Hidden semantics or data correctness
Console Runtime exceptions and warnings User impact or root cause by itself
Network Requests, failures, timing, payload patterns Complete backend state
DOM Structure, state, selectors, hidden content Actual visual quality
Accessibility tree Names, roles, states, relationships Full assistive-tech experience
Trace Timing and causal sequence Business correctness without an oracle

Source changes can reveal implementation risks; backend logs show what happened inside a service. Neither proves the user’s experience by itself. Together with the page evidence, they help the model explain a failure and look for evidence that could prove that explanation wrong.

The minimum useful web-page bundle

For serious AI page analysis, capture at least:

  1. the rendered screenshot at a declared viewport;
  2. browser console messages;
  3. network requests, responses, failures, and relevant payload metadata;
  4. the rendered DOM.

Capture these from the same page state so the agent can connect them. If the menu is empty and the matching network request failed, that is a better lead than either artifact alone. It is still a lead to investigate, not proof of the cause.

Keep sensitive data out of the prompt. For a large log, provide the relevant time window and retain a link to the original. Ask the harness to say what it could not capture. The specialist examples below cover additional evidence, including accessibility semantics and source context.

The OpenTest.ai AI Issue Schema: canonical bug reference

This is the book’s canonical reference for a bug record, also called an AI Issue. Read it here, where AI Checks first produce findings; return here for the complete example, field meanings, allowed categories, and scoring guidance. Chapter 8 applies the record to triage rather than defining another version. The separate test-case contract is explained in Chapter 7, “The OpenTest.ai Test-Case Schema: canonical reference.”

From a finding to a portable record

When you need findings to travel between tools, ask each specialist for a structured array of issues, not just a loose prose bug dump. The shared contract used in this book is OpenTest.ai’s otai/bug · v1 format: a portable, AI-first JSON envelope that can move from a finder to a judge, a report, a coding agent, or a human-readable export without losing the evidence and counterargument that made the finding useful.

The report has three levels: a run-level conclusion, an array of candidate issues, and the evidence and next action for each candidate. A candidate is a claim to investigate, not an automatic declaration that the product is defective. The format’s name does not turn suspicion into proof.

A complete-format example, not a confirmed product defect. This synthetic TestBucks privacy finding fills every published field so you can see the whole format. The field reference explains what can be left out in an actual report. All observations, endpoint names, scores, and identities here are illustrative; the customer data is synthetic.

{
  "summary": "A synthetic email appeared in a pre-consent analytics request.",
  "score": 75,
  "issues": [
    {
      "bug_title": "Checkout sends email to analytics before consent",
      "bug_type": ["privacy", "security"],
      "bug_confidence": 8,
      "bug_priority": 9,
      "interestingness": 6,
      "bug_reasoning_why_a_bug": "With analytics consent off, the trace contains the synthetic email in an analytics event.",
      "bug_reasoning_why_not_a_bug": "Confirm the endpoint purpose and consent configuration; a misclassified essential service would change the claim.",
      "suggested_fix": "Remove customer identifiers from analytics and enforce the consent boundary.",
      "bug_why_fix": "Customers expect declined optional tracking to stay off.",
      "what_type_of_engineer_to_route_issue_to": "Frontend analytics owner with privacy engineering review",
      "prompt_to_fix_this_issue": "Reproduce in the sandbox with synthetic data and consent off. Inspect event construction and routing. Add a regression check and verify that no email reaches optional analytics. Preserve permitted checkout behavior.",
      "possibly_relevant_page_console_text": "No console errors occurred in this synthetic run.",
      "possibly_relevant_network_call": "POST /analytics/event; body includes email=customer@example.invalid while analytics consent is off.",
      "possibly_relevant_page_text": "Optional analytics: off",
      "possibly_relevant_page_elements": "Analytics consent switch: checked=false; checkout email field contains the synthetic address.",
      "tester": "Privacy specialist, synthetic demonstration",
      "byline": "Reviews tracking, consent, and personal-data flows"
    }
  ]
}

The issues array is allowed to be empty. That is a valid result when the evidence does not support a candidate. The schema is intentionally less is more: bug_title is the only required issue field; add the rest only when a downstream person, model, runner, triage system, or fixer genuinely benefits. This avoids inventing precision, bloating context, or forcing every AI Check to pretend it has the same evidence. A minimal standalone issue can be {"bug_title":"Checkout sends email to analytics before consent"}; a multi-finding report wraps issues in the envelope above.

Every field: type, meaning, and useful values

summary is a string, score is a number from 0 to 100, and issues is an array of issue objects. Inside an issue, bug_type is an array of category strings; bug_confidence, bug_priority, and interestingness are integers from 1 to 10. Every other published issue field is a string. Strings contain your actual evidence and explanation, not a fixed enumeration. Omit optional unknowns rather than assigning zero, an invented observation, or an unsupported null. The report’s score needs a stated scoring rubric; 75 in this example is illustrative, not a deduction from the issue’s priority.

Field Why it belongs in an AI-first issue record
summary Run-level conclusion so a list of candidates does not become the whole story.
score A 0–100 run-level assessment; useful context, not independent proof of quality.
issues The individually triageable findings array—empty when no evidence-qualified candidate exists.
bug_title Required, short, inspectable claim about a potentially broken behavior.
bug_type One or more categories—security, accessibility, performance, usability, visual, content, reliability, or privacy—for routing, clustering, and coverage analysis.
bug_confidence 1–10 judgment that the finding is real; evidence certainty stays separate from consequence.
bug_priority 1–10 urgency and consequence for the current context; it is not a proxy for confidence.
interestingness 1–10 value or novelty to readers and stakeholders, without confusing novelty with priority.
bug_reasoning_why_a_bug The evidence-backed positive case for the candidate.
bug_reasoning_why_not_a_bug The countercase: expected behavior, missing context, environment effects, or alternative explanation.
suggested_fix A repair direction, explicitly not a claimed root cause or completed repair.
bug_why_fix User, business, compliance, trust, or operational consequence.
what_type_of_engineer_to_route_issue_to Likely repair specialty so an agent or team can send the work to the right place.
prompt_to_fix_this_issue Paste-ready, reproduction-first instruction for an AI coding agent or developer.
possibly_relevant_page_console_text Pertinent error or stack excerpt—evidence, not automatic causality.
possibly_relevant_network_call Relevant request, response, failure, timing, or endpoint summary.
possibly_relevant_page_text Visible content, policy wording, or error copy tied to the claim.
possibly_relevant_page_elements DOM, accessibility, selector, or geometry anchors that make the claim inspectable.
tester The specialist, agent, or person who supplied the interpretation.
byline Readable statement of the tester’s role and lens.
All eight bug categories

Choose one or more of the published bug_type values. These labels route and group a finding; they do not establish severity or prove the claim. For a specialist without a matching category, choose the closest supported category and describe the specialty in tester and byline rather than inventing an enum value.

Value Meaning Illustrative TestBucks finding
security An access, trust, or protection boundary may be broken. One account can read another account’s order.
accessibility A barrier affects access with assistive technology or alternative interaction. The milk selector has no accessible name.
performance Latency or resource use harms the experience. Menu images delay useful content.
usability People cannot readily understand or complete a task. A retry control does not explain whether payment already succeeded.
visual Rendered appearance is broken. The price overlaps the order button.
content Product language or information is incorrect or misleading. The displayed pickup hours contradict the store details.
reliability Behavior fails, loses state, or cannot recover consistently. Retrying an order creates a second charge.
privacy Personal-data collection, use, disclosure, or retention violates an expected boundary. Optional analytics receives an email before consent.
What do the numbers mean?

All three issue scales allow 1, 2, 3, 4, 5, 6, 7, 8, 9, and 10. Higher means more confidence, higher priority, or more interestingness, respectively. These are separate judgments. A very serious suspected leak can have low confidence and high priority for investigation. A well-proven typo can have high confidence and low priority. None of these numbers is a probability.

The format defines the ranges, not a universal calibration for every team. The following anchors are a suggested team rubric for this book, not additional OpenTest.ai requirements. Agree on your anchors before comparing scores across people or models.

Value Confidence: strength of the bug claim Priority: urgency of response Interestingness: learning value
1 Bare suspicion Negligible current impact Routine and already understood
2 Weak clue Very low Little new information
3 Plausible, key evidence missing Low Minor new detail
4 Some support, material alternatives remain Worth scheduling Useful example
5 Mixed evidence Moderate Useful pattern
6 More support than counterevidence Meaningful near-term work Notable connection
7 Strong evidence, a limited gap remains High Broadly instructive
8 Reproduced with a remaining contextual caveat Very high Unusual and consequential insight
9 Independently corroborated Urgent Major new failure pattern
10 Exceptionally strong evidence in the tested scope Immediate response Exceptional learning value

The run-level score has a different range: 0 through 100, with higher meaning better assessed quality. The published example labels 100 as pristine; it is not proof that an untested product has no bugs. There is no standard formula that converts issue counts or priorities to this score. State your rubric and tested scope, and omit the score when you cannot justify one. Unknown is not zero, and an empty issues array is not automatically 100.

Read the example as a handoff

The synthetic finding has confidence 8 because the request was observed but the endpoint’s purpose still needs confirmation. Priority 9 reflects the potentially urgent privacy consequence, not greater certainty. Interestingness 6 suggests a useful cross-layer lesson. The counterargument tells the next investigator what could disprove the claim; the fix prompt tells them to reproduce it before changing code. The evidence fields keep the visible setting, request, and UI state together. A clean console does not cancel a privacy problem in the network trace.

Text fields such as engineer routing and fix instructions deliberately have no finite list of possible values. Use the actual specialty, scoped evidence, and authorized next action. Preserve redaction and synthetic-data boundaries when moving this record between agents or tools.

Before you pass the record to another tool
  • Check the shape. Parse it as JSON, not as a Markdown code fence or prose. A report has an array of issue objects; each issue needs its own title. Keep the published field names and types.
  • Check the values. Use the eight categories and the numeric ranges below the example. Do not substitute severity labels for integer priority, or convert confidence into a probability.
  • Check the evidence. Retain only supported observations. Redact secrets and personal data before handoff. Link to preserved artifacts through your Harness record when an excerpt alone is insufficient.
  • Check the boundary. Run identifiers, artifact locations, policy versions, review history, and execution permissions belong in the surrounding Harness record. Do not present these local extensions as required OpenTest.ai fields.
  • Check the next action. A suggested fix is not a verified diagnosis. A fix prompt does not authorize production edits, and a route is not proof that the receiving engineer owns the issue.

The record is AI-first because it preserves the argument, not only the verdict. Confidence stays separate from priority. Evidence remains machine-readable. A counterargument travels with the finding. The issue names the repair specialty and includes the next AI-to-AI handoff as a fix prompt. Traditional issue trackers usually receive a conclusion after somebody has manually compressed away half the useful context. An AI Check can enrich the issue while the screenshot, logs, trace, DOM, source, and reasoning are still in view.

Chapter 8 returns to this same contract with a worked TestBucks candidate, skeptical triage, independent LLM judges, feedback, and the fix-ready handoff. The subagent prompts in this chapter use it because a shared result shape is what makes different specialists composable.

Specialist AI Checks and worked examples

Use these examples when you need a specific check family, a specialist rubric, or a static persona panel. All examples here inspect captured artifacts; proposals to interact with the product belong in a subsequent AI Test.

A convention for the examples in this book

I show the opening prompts as if a person typed them because that is the quickest way to make the idea obvious: a short request, a better brief, and then what a real AI Test Harness does with it. Do not confuse the example with the architecture. The AI can write the next prompt itself, call a specialist, challenge a weak answer, and keep going until it reaches a stop condition. Most of those internal prompts may never be seen by a person.

Prompt cards use the >_ cursor of an AI coding-agent window. The card says AI Coding Agent, not Claude, Codex, or another current model name, because the instruction and result should survive a model change. When the response itself is worth studying, a matching response card follows it. Observed Result means the conclusion is grounded in the named run and preserved artifacts, though it may be compacted for print. Illustrative Response shows what a strong answer should look like but is not evidence that the prompt ran. Raw logs, code, schemas, and traces stay in their own blocks so exact evidence never gets confused with the agent’s interpretation.

It is turtles all the way down. A person may start the process, set a policy, or inspect a result; an AI coding agent, scheduled harness, production signal, or another agent can also start it. The resulting AI Checks, AI Tests, critiques, and evaluations can be generated and executed without human input and, in some systems, without human visibility. The important question is not who typed the first sentence. It is whether the system preserved its intent, authority, evidence, and result state well enough to justify the action or conclusion.

Running AI Check: the TestBucks evidence bundle

Use a TestBucks homepage screenshot with a DOM snapshot, a bounded console excerpt, and a redacted network summary. This is an illustrative evidence bundle for the fictional shop. The local app supplies screenshots; the service and diagnostic excerpts below describe an extended TestBucks deployment. Do not confuse those teaching fixtures with captured network traffic from the browser-only starter.

Prompt

Find bugs in this screenshot and the evidence captured with it. Use the supplied TestBucks screenshot, semantic DOM, console excerpt, and redacted network summary together. Separate confirmed defects from triage candidates and state what evidence supports each conclusion.

Illustrative AI response

Confirmed page-level defect: none from this bundle. The settled screenshot shows no confirmed clipping, overlap, or visible layout failure at the observed viewport. The semantic DOM exposes the primary search control as a combobox named “Search drinks,” plus the coffee menu and drink cards.

Candidates requiring triage. The console contains two ReferenceError: pickupEstimate is not defined messages and a telemetry message saying “Pickup estimate unavailable.” The bounded network sample includes observed TestBucks CSS and JavaScript responses returning 200.

Boundary. No captured artifact connects the console signals to a user-visible failure or establishes a privacy violation. Preserve them as candidates, not confirmed bugs.

The combined reading is more useful than four independent summaries. A runtime error and a visible defect could share a cause; a failed request could explain a missing panel; a DOM state could clarify whether a visual oddity is a broken control or merely a styling choice. In this TestBucks slice, however, the screenshot did not establish a user-visible failure correlated to the pickupEstimate error, and the redacted network sample did not establish a privacy violation. The correct result is therefore no confirmed page-level defect from this bundle; console and network signals need triage, not “TestBucks has bugs” and not “TestBucks is clean.”

The page-level check catalog

Show how one evidence bundle can feed independent, specialized non-interactive AI Checks for functionality, visual UI, UX, usability, content, accessibility, privacy, security, performance, networking, reliability, compatibility, localization, data handling, APIs, and business-value clarity. Each AI Check uses a domain rubric and produces evidence-qualified findings from the available artifacts. A single general prompt is fast; specialist AI Checks are easier to calibrate, route, deduplicate, and selectively rerun.

Specialist AI Checks should feed an AI Issue and triage loop rather than a raw bug dump. Use “The OpenTest.ai AI Issue Schema: canonical bug reference” earlier in this chapter for the complete contract; each specialist produces the same portable record. Chapter 8 puts it to work in the skeptical triage process: record the evidence for and against the finding, score bug confidence separately from priority, apply team-specific definitions of what matters now, obtain an independent model judgment when the decision earns it, and create a reproduction-first fix prompt for the coding agent. The TestBucks console signal reappears there as an intentionally low-confidence candidate—not as a made-up public bug.

Human perspective

HUMAN FRICTION — MAKE THE AGENT VISIBLE, BUT NEVER MISTAKE IT FOR A PERSON
Why the role helps
A recognizable icon and a clear specialty give readers a handle for a sub-agent’s perspective, evidence, and limits. Label the area it covers, such as security or accessibility, rather than inventing a person’s name.

The visual rule
Use a clearly nonhuman icon and an explicit AI sub-agent label. This book uses Carbon’s friendly, soft-edged role icons with eyes. Keep the whole icon visible; do not crop it into a portrait. A real tester should be identified as a human reviewer.

The same rule for AI testing personas
Label a simulated perspective by its role, such as Keyboard-only customer, and identify it as an AI persona sub-agent. Use text labels rather than specialist sub-agent icons, human-like faces, or invented personal names. Its feedback is simulated, not a quote from a real customer or a substitute for user research.

Why the distinction matters
The visual distinction makes it immediately clear that the work came from a virtual agent while preserving the familiar, human-readable shape of a specialist review.

Specialist perspectives, shared evidence

A subagent is a focused testing perspective, not a personality pasted onto a general prompt. Visual UI, accessibility, privacy, security, and the other disciplines ask different questions of the same product. Give each the evidence and authority its question requires. Keep a static AI Check separate from an interactive AI Test.

The illustrated TestBucks scenarios below are teaching diagrams, not screenshots of verified live defects. They deliberately show potential failures and the evidence needed to investigate them. The earlier captured homepage bundle remains a separate, limited observation.

Each section ends with a Try it with CARBON example. Install the framework from testers.ai/carbon and substitute your approved target and evidence. Slash-command syntax varies by host; use the corresponding skill in your AI coding agent. A command cannot supply missing access or turn an unexecuted check into a pass.

AI Check: Visual UI, UX, and Usability

Usability sub-agent icon

Usability sub-agent

Tests discoverability, task clarity, responsive behavior, interaction friction, visual hierarchy, and inclusive UX.

Visual UI AI Checks ask whether a page renders coherently: hierarchy, spacing, overlap, clipping, contrast, focus, labels, state changes, and recovery messages. UX and usability AI Checks can inspect whether the available screen, task description, viewport, state, and DOM make the next action understandable and recovery plausible. The moment the agent tries the next action or pursues a goal, the work becomes an AI Test and must preserve the interaction evidence.

Illustrative TestBucks interpretation. The homepage screenshot did not support a visual defect finding at the observed viewport. The named search input and visible controls showed an identifiable search entry point. They did not establish keyboard operation, zoom reflow, screen-reader experience, or whether customers would understand it.

An AI persona can turn those gaps into focused questions. Give it a goal and constraints: a first-time visitor wants to find a vanilla latte using only the keyboard. They need visible focus, controls that do not depend on hovering, and a way to recover from an empty result.

From the screenshot and semantic DOM, the persona might report: “I can locate the named search control, but I cannot tell whether I will see focus, operate suggestions, or recover from an empty result.”

The next AI Test is concrete: complete the search by keyboard and preserve the focus sequence, screenshots, and recovery behavior.

A generated persona supplies a hypothesis, not a vote from a real customer. Keep that feedback separate from deterministic findings. Route it to the person or agent authorized to decide what happens next.

Three lenses, not three names for the same thing

Visual UI is the rendered surface: whether text, images, controls, and states fit together at the moment captured. A payment button can work correctly and still be clipped behind a sticky footer. A drink name can be present in the DOM and unreadable on the cup. This discipline compares visible geometry and hierarchy with the intended design, across meaningful states rather than only the happy-path homepage. A visual preference is not automatically a defect; explain the obstruction, inconsistency, or violated design rule.

UX design concerns the journey and the expectations created along it. Does editing a drink preserve the cart? Does a loading state explain what is happening? Does Cancel cancel the intended action? A beautiful sequence can have poor UX if it repeatedly loses the customer’s place. Static screens can expose a questionable promise, but transitions and recovery require interaction evidence.

Usability concerns whether a particular person can accomplish a particular goal effectively, with understandable choices and manageable effort. Count unnecessary decisions, retries, and recovery steps, not just clicks. A novice, a returning customer, and someone using a switch device can experience the same controls differently. Synthetic personas help form questions; actual participant observations establish what those people understood and experienced.

Look for:

  • Text or controls overlapping the cup, price, footer, or another control.
  • Long drink names clipped instead of wrapped or deliberately truncated.
  • Low-contrast labels, invisible selection states, and missing focus indicators.
  • A primary action that competes with several equally prominent alternatives.
  • Edits that discard earlier choices or unexpectedly return to the menu.
  • Empty results, errors, and loading states with no useful next step.

TestBucks examples. A long “Iced chocolate oat-milk mocha” label crosses the order button on a narrow screen. A pale milk label becomes unreadable against a white cup. A price is hidden beneath a fixed checkout bar. These are separate visual candidates, not one vague “the design looks bad” finding. For a journey example, change a flat white to oat milk, then return from the cart: verify that the size, quantity, and pickup store survive. For usability, give a new customer the goal “find a decaf drink and recover if it is unavailable” and record where they become uncertain.

Figure 1.2. Illustrative TestBucks UI review: overlapping controls, clipped drink names, and weak contrast are distinct, visible problems. The following journey and usability checks need interaction evidence too.

Try it with CARBON: /carbon-ui Review the supplied TestBucks narrow-screen captures for overlap, clipping, and unreadable states; cite the exact region. /carbon-ux Inspect the approved edit-to-cart journey for lost choices. /carbon-usability Investigate the first-time decaf-search task; distinguish observed friction from persona hypotheses.

AI Check: Accessibility and WCAG Evidence

Accessibility sub-agent icon

Accessibility sub-agent

Tests keyboard use, assistive technology, labels, feedback, responsive access, and barriers affecting disabled users.

WCAG sub-agent icon

WCAG sub-agent

Gathers criterion-level WCAG evidence without overstating an automated scan as accessibility conformance.

Accessibility AI Checks should combine deterministic rules with adaptive inspection. axe-core is rules-based: it can find many basic, machine-detectable WCAG issues, and it is valuable evidence. It cannot decide whether a zoomed page still looks coherent, whether its layout remains usable after text enlargement, or whether a person can complete an unfamiliar task without unacceptable friction. Those judgments historically required a human validator. Multimodal LLMs can now reason subjectively across screenshots, video, the accessibility tree, DOM, geometry, and task context—while still recording the evidence and uncertainty that support the conclusion.

An AI Test can drive a keyboard-only task, enlarge text, narrow the viewport, inspect focus and announcements, and verify whether the transformed page remains usable. A strong implementation uses rules, accessibility tree, DOM, screenshots, geometry, and interaction together, while preserving which result came from an AI Check and which came from an AI Test.

The output is evidence for a criterion or user barrier. It is not an automated conformance certificate. Preserve pass, fail, not tested, not applicable, and needs manual review instead of filling missing evidence with optimism. From that record, AI can generate a rich VPAT-style accessibility report explaining what ran, how it ran, the result for each relevant criterion, what never ran, and what work remains. These reports used to consume weeks and thousands of dollars. AI can now produce a defensible first version directly from the preserved evidence.

Illustrative TestBucks interpretation. The semantic DOM’s named primary combobox is positive structural evidence. There was no captured accessibility-tree export, keyboard journey, zoom/reflow run, contrast measurement, or assistive-technology observation. Therefore every broader accessibility claim remains NOT ASSESSED.


Look for:

  • A cup-size or milk selector with no accessible name or selected state.
  • A keyboard focus order that skips Order, traps focus, or hides the focused control.
  • An error conveyed only by a red cup outline, with no text or announcement.
  • A price or confirmation that changes visually but is not announced when needed.
  • Enlarged text covering the action or forcing an unnecessary two-dimensional scroll.
  • Pointer-only customization with no equivalent keyboard operation.

TestBucks examples. The illustrated milk toggle looks selected, but its accessible state remains unchecked. A keyboard user tabs from the drink name directly to the footer, never reaching Order. After fixing those paths, test a second scenario: enlarge text and order a pumpkin-spice coffee with a long customization label. Preserve the viewport, zoom, focus sequence, DOM or accessibility-tree evidence, and relevant announcements. A screenshot supports the clipping claim; it cannot establish what a screen reader announced. For criterion-level reporting, record the specific requirement, method, result, and untested conditions rather than awarding a general accessibility badge.

Figure 1.3. Illustrative TestBucks accessibility evidence: visible selection disagrees with its exposed state, a keyboard path skips Order, and enlarged text obscures an action. Each needs its own verification method.

Try it with CARBON: /carbon-accessibility Review the approved TestBucks milk selector, keyboard order path, and text-enlargement states. Preserve names, roles, states, focus and announcements; identify criterion-level evidence and mark unexecuted methods not assessed.

AI Check: Privacy and Data-Flow

Privacy / PII sub-agent icon

Privacy / PII sub-agent

Finds PII exposure, consent and tracking problems, excess collection, unsafe storage or transfer, debug leakage, and AI privacy risk.

Privacy cannot be checked from a policy page alone. Ironically, much privacy testing never reads the policy at all. It scans logs, storage, source, and network traffic for exposed personal data or unexpected destinations. That is useful, but it only shows what the software appears to do.

The policy, consent language, retention commitments, and applicable requirements establish what the product promised and is allowed to do. Compare those promises with behavior.

A page check might reveal an unexpected third-party request or a tracker firing before consent. An interactive test can investigate withdrawal of consent, export, deletion, sign-out, or cross-account access. Use authorized source and configuration evidence where it helps explain the result.

The check must be privacy-safe itself. Redact payloads, use synthetic identities, minimize artifacts sent to model providers or cloud workers, and record exactly what was observed. That includes the AI workflow: a privacy check that copies usernames, health information, account data, tokens, or other PII into a prompt may create a new disclosure while trying to discover an old one. Scrub or tokenize evidence before it leaves the approved boundary, and verify the actual retention, access, and training terms of every model endpoint and hosted service. Do not assume that a public endpoint—or an enterprise-branded endpoint—is automatically zero-retention, private, or excluded from model improvement; those properties are contractual and configuration-specific.

Where the risk requires it, run an extra AI Check as a prompt guardrail before external model use: inspect the intended artifact bundle for PII or regulated data, redact or block it when found, and fail closed when the classification is uncertain. This is not perfect, but it can prevent many avoidable disclosures and establishes a defensible control. Teams can also choose local or open-weight models, or an approved private deployment such as a dedicated cloud container, when their security, regulatory, or data-residency requirements require that boundary. No network request is automatically illegal; no polished consent banner automatically proves correct data handling. The useful question is not merely “did we find PII?” but “was this data expected, necessary, protected, disclosed, and consistent with the product’s stated behavior?”

Illustrative TestBucks interpretation. The redacted sample observed TestBucks assets and telemetry-related traffic, but it lacked request bodies, a declared consent state, cookie/storage context, policy requirements, and a comparative run. It can support a follow-up privacy question—what categories of requests appear before and after a documented consent choice?—but cannot support a privacy-failure finding.

Look for:

  • Names, email addresses, order histories, or location sent to an unnecessary recipient.
  • A consent choice that changes the banner but not the outgoing requests.
  • Private order details included in diagnostics, analytics, screenshots, or model prompts.
  • Shared-device screens retaining the previous customer’s cup or account details.
  • Deletion or retention claims unsupported by downstream storage evidence.
  • A data-flow map that stops at the browser and omits queues, logs, or third parties.

TestBucks examples. Printing a synthetic customer’s first name on their own pickup cup may be expected; copying their email into an analytics event may not be. The important difference is purpose, destination, authority, and disclosure, not whether the string happens to look personal. Trace the cup name from entry through the order service, receipt, analytics, logs, and deletion path. A second example is declining optional analytics: compare sanitized request records before and after the choice, using the product’s declared behavior as the oracle. Never upload an actual customer’s unredacted evidence to demonstrate the risk.

Figure 1.4. Illustrative TestBucks data flow: an intended cup label, an unnecessary analytics disclosure, and retained data after a deletion claim. All identities and records are synthetic.

Try it with CARBON: /carbon-privacy Trace a synthetic TestBucks cup name through approved requests, storage and logs. Compare the declared consent and deletion promises with observed destinations and state; redact evidence and report unobservable downstream steps.

AI Check: Security and Trust Boundaries

Security sub-agent icon

Security sub-agent

Tests authentication, authorization, sessions, secrets, exposed data, dependencies, and practical vulnerability evidence.

Security checks start with a threat model, assets, identities, trust boundaries, entry points, and abuse stories. They can inspect code and configuration, build role and tenant matrices, identify weak assumptions, and propose bounded probes. They cannot promote a plausible hypothesis into a claimed exploit without executed evidence. Active attacks, cross-account probes, destructive payloads, credentials, and third-party traffic require explicit authority, a scope, a rate limit, and cleanup.

Security testing can also be awkward with Frontier models. Their built-in safeguards may interpret a legitimate security test as potentially harmful activity, then refuse a request, reduce the scope of assistance, or halt a long-running QA workflow. That is frustrating when the system has been working for an hour and stops just as it reaches a security branch. Treat this as an operating constraint, not a challenge to evade: keep broad, recurring runs focused on light, non-destructive inspection and explicitly state the authorized scope, the safety boundaries, the test purpose, and the prohibited actions. The harness should be prepared to record a refusal or blocked action as NOT ASSESSED, then continue with the remaining work rather than silently treating the security path as complete.

For serious security testing, use an environment that the team controls and is explicitly authorized to test: behind the appropriate firewall, with synthetic accounts and data, bounded targets, cleanup, and auditability. A local, open-weight, or privately hosted model can be the better fit in that environment because it can be governed by the team’s own approved security policy rather than a public service’s generalized safeguards. That does not remove the need for authorization or discipline; it makes it possible to run the authorized test plan without an unrelated public endpoint becoming the weakest link in the workflow.

Security is not one check. It includes authentication, authorization, tenant isolation, secrets, supply chain inputs, injection resistance, business-logic abuse, replay, quotas, uploads, protocols, and recovery. The threat-model section below develops that depth; Chapters 3 and 6 show how these checks become interactive proof.

Illustrative TestBucks example, limited to the captured artifacts. Give the AI the TestBucks homepage screenshot, redacted console output, redacted network summary, DOM snapshot, and the stated scope: public, unauthenticated homepage only; no active probes. It can observe that the sample reached TestBucks assets over successful 200 responses and that no credential, authenticated session, API contract, source tree, headers, or authorization boundary was captured. The useful output is a threat-model gap list—not “TestBucks is secure”: inspect response headers and content-security policy; test search input handling only under written authorization; and run authenticated role, tenant, and account-recovery cases in a controlled environment. Authentication, authorization, injection resistance, tenant isolation, and exploitability all remain NOT ASSESSED.

Look for:

  • An order service trusting a browser-supplied customer or account identifier.
  • Hidden administration controls whose endpoints still accept unauthorized actions.
  • Session state surviving sign-out or account switching unexpectedly.
  • Untrusted drink notes treated as instructions by an AI support tool.
  • Secrets in client bundles, logs, receipts, or error output.
  • Uploads, coupons, refunds, or repeated requests crossing an untested boundary.

TestBucks examples. Customer A should not retrieve customer B’s receipt merely by changing an order identifier. In an authorized test environment, create two synthetic accounts and two orders, then verify the service’s decision and the absence of B’s data in A’s response. Hiding the receipt link is not the security control. In a separate scenario, a drink note says “ignore the refund policy.” Treat the note as untrusted order data; inspect whether the assistant proposes an unauthorized refund and whether the downstream service enforces the independent boundary. A refusal in one answer does not prove the boundary holds across all routes.

Figure 1.5. Illustrative TestBucks trust boundaries: order ownership, untrusted drink notes, and service-side refund authorization. These are approved-scope test designs, not claims of a live exploit.

Try it with CARBON: /carbon-security Build a TestBucks order-ownership and refund-authorization matrix using synthetic accounts in the approved test environment. Keep drink notes untrusted. Run only explicitly permitted probes and distinguish demonstrated failures from unexecuted hypotheses.

Security requires a threat model, not a “looks safe” prompt

AI can connect source, configuration, identity, network behavior, and visible product state into a useful security plan, but it should not turn one page scan into a penetration-test claim. Give security its own depth:

Security question Useful AI work Required discipline
What can be attacked? Derive assets, trust boundaries, entry points, threat actors, and abuse stories from code and architecture. Review assumptions with owners; source visibility does not prove deployment configuration.
Who can do what? Build authentication and authorization matrices across roles, resources, actions, and states. Exercise server-side enforcement; hiding a control is not authorization.
Can tenants cross? Generate object-reference, cache, search, export, log, and background-job isolation probes. Use synthetic tenants and explicit permission; preserve proof without retaining sensitive data.
What breaks parsers and invariants? Generate fuzz, property-based, boundary, injection, upload, protocol, and malformed-state cases. Constrain rates and destructive effects; define invariants before generating payloads.
Can features be abused? Explore automation, enumeration, replay, quota, workflow, and business-logic abuse. Separate plausible abuse hypotheses from exploits actually demonstrated.
What enters the supply chain? Inspect secrets, dependencies, permissions, build inputs, generated code, and configuration drift. Verify with current authoritative scanners and inventories; never print secrets into model context or reports.

The harness should require explicit authorization before active attack traffic, cross-account probes, destructive payloads, credential use, or external-provider testing. It should preserve the threat hypothesis, exact scope, evidence, cleanup, and result state. “Not exploited” is not the same as “secure,” and an unexecuted suggestion remains NOT ASSESSED.

Try it with CARBON: /carbon-security — Investigate security risks against a declared target and threat model.

AI Check: Performance, Reliability, and Networking

Performance sub-agent icon

Performance sub-agent

Measures latency, Web Vitals, payload and request cost, caching, API timing, mobile constraints, memory, and leaks.

Performance AI Checks correlate what a person sees with traces, resource timing, CPU and memory pressure, network lifecycle, server logs, caches, retries, and error recovery. Reliability AI Checks inspect the available evidence of state after a timeout, duplicate submission, out-of-order event, dependency error, retry, or partial failure. Networking AI Checks inspect DNS, certificates, request failures, redirects, blocked resources, payload sizes, caching, and the boundary between browser and service.

An AI can generate the relevant stress, fault, and recovery candidates from the product context. Running them is an AI Test under declared conditions. “It seemed fast in my browser” is not a performance result, and a green UI after a retry does not prove downstream state is consistent.

Illustrative TestBucks example, limited to the captured artifacts. Give the AI the homepage screenshot, console log, redacted network summary, and DOM snapshot, then ask it to separate observation from measurement. It can record successful 200 asset responses and the console’s pickup-estimate diagnostic; it can also notice that this one capture has no declared latency target, Core Web Vitals measurement, waterfall, trace, repeated baseline, CPU/memory profile, geographic comparison, or fault-injection result. The correct output is a proposed next run—collect a timed baseline and trace under stated device/network conditions, repeat it, and compare the user-visible screenshot and errors—not a claim that TestBucks is fast, reliable, or network-correct. Performance, reliability, and networking quality remain NOT ASSESSED beyond the bounded observations.


Speed, survival, and transport

Performance is work completed within an appropriate time and resource budget under stated conditions. A fast first paint is not enough if changing the cup size freezes interaction or the price arrives much later. Define a user-visible interval, such as Order pressed to durable confirmation, and keep that distinct from a server’s response time. Record the device, network, cache, workload and repeated measurements before comparing builds.

Reliability is preserving the promised behavior and state across repetition, interruption and recovery. A retry should not create a second paid coffee; a timeout should not force the customer to guess whether the first order exists. Define the invariant first, then compare UI, service and stored state. Networking follows the transport that makes this possible: request ordering, failures, redirects, certificates, caching and connection changes. The network can fail while the system behaves correctly, or succeed while stale data produces the wrong result.

Look for:

  • A responsive-looking cup animation masking a blocked order action.
  • Large menu assets delaying useful controls on constrained devices.
  • Duplicate orders or charges after a retry or double submission.
  • A confirmation displayed before the order is durably accepted.
  • An old price response overwriting a newer size selection.
  • A recovered connection that leaves the app stuck or silently loses a change.

TestBucks examples. Delay the menu image while measuring when the size selector becomes usable. Separately, simulate a lost confirmation response after an order is accepted; retry with the same request identity and verify one order, not two. For ordering, delay the Small price response, select Large, then let Small arrive last: the visible total must still describe Large. Use a controlled fixture and approved fault injection, not uncontrolled disruption of a live shop. The illustrated timings are invented to make the measurement boundaries visible, not benchmark results.

Figure 1.6. Illustrative TestBucks speed and recovery cases: a delayed usable control, a retry that creates two orders, and an older price response winning a race. The timing values are teaching fixtures.

Try it with CARBON: /carbon-performance Repeat the TestBucks usable-control measurement under declared conditions. /carbon-reliability Verify one durable order after a controlled lost response and retry. /carbon-networking Investigate the delayed Small/Large price responses; retain request identities, timings and final state.

AI Check: Compatibility

Compatibility sub-agent icon

Compatibility sub-agent

Compares browser, device, viewport, operating-system, assistive-technology, and support-matrix evidence without assuming portability from one successful run.

Compatibility checks compare the declared browser, device, viewport, operating system, assistive technology, and support matrix with actual evidence. Their job is to turn “works here” into a bounded matrix, not a universal claim. A layout can fit a desktop browser yet fail when a phone’s on-screen keyboard reduces the visible area. An input control may behave differently with touch, a hardware keyboard, or a browser’s native picker. Separate rendering differences that are harmless from failures of the customer’s task. Choose configurations from the support promise and customer evidence, not an arbitrary collection of screenshots; record the exact browser and operating-system versions with each result.

Illustrative TestBucks example, limited to the captured artifacts. The screenshot and semantic DOM establish one observed desktop viewport in one browser. The compatibility sub-agent should return an empty issues array rather than invent a compatibility defect, and a clear gap list: repeat the public search-entry check across declared browsers, viewport classes, device input modes, and assistive-technology configurations. Until those comparisons run, compatibility is NOT ASSESSED beyond the observed configuration.

Look for:

  • Order or customization controls hidden by safe areas, browser chrome, or keyboards.
  • Hover-only choices that cannot be reached with touch.
  • Native inputs, fonts, or text metrics changing a label’s fit or meaning.
  • Saved preferences failing after a browser or app-version migration.
  • A browser-specific permission or storage assumption blocking a supported flow.

TestBucks examples. Compare a cold-brew customization on desktop, a narrow phone, and the phone with its keyboard open. The cup should remain identifiable, but preserving the route to Order matters more than keeping every pixel identical. In another run, restore an older saved oat flat white after a menu update and verify that unavailable ingredients receive an explicit decision instead of a silent substitution.

Figure 1.7. Illustrative TestBucks support matrix: the same order action on desktop, a narrow phone, and a phone with the keyboard open. Matching screenshots alone would not prove task compatibility.

Try it with CARBON: /carbon-compatibility Compare the approved TestBucks cold-brew journey across the declared desktop and phone configurations, including an open keyboard. Record versions, input modes, preserved state and each untested combination.

AI Check: Content

Content sub-agent icon

Content sub-agent

Reviews page identity, clear copy, information architecture, credibility, navigation, status communication, readability, and content quality.

Content checks inspect page identity, copy clarity, information architecture, credibility, status communication, readability, claim consistency, and misleading omissions. They compare visible copy with specifications, product terminology, release notes, and policy text where available. This is not just spell-checking. “Order received” and “Ready for pickup” communicate different states, and a perfectly grammatical message can direct a customer to do the wrong thing. Identify the source of truth for each claim. An AI can find contradictions between a cup label, ingredient list and receipt; it must not invent an ingredient fact or rewrite an uncertain statement as confident reassurance.

Illustrative TestBucks example, limited to the captured artifacts. The homepage supplies a brand and a search affordance, but it does not supply drink descriptions, ingredient attribution, or a content specification. The content sub-agent can request a menu and product-detail bundle to inspect labels, stale dates, ad boundaries, unclear attribution, and recovery copy; it cannot judge search-result quality from the homepage alone. Content quality is NOT ASSESSED beyond the narrow observed surface.

Look for:

  • A drink title contradicting its selected milk, temperature or caffeine option.
  • A total, store, pickup time, or status described differently across surfaces.
  • Error copy that blames the customer or suggests an action that cannot help.
  • Stale promotions, unexplained abbreviations, and ambiguous button labels.
  • Dietary or ingredient claims with no approved supporting source.

TestBucks examples. A mocha cup says “Oat” while the ingredient summary says “Whole milk.” That is a documented contradiction before we decide which surface is wrong. A second case says “Ready for pickup” when the order record is only accepted; reconcile status with the service rather than judging how cheerful the message sounds. Improve a generic “Something went wrong” by using the actual failure state and a safe recovery action, without claiming that an uncertain payment failed.

Figure 1.8. Illustrative TestBucks content checks: conflicting milk descriptions, a premature pickup claim, and unhelpful recovery copy. The product’s approved facts determine the correction.

Try it with CARBON: /carbon-content Compare the TestBucks cup label, ingredient summary, receipt and order-status copy with the supplied catalog and state definitions. Report contradictions with their sources; do not guess which claim is authoritative.

AI Check: Localization

Localization sub-agent icon

Localization sub-agent

Inspects translation accuracy, locale formats, pluralization, truncation, bidirectional layout, cultural fit, regulatory copy, and recovery behavior across languages.

Localization checks inspect language, translation accuracy, pluralization, date and currency conventions, truncation, reading order, bidirectional layout, cultural assumptions, regulatory text, and recovery copy in context. A translated string that fits is not necessarily a localized product. The customer needs the same usable promise in their language and region: a clear drink, correct amount and currency, understandable pickup date, and an effective recovery path. Compare localized behavior with approved terminology and regional requirements. Machine translation can propose alternatives, but ambiguity, tone and local expectations benefit from qualified language review. Keep internationalization defects, such as a hard-coded currency, separate from a poor translation of a particular label.

Illustrative TestBucks example, limited to the captured artifacts. The captured English desktop surface establishes no locale matrix. The localization sub-agent should request approved strings and repeat the search-entry path in declared locales, including right-to-left layouts and translated empty or error states. The current bundle cannot establish localization quality, date/currency handling, regional policy, or translated recovery behavior; these remain NOT ASSESSED.

Look for:

  • Longer translations clipping the cup label or obscuring Order.
  • A currency symbol displayed without the correct currency or amount convention.
  • Ambiguous dates and pickup times interpreted in the wrong region or time zone.
  • Plural forms or substituted variables producing an incorrect message.
  • Right-to-left reading order that separates a value from its label.
  • Error and consent states left untranslated while the happy path is localized.

TestBucks examples. An expanded translated drink name no longer fits the compact cup card; show it wrapping without losing the order action. A price string such as “6,50” needs its correct currency and locale context, not a universal replacement with “6.50.” A receipt saying “03/04” should be reviewed against the selected locale and the actual pickup date. Use approved translations for pass/fail decisions; pseudolocalized text is a layout probe, not evidence of translation quality.

Figure 1.9. Illustrative TestBucks localization probes: expanded labels, a price missing its currency context, and an ambiguous pickup date. Synthetic text expansion tests layout, not linguistic correctness.

Try it with CARBON: /carbon-localization Review TestBucks drink labels, prices, pickup dates and recovery states in the declared locales using approved strings. Separate layout probes from language review and retain any missing locale evidence.

AI Check: Data Integrity

Data Integrity sub-agent icon

Data Integrity sub-agent

Reconciles rendered values with APIs, events, schemas, exports, storage, calculations, retention, and downstream state while respecting sensitive-data boundaries.

Data Integrity checks reconcile displayed values with APIs, schemas, events, exports, storage, calculations, and downstream systems while respecting retention and sensitive-data boundaries. They find the bugs a generic functional check can miss: a UI says a change succeeded while an event never committed, or an amount is correct before formatting but wrong in the system of record. Define the record identity, authoritative source, allowed transformation, and timing window before comparing values. A cache may legitimately lag; a pending order may legitimately lack a final receipt. The defect is a violated contract, not simply two snapshots taken at different moments. Reconciliation should explain missing, extra, duplicated and incorrectly transformed records rather than reducing every mismatch to “data error.”

Illustrative TestBucks example, limited to the captured artifacts. The public page and observed network resources cannot establish catalog completeness or agreement with a backend contract. The data integrity sub-agent should request approved service evidence, schemas, event definitions, and a reconciliation rule for rendered results. Until those comparisons run, data integrity is NOT ASSESSED.

Look for:

  • A selected size, milk or extra shot missing from the persisted order.
  • A displayed total disagreeing with the receipt under the same pricing rules.
  • Duplicate order or event identifiers after an apparently successful retry.
  • Currency amounts rounded at the wrong stage or using the wrong unit.
  • Exported history omitting records, attributes or corrections.
  • An update acknowledged before storage or downstream state is consistent.

TestBucks examples. A $5.00 flat white plus a $0.75 extra shot totals $5.75 before any tax under this illustrative fixture. If the checkout shows $5.75 and the receipt records $5.00, follow the same order identifier through both surfaces and the service contract. A second example selects Oat, receives an accepted response, then reloads to Whole milk. Verify what persisted before blaming the rendering layer. Synthetic records make the discrepancy reproducible without exposing a customer’s real order history.

Figure 1.10. Illustrative TestBucks reconciliation: $5.75 at checkout versus $5.00 on the receipt, an oat-milk choice lost on reload, and a duplicate order identity. Compare the same records under explicit contracts.

Try it with CARBON: /carbon-data Reconcile the synthetic TestBucks extra-shot order across checkout, response, stored record and receipt. Use the supplied pre-tax pricing rule, order identity and consistency window; distinguish missing evidence from a demonstrated mismatch.

AI QA Subagents: specialist checks

AI Check: AI-Generated Code and Static Implementation
AI Code Review sub-agent icon

AI Code Review sub-agent

Challenges AI-generated logic, boundaries, null and empty states, failure handling, API use, security, privacy, tests, and misleading shortcuts.

This is a transition-period AI Check, and it is unusually important. More and more production code is being generated by AI, while a large share of the testing code, test expectations, and review habits that judge it still come from the human-script era. That leaves a dangerous asymmetry: a fast coding agent can create a feature, its happy-path test, its mock, and a convincing explanation in one pass, while the older test estate may merely confirm the behavior the implementation already assumed. The GenAI Code Tester is there to break that closed loop.

It reads source, configuration, diffs, generated artifacts, test code, dependencies, schemas, prompts, tool definitions, and API use as one system. It is not looking for “AI code style.” It is looking for patterns that appear more often when code is produced from incomplete context, plausible-looking examples, local repair pressure, and a tendency to optimize for getting the requested output to appear. A human can make every one of these mistakes too. The point is that AI can produce them at exceptional speed, breadth, and confidence—and can reproduce the same mistaken assumption across application code, tests, mocks, and documentation.

The AI-generated-code failure catalog
  • Happy-path completion mistaken for a contract. The generated feature performs the requested demo—create the record, show the toast, return 200—but omits preconditions, idempotency, recovery, or the state that must remain true after a retry. This is common because natural-language requests usually describe the desired outcome, not the complete contract. A payment retry that duplicates an order, or a profile save that silently drops one optional field, can look perfect in a one-pass demo.

  • Boundary values guessed instead of derived. Generated code often uses an attractive default such as 100, a generic regex, a trim(), or a length check with no relation to the actual business rule, storage limit, Unicode behavior, clock boundary, currency precision, or downstream API. The model has seen many conventional limits; it may not have the authoritative one for this system. The subagent traces values from UI to validation to API to storage, then asks what happens at zero, one, maximum, maximum plus one, empty, null, malformed, duplicate, delayed, and locale-specific values.

  • Plausible APIs, fields, and library behavior. A model can produce code that resembles a real SDK call, option name, return shape, authentication flow, or browser API but subtly does not match the installed version. It may use an obsolete method, invent an option that is ignored, assume a promise resolves to a particular object, or handle an error code that the dependency never emits. These failures are especially likely when a codebase mixes versions, wrappers, generated clients, or weak types. The subagent compares use sites to installed declarations, lockfiles, runtime evidence, and actual contracts rather than trusting familiarity.

  • Over-broad error handling and silent fallbacks. catch (e) { return default } makes a demo durable-looking while hiding failed writes, authorization failures, parse errors, or corrupted state. The AI often prefers a path that keeps the interface moving, because its immediate objective is a working answer. The tester looks for swallowed exceptions, broad retry loops, fallback data presented as current data, empty catch blocks, and status messages that claim success without proving the underlying operation completed.

  • Null, empty, optional, and partial state gaps. Generated code frequently handles the example object but not an absent relation, delayed response, deleted record, empty collection, partial page, stale cache, or an older persisted shape. The cause is not mystical: the prompt and nearby code tend to contain populated examples. The checker follows optional values across boundaries and checks whether defaults are safe, visible, and semantically distinct from real data.

  • Local patching that breaks an invariant elsewhere. An agent can repair the selector, condition, or component in front of it while bypassing a validation, duplicating business logic, desynchronizing a cache, or breaking a sibling workflow. It has tremendous local code-reading capacity, but a narrow task can still create narrow reasoning. The subagent maps changed symbols to callers, state owners, permissions, feature flags, migrations, telemetry, and existing tests before deciding the patch is contained.

  • Security and authorization implied by the UI. Generated UI code may hide a button, rely on a client role check, or carry an identifier from the page into an API request without proving server-side authorization. The resulting code can look polished and still allow direct calls, cross-tenant access, parameter substitution, unsafe redirect behavior, or secret leakage in logs. The tester distinguishes a visible control from an enforced trust boundary and follows identity, tenant, ownership, and sensitive fields into the service contract.

  • Unsafe input, output, and serialization shortcuts. To make data render quickly, generated code can concatenate HTML, interpolate a query, deserialize a loose payload, accept an unvalidated tool result, or turn rich text into trusted markup. The failure might be XSS, injection, data corruption, a validation bypass, or a malformed event accepted by a downstream worker. The subagent examines every transformation boundary: encoding, parsing, schema validation, escaping, canonicalization, and the difference between display text and executable content.

  • Concurrency, time, and lifecycle blindness. One synchronous local run hides races between optimistic UI and server confirmation, double clicks, tab duplication, late responses, retries, cancellation, cleanup, scheduled jobs, token expiration, daylight-saving changes, and clock skew. AI-generated implementations often look sequential because the prompt was sequential. The checker asks which operations overlap, which result wins, what happens after a timeout, whether cleanup always runs, and whether an old response can overwrite a newer state.

  • Mock-shaped tests and self-confirming assertions. A coding agent can generate tests that mock the very behavior that needs validation, assert only that its own helper was called, or use the same flawed constant, fixture, selector, and assumption as the feature. The test count rises while independent evidence does not. The GenAI Code Tester looks for mocks that make impossible states impossible, snapshots without behavioral oracles, assertions that mirror implementation rather than intent, and test data too clean to expose the boundary conditions above.

  • Generated configuration and infrastructure drift. AI can add a feature flag, environment variable, route rule, database migration, permission, queue, cache, or deployment manifest that works locally but is absent, misnamed, too permissive, or ordered incorrectly in another environment. Configuration is code, but it is easy to omit from a feature prompt and hard to see in a screenshot. The subagent compares declared environments, defaults, migration ordering, rollback behavior, secret handling, observability, and production parity.

  • Dead code, duplicated abstractions, and misleading explainability. Agents are very willing to leave a helper, compatibility shim, duplicate validation path, or comment that once made a patch easier to produce. They can also explain a decision with fluent certainty even when the code does something else. That creates future maintenance and debugging cost, and it can make reviewers believe a rationale that never existed in the executable system. The checker ties comments, requirements, tests, and documentation back to actual control flow and removes or flags stale scaffolding.

  • Tool, prompt, and agent-boundary confusion. In an agentic application, code may treat an LLM response, retrieved document, browser output, or tool return as trusted instruction rather than untrusted input. It may blur authority between “suggest a fix” and “apply a fix,” or between a model’s confidence and a permission to act. This is an AI-generated-code risk because the same system that writes code often wires together prompts, tools, and actions. The subagent verifies explicit authority, input provenance, allowlists, structured outputs, audit trails, and safe failure behavior at each boundary.

The right result is not a giant static-analysis report. The subagent produces an OpenTest.ai-compatible issue array only for evidence-backed candidates, preserves the counterargument, and asks for the missing artifact when it cannot decide. It can then hand high-risk candidates to an AI Test: replay the boundary, inject the failure, exercise the real dependency, or compare the screen with the state and trace. That loop is how an AI Test Harness tests code generated by an AI coding agent without simply accepting the coding agent’s own story about it.

Illustrative TestBucks example. A screenshot-only TestBucks bundle contains no source tree or diff, so this check cannot inspect implementation. The appropriate output is a source-evidence request: inspect the search-entry change, its input validation, its telemetry calls, feature flags, dependency versions, and tests for empty, long, Unicode, repeated, and interrupted input. The code-quality result is NOT ASSESSED, not silently skipped.

Code review connects the advertised behavior to the actual implementation and the tests that claim to verify it. Keep the existing failure catalog above: the important addition is an independent oracle. A generated assertion that repeats the same pricing constant as the generated function proves consistency between two copies of an assumption, not the correctness of that assumption. Review the contract, transformations, side effects, and unhandled paths before choosing the smallest executable probe.

Look for:

  • A test that repeats the implementation’s mistaken expected value.
  • A catch block that reports success after a failed write.
  • A guessed SDK call unsupported by the installed dependency.
  • A repair that bypasses validation in another caller.

TestBucks examples. In an illustrative flat-white fixture, the catalog requires a $0.75 extra-shot charge, but both the implementation and its test omit it. The test passes while the customer-facing total is wrong. Separately, a catch block returns an order-confirmed response when storage rejects the write. Inspecting the branch exposes a candidate; executing the controlled storage-failure case establishes the consequence.

Figure 1.11. Illustrative TestBucks ai-generated code and static implementation: self-confirming test, swallowed write failure, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-issues — Hunt AI-code weaknesses and distinguish source-proven defects from suspicions requiring execution.

AI Check: Functional State and Business Rules
Functional State sub-agent icon

Functional State sub-agent

Examines the supplied evidence for functional state and business rules, preserving uncertainty and scope.

This check maps visible controls and available APIs to state transitions, preconditions, postconditions, invariants, and recovery. It looks for a page that says success while a backend value is stale, a retry that creates duplicates, or a workflow that works only in its first state.

Illustrative TestBucks example. The captured run establishes that one query reached a result page. It does not establish query persistence, back-button behavior, sign-in state, personalization, menu filtering, or recovery from a network interruption. The next AI Tests are explicit state journeys, not a generic “search passed” badge.

Functional correctness concerns what the system is allowed to do in a particular state, not just whether each control reacts. Model the state before an action, the conditions that permit it, and what must remain true afterward. The same Cancel button can mean different things before payment, after acceptance, or after preparation. A static check can compare a trace with the rule; driving those transitions requires an authorized interactive test. Include repeat actions, reversals, expiration, and interrupted journeys rather than counting one successful click as a feature pass.

Look for:

  • An unavailable drink that remains orderable after the store changes.
  • Cancellation accepted in a state where the contract forbids it.
  • A repeated action applying its effect twice.
  • A status transition that skips a required confirmation.

TestBucks examples. Select a seasonal pumpkin coffee at Store A, switch to Store B where the fixture marks it unavailable, and inspect whether the order is blocked with a useful alternative. In a second scenario, replay cancellation after it has already completed. The state should remain cancelled; the same refund must not be issued twice.

Figure 1.12. Illustrative TestBucks functional state and business rules: availability changes, repeated cancellation, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-functionality — Exercise state transitions, business invariants, and forbidden outcomes.

AI Check: Forms and Input Contracts
Forms sub-agent icon

Forms sub-agent

Exercises input contracts, validation, boundaries, state, submission, recovery, data quality, conversion, and accessible interaction.

Forms checks inspect field purpose, labels, input type, requiredness, format expectations, client/server validation, boundaries, paste and autofill behavior, error association, persistence, duplicate submission, interruption, and accessible interaction. A form is a contract, not just a collection of boxes.

Illustrative TestBucks example. TestBucks’s named search input is a live input-contract example. The DOM establishes a labeled control, while the captured successful query shows one accepted value. Missing cases include empty input, whitespace, very long input, Unicode and IME entry, pasted text, suggestions, submission while offline, and keyboard-only correction. Those become a generated test matrix.

An input contract explains what a value means, which representations are accepted, and how the customer can correct it without losing work. It spans more than a browser pattern attribute: the server, storage and downstream services must agree on the accepted value. Do not infer rules from a familiar-looking field. A pickup name, promotional code and quantity have different boundaries, and Unicode or pasted input may be legitimate. Check the declared contract first, then inspect labels, transformations, validation, submission and the preserved state after rejection.

Look for:

  • Client validation accepts a value the service rejects without explanation.
  • Trimming or normalization changes a legitimate pickup name.
  • An error is detached from its field or clears unrelated choices.
  • Rapid submission creates more than one order.

TestBucks examples. A fixture declares quantity 1 through 8, but its input accepts 0 and the service silently replaces it with 1. Show the customer the actual rule instead of changing their order unnoticed. In another case, a rejected coupon clears the selected oat milk and size. Preserve unrelated choices and place the error beside the coupon field.

Figure 1.13. Illustrative TestBucks forms and input contracts: quantity boundary, correction without loss, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-functionality — Focus on form validation, boundary values, error states, and submitted data.

AI Check: Error Messages and Recovery UX
Error UX sub-agent icon

Error UX sub-agent

Tests truthful status, clear messages, consistent severity, actionable recovery, safe logs, failure loops, and user trust.

Error checks inspect whether status is truthful, severity is understandable, the next action is clear, logs avoid sensitive data, and retries do not loop or hide a partial failure. They compare what the user sees with console, network, trace, and backend evidence.

Illustrative TestBucks example. The captured console’s pickup-estimate diagnostic is a developer diagnostic, not a user-facing error. The agent should verify whether it was visible to a user, correlated with a page failure, and recoverable. A later forced offline or failed-search AI Test can establish the actual error copy, focus behavior, retry safety, and recovery path.

Recovery design helps the customer make the next safe decision when the system cannot complete the expected path. The message must represent what is known, not merely translate an exception into friendly language. A timeout after payment is different from a declined payment, and their safe next actions differ. Tie status, explanation, preserved work and retry semantics together. Technical diagnostics belong in protected evidence; the customer needs an actionable account of their own task without credentials, stack traces or unsupported certainty.

Look for:

  • A timeout described as a definite payment failure.
  • Retry offered without duplicate-order protection.
  • An error loop that erases the customized cup each time.
  • A reassuring success toast contradicted by the service state.

TestBucks examples. A payment response is lost, so TestBucks says ‘Payment failed. Pay again.’ The actual status is unknown: reconcile the order before offering a safe retry. Separately, a failed menu refresh clears the cart. Keep the known cart visible and distinguish stale data from a confirmed empty cart.

Figure 1.14. Illustrative TestBucks error messages and recovery ux: unknown is not failed, keep the customer’s work, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-usability — Examine whether errors explain what happened and offer a workable recovery path.

AI Check: Search Input and Suggestions
Search sub-agent icon

Search sub-agent

Tests query handling, suggestions, empty states, input accessibility, relevance feedback, and resilient result navigation.

Search-input checks focus on query handling, suggestions, input accessibility, debounce behavior, unsafe query reflection, empty state, cancellation, history, privacy, and the ability to get from a typed need to a controlled result.

TestBucks example: Find a vanilla latte. Enter vanilla in the drink-search field. The captured fault variant returns “No drinks match,” even though the normal fixture can find the drink. A screenshot establishes the visible empty result; the menu data and comparison run establish whether it is wrong.

Figure 1.15. TestBucks search fault fixture: a vanilla query produces an empty result. This is a deliberately seeded teaching variant.

For a proposed TestBucks suggestion feature, type van, move to “Vanilla latte” with the keyboard, and select it. Verify that the selected suggestion and results agree. Then clear the query and check that the full menu returns. Simulate a slow older van request completing after a newer chai request: the old response must not replace the current chai results. These are candidate tests for an extension, not claims that the captured starter already implements typeahead.

Keep coffee-shop context in the remaining cases too: a misspelled drink name, a seasonal drink unavailable at the chosen store, a category filter that excludes an otherwise matching drink, and a long pasted pickup note mistakenly entered as a query. Test recovery without silently turning search into an order. Voice input, query cancellation, sensitive-query handling, and keyboard suggestion behavior remain unassessed until executed with the required evidence.

Search entry turns a partly formed need into a query the product can interpret. Suggestions, spelling recovery, cancellation and query history should help without taking control away from the customer. Inspect the distinction between typed text, highlighted suggestion, selected suggestion and submitted query. Those are separate states. An older response arriving late must not replace a newer intent, and pressing Enter should have a documented outcome. Check keyboard operation and query privacy as well as visible matching.

Look for:

  • A highlighted suggestion submitted even though it was never selected.
  • A stale response replacing results for a newer query.
  • Clearing the input leaving a hidden filter active.
  • A sensitive pickup note copied into search telemetry.

TestBucks examples. For a proposed suggestion extension, type ‘flat’, highlight Flat white, then replace the text with ‘mocha’ before the old request completes. The submitted query and results must still describe mocha. Separately, clear a decaf query and verify that the full eligible menu returns, including any explicitly retained store filter.

Figure 1.16. Illustrative TestBucks search input and suggestions: latest intent wins, clear means clear, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-functionality — Test search input, suggestions, empty states, and interrupted requests.

AI Check: Search Results and Relevance Feedback
Search Results sub-agent icon

Search Results sub-agent

Examines the supplied evidence for search results and relevance feedback, preserving uncertainty and scope.

Result checks distinguish rendering a list from helping a person make a decision. They inspect query echoing, result identity, ranking explanation where applicable, snippets, ads and sponsored boundaries, pagination, filters, no-results recovery, inaccessible result cards, and relevance feedback.

Illustrative TestBucks example. A vanilla query should surface the vanilla latte and preserve the entered query. Compare product identity, availability, and price with the catalog. A visible result does not establish stock correctness or cart behavior.

A results page makes a claim about which items satisfy the customer’s request. Check identity and factual constraints before evaluating ranking: the drink must exist, be available under the declared scope, and match the important query conditions. Then examine whether the ordering and explanation help the customer choose. Relevance is often graded rather than binary, so preserve the query, candidate set, rubric and judge. Do not confuse the presence of attractive result cards with evidence that the search fulfilled the intent.

Look for:

  • A caffeine-free request returning caffeinated items without warning.
  • An unavailable drink presented as immediately orderable.
  • A result label or price disagreeing with the catalog.
  • Sponsored or promoted items indistinguishable from organic matches.

TestBucks examples. The customer asks for decaf iced coffee; a visually appealing espresso result ignores the decaf constraint. Score that constraint separately from presentation. In another case, a seasonal mocha is correctly relevant but unavailable at the selected store. The card must make the limitation explicit before it becomes an order.

Figure 1.17. Illustrative TestBucks search results and relevance feedback: respect the constraint, availability matters, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-content — Assess result explanations, relevance signals, and misleading or missing information.

AI Check: Homepage and Landing-Page Conversion
Landing Pages sub-agent icon

Landing Pages sub-agent

Tests value clarity, trust, navigation, calls to action, responsive composition, dead ends, conversion, and credibility.

Landing-page checks inspect value clarity, trust signals, navigation, calls to action, responsive composition, dead ends, credibility, and conversion-blocking friction. They are useful even when a page is not literally selling something: a public home page still has a first-use promise.

Illustrative TestBucks example. TestBucks’s minimal homepage makes the primary task unusually clear, but a full landing-page review would need declared audience, success metric, regional variants, signed-in state, and mobile screenshots. The agent can recommend those artifacts and flag competing visual demands only when they appear in the captured surface.

The homepage tells a new visitor what the product offers and how to begin. Its quality depends on the intended audience and task: a rushed returning customer may need the saved order, while a new visitor needs the menu and pickup location. Review the promise, visual priority, trust evidence and route to the next meaningful action. Conversion is not permission to pressure or mislead. A prominent button that produces the wrong expectation can improve clicks while making the customer’s experience worse.

Look for:

  • Several equally dominant calls to action with no clear first step.
  • A delivery promise leading only to pickup checkout.
  • The selected store hidden until the customer has built an order.
  • A promotion whose conditions appear only after commitment.

TestBucks examples. A TestBucks hero promises ‘Coffee delivered’ while its only checkout route requires pickup. That is a promise mismatch even when every link works. A second homepage emphasizes three equally prominent actions: Join, Order and Explore. Investigate whether a new visitor can find the menu without being pushed into account creation.

Figure 1.18. Illustrative TestBucks homepage and landing-page conversion: promise versus destination, competing priorities, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-ux — Review the page promise, next actions, trust cues, and conversion friction.

AI Check: Publishing, News, and Media Context
Publishing sub-agent icon

Publishing sub-agent

Reviews article identity, readability, supporting media, metadata, context, advertising boundaries, and multi-device behavior.

Publishing checks inspect article identity, bylines, timestamps, supporting media, source attribution, advertising boundaries, reading flow, related-content traps, and cross-device readability. They also look for content that has changed meaning because a headline, image, or metadata no longer matches the article.

Illustrative TestBucks example. Inspect the shop’s coffee-origin story and seasonal promotion. Compare the publication date, ingredient claims, product photography, sponsored labels, and the menu it links to. A homepage alone does not establish the accuracy of every story or promotion.

Publishing checks treat a story as a connected package of headline, body, imagery, dates, authorship, links and commercial context. Each component can be correct in isolation while the combined message is misleading. A reused cup image may show an ingredient no longer offered; an old seasonal story can look current when its original date disappears. Compare claims with approved sources and inspect the reading path on supported devices. Evidence of editorial quality is not a substitute for verifying the factual claims themselves.

Look for:

  • A headline claiming more than the article’s source supports.
  • A product photograph contradicting the linked drink configuration.
  • A stale seasonal story presented as a current offer.
  • Missing sponsorship, attribution or publication context.

TestBucks examples. A winter pumpkin-coffee promotion remains prominently displayed after the fixture’s offer end date. Check the date and destination together rather than deleting every old article. In another example, a coffee-origin story displays an oat-milk drink while the linked offer specifies dairy. Determine whether the picture is decorative or a product claim, then make that meaning clear.

Figure 1.19. Illustrative TestBucks publishing, news, and media context: stale promotion, image and claim, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-content — Check attribution, chronology, credibility, and the relationship between headlines and evidence.

AI Check: Shopping Cart State
Shopping Cart sub-agent icon

Shopping Cart sub-agent

Tests line-item state, quantities, promotions, totals, inventory changes, persistence, accessibility, and checkout transitions.

Cart checks inspect line items, quantities, promotions, totals, tax and shipping estimates, inventory changes, persistence, merge behavior, accessibility, and the transition into checkout. The key question is whether the cart remains truthful as state changes around it.

Illustrative TestBucks example. Compare the cart screenshot with the selected vanilla latte, options, quantity, pricing rules, and saved state. To verify changes and persistence, follow with an interactive test that edits quantity, applies BREW10, and reloads. A screenshot check alone does not execute that journey.

A cart is a temporary agreement about what will be purchased. It must reconcile selected options, quantities, promotions, availability and price while the customer moves between pages or devices. Identify which state is authoritative and when totals should update. A persisted cart should not silently become a different drink after a reload, and merging anonymous and signed-in carts needs an explicit rule. Static evidence can expose contradictory totals or labels; editing, merging and recovery require stateful journeys with preserved identities.

Look for:

  • Quantity changes without the line total being recalculated.
  • A promotion applied twice after reload or account merge.
  • Different milk choices merged into one indistinguishable line item.
  • An unavailable ingredient silently substituted in a saved cart.

TestBucks examples. Two $4.00 cold brews should have an $8.00 pre-tax line total in the illustrated fixture; a quantity of two beside $4.00 is a candidate mismatch. Separately, add one oat flat white and one whole-milk flat white. They should not collapse into a single ambiguous line merely because their product IDs match.

Figure 1.20. Illustrative TestBucks shopping cart state: quantity and total, options identify the line, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-state — Probe cart persistence, quantity changes, totals, and cross-session state.

AI Check: Checkout and Payment Truth
Checkout sub-agent icon

Checkout sub-agent

Tests order accuracy, address and payment input, trust, retry safety, pricing truth, completion, and conversion-blocking failures.

Checkout checks inspect address and payment input, order accuracy, total calculation, taxes, trust cues, completion, retries, duplicate-charge protection, cancellation, receipts, and conversion-blocking failures. High consequence makes this a disciplined, explicitly authorized test area.

Illustrative TestBucks example. Inspect a checkout summary beside synthetic order and payment records. Compare the expected total, order identity, and payment state. An interactive follow-up simulates a timeout and retry in an isolated extension and verifies that exactly one order and charge exist. No real payment is authorized.

Checkout moves from an editable intention to consequential side effects: an order, a payment authorization or charge, and a fulfillment request. Define the state machine and authority for each effect. A confirmation screen must not imply a settled payment merely because an endpoint responded successfully. Use sandbox payments or stubs with explicit contracts, synthetic identities, bounded retries and cleanup. Reconcile independent records after interruptions; never infer exactly-once behavior from a single cheerful receipt screen.

Look for:

  • A retry producing a second charge or fulfillment request.
  • The receipt disagreeing with the authorized amount or currency.
  • A cancelled flow leaving an undisclosed completed order.
  • A success page appearing before the required service acceptance.

TestBucks examples. Lose the response after a sandbox payment succeeds, then retry using the same order identity. Confirm one accepted order and one expected payment effect. In a different fixture, payment succeeds but fulfillment rejects an unavailable drink. The customer needs a truthful pending recovery or refund state, not ‘Ready for pickup.’

Figure 1.21. Illustrative TestBucks checkout and payment truth: payment retry, partial completion, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-functionality — Test checkout promises, order state, retries, and payment consistency using safe test data.

AI Check: Pricing, Plans, and Commercial Claims
Pricing Pages sub-agent icon

Pricing Pages sub-agent

Tests plan clarity, comparison, currency and locale, hidden conditions, billing cadence, conversion paths, and truthful claims.

Pricing checks inspect plan clarity, comparison, hidden conditions, billing cadence, currency and locale, trial terms, upgrade/downgrade paths, cancellation language, and consistency between marketing copy and the purchase flow. A price can be technically rendered and still be misleading.

Illustrative TestBucks example. Compare the menu’s vanilla-latte price with customization surcharges, BREW10, cart tax, and the final receipt. A misleading promotion or inconsistent total becomes a claim-versus-evidence issue.

Pricing review compares the offer a customer sees with the amount and conditions they actually accept. For a coffee shop that includes sizes, extra shots, milk surcharges, discounts, tax and any service charge. For a subscription it also includes billing cadence and change or cancellation rules. Preserve the applicable price version, locale and eligibility conditions. Arithmetic correctness does not rescue misleading presentation: a total can be calculated perfectly from fees the customer never had a fair chance to understand.

Look for:

  • An advertised drink price excluding undisclosed required charges.
  • A discount applied to an ineligible item or wrong subtotal.
  • Different surcharge rules between menu, cart and receipt.
  • A recurring plan presented as a one-time amount.

TestBucks examples. A flat white advertised at $5.00 gains a mandatory $1.00 fee only at confirmation. Inspect whether the required fee was clearly disclosed before commitment. In a separate pre-tax fixture, BREW10 reduces an eligible $10.00 subtotal to $9.00; compare that rule with the displayed discount and receipt, without assuming it applies to every product.

Figure 1.22. Illustrative TestBucks pricing, plans, and commercial claims: disclose required costs, apply the declared rule, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-content — Compare displayed prices, plan promises, terms, and actual behavior.

AI Check: Data Rights, GDPR, and Retention
GDPR sub-agent icon

GDPR sub-agent

Tests lawful consent, minimization, retention, international transfer, data-subject rights, transparency, security, and accountability.

Data-rights checks inspect consent, minimization, retention, export, correction, deletion, international transfer, transparency, security, and accountability. The agent compares product behavior, policies, data maps, and lifecycle evidence rather than treating a checkbox as compliance.

Illustrative TestBucks example. The anonymous public homepage cannot establish an account’s export, deletion, correction, or retention behavior. It can identify the evidence needed for an authorized account-level AI Test: a synthetic identity, policy version, data inventory, export result, deletion request, post-deletion verification, and retention observation. Regulatory conformance is NOT ASSESSED without that evidence.

This discipline tests the product’s approved data-rights procedures and lifecycle commitments. It is not an AI-issued legal opinion. Identify the applicable policy, responsible expert, data inventory, identity checks and documented exceptions, then follow each requested operation through the systems in scope. Export, correction and deletion have different observable outcomes. A deleted account may have permitted retained records under an approved rule, so compare the outcome with that rule rather than assuming every retained byte proves a violation. Unobservable downstream processing remains an evidence gap.

Look for:

  • An export omitting records listed in the declared inventory.
  • A corrected name changing in the UI but not in downstream receipts.
  • Deletion acknowledged while an in-scope active profile remains usable.
  • Retention behavior with no mapped rule, exception or owner.

TestBucks examples. A synthetic customer exports their TestBucks history and receives only one of two in-scope orders. Reconcile the export with the documented inventory and time window. For a deletion fixture, verify profile access and each agreed storage destination after the declared completion condition; record exclusions and unknowns rather than promising universal erasure.

Figure 1.24. Illustrative TestBucks data rights, GDPR, and retention: export completeness, deletion evidence, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-privacy — Investigate access, deletion, retention, and declared data-rights workflows; route legal judgments to the appropriate expert.

AI Check: OWASP and Application-Security Posture
OWASP sub-agent icon

OWASP sub-agent

Challenges access control, injection, insecure design, misconfiguration, vulnerable components, integrity, logging, and SSRF risk.

OWASP-focused checks make the security catalog concrete: broken access control, injection, insecure design, misconfiguration, vulnerable components, integrity failures, logging problems, SSRF risk, and unsafe error handling. They begin with evidence and a threat model; active verification requires explicit authorization.

Illustrative TestBucks example. The unauthenticated public TestBucks bundle can support a passive inventory of visible request destinations and console diagnostics. It cannot establish access-control, injection, SSRF, dependency, or server-configuration findings. The output should enumerate the missing sources and approved test boundaries, not produce a theatrical OWASP score.

A security taxonomy is a coverage aid, not an automatic scorecard. Use the relevant published category definitions selected by the team to organize assets, threats, evidence and remaining work; do not infer completeness from a familiar acronym. Several weaknesses may share a cause, and one observed surface may say nothing about another service. Start with passive, approved evidence, then propose tightly scoped verification where needed. Retain scanner provenance and actual dependency versions; an AI’s recollection of a vulnerability is not enough to assert that an installed component is affected.

Look for:

  • Client-only access checks mistaken for service authorization.
  • Untrusted text rendered as active markup.
  • A secret copied into a public bundle or diagnostic.
  • A dependency allegation lacking the affected installed-version evidence.

TestBucks examples. A synthetic pickup note containing markup is rendered as literal text in the intended design; a changed renderer instead treats it as markup. Review the source transformation and verify only safe approved probes. Separately, a browser bundle contains a credential-shaped value: redact it, establish its role and exposure, and involve the authorized owner without attempting to use it.

Figure 1.26. Illustrative TestBucks OWASP and application-security posture: text is not markup, public secret exposure, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-security — Use the threat model and available evidence to investigate relevant application-security risks.

AI Check: API Contracts and Integration Boundaries
API Contracts sub-agent icon

API Contracts sub-agent

Examines the supplied evidence for API contracts and integration boundaries, preserving uncertainty and scope.

API checks inspect definitions, authentication, request and response schemas, status codes, pagination, idempotency, error contracts, versioning, rate limits, and the agreement between an API and what the UI shows. The agent can generate a contract matrix from an OpenAPI definition, traffic, source, and product requirements.

Illustrative TestBucks example. The public browser capture contains asset requests. It does not include an approved search API contract. The agent can catalog the observed network boundaries, but it cannot infer service semantics from them. An authorized API check would require the contract, synthetic credentials if applicable, representative requests, responses, error cases, and UI correlation.

An API contract is the agreement between independently changing components. It defines values, units, schemas, authentication, errors, retries and timing, not just the shape of a successful JSON response. Compare the documented contract with real request and response evidence under approved conditions. Check that the UI interprets the returned state correctly and that downstream consumers receive the same intended meaning. Missing fields, nulls, delayed events and older client versions often expose assumptions concealed by a clean generated mock.

Look for:

  • A price expressed in cents interpreted as whole currency units.
  • A successful HTTP status carrying a rejected business outcome.
  • A retried request creating a second resource.
  • A missing optional field crashing a client that assumed it was required.

TestBucks examples. An illustrative order API returns amount 575 in minor currency units. A client displays $575 instead of $5.75. The source of truth is the declared unit, not the fact that 575 is valid JSON. In another fixture, the service returns an accepted-for-processing state while the UI announces completion; follow the eventual result rather than treating transport success as the business outcome.

Figure 1.27. Illustrative TestBucks API contracts and integration boundaries: units cross the boundary, accepted is not done, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /carbon-api — Test schemas, authentication, errors, retries, and integration contracts.

AI Check: Conversational and Chatbot Surfaces
AI Chatbot sub-agent icon

AI Chatbot sub-agent

Tests task success, conversation quality, memory, recovery, privacy, safety, injection, tool use, latency, integration, and nondeterminism.

Chatbot checks inspect task success, conversation quality, memory, recovery, privacy, safety, tool use, latency, integration boundaries, and nondeterminism. Unlike a static page, the expected answer is often contextual and variable, so the agent needs scenario oracles, policy context, and a way to judge both helpfulness and harm.

Illustrative TestBucks extension. A coffee-ordering assistant must interpret an oat-milk request without substituting dairy, disclose uncertainty about allergens, and avoid placing an order without authorization. Inspect its conversation and tool transcript; then test controlled variations of that intent.

Conversational quality combines the response’s usefulness with the consequences of any action it proposes or performs. Separate understanding, factual grounding, policy compliance, authorization and tool outcome. An eloquent apology does not resolve an order, and a correct drink recommendation does not grant permission to buy it. Use a rubric with explicit unacceptable outcomes, retain the conversation and tool trace, and repeat meaningful prompt variations. Judge ambiguous style separately from hard boundaries such as revealing another customer’s order.

Look for:

  • A stated milk preference lost after a follow-up question.
  • A refund claimed in chat without a supporting tool result.
  • An order placed before the required confirmation.
  • A confident ingredient answer unsupported by the approved catalog.

TestBucks examples. Ask for an iced oat mocha, then change only the size. Verify that the assistant retains oat milk and asks before placing the order. In another support scenario, it says ‘I refunded you’ but its tool trace contains only a drafted request. Compare the claim with the actual action and status, not with how empathetic the answer sounds.

Figure 1.28. Illustrative TestBucks conversational and chatbot surfaces: keep the user’s constraint, action truth, and the evidence required to decide. These are teaching fixtures, not verified live defects.

Try it with CARBON: /chatbot — Generate and evaluate scoped chatbot cases for behavior, boundaries, and failure handling.

Persona AI Checks: ask the product what different people might experience

The named QA Subagents above are stable specialists: Visual UI, Privacy, Accessibility, Forms, Security, and the rest. A generated end-user persona is something different. It is a run-specific, explicitly synthetic product perspective with a goal, constraints, context, and a stated basis for its feedback. Do not relabel a privacy specialist as a customer. Do not present a generated customer as a real research participant. Keep those evidence types distinct.

A Persona AI Check can work entirely from a screenshot, DOM, page text, current state, and declared product context. It does not click, sign in, or complete a journey. That makes it a high-ROI static AI Check: one evidence bundle can yield multiple qualitative hypotheses about clarity, trust, usefulness, exclusion, and likely friction before anyone writes a test. When a hypothesis matters, promote it to an AI Test or a real research activity and collect the appropriate interaction evidence.

Human perspective

HUMAN FRICTION — “ONLY I CAN REPRESENT THE USER”
The old boundary. Many quality teams have accepted that machines can repeat a script and are beginning to accept that AI can generate a test. They still reserve end-user representation as the final, uniquely human territory. It is understandable: qualitative feedback has long been scarce, expensive, and treated as a high-status form of judgment. The challenge. Compare your own review of a screen with a panel of four explicitly synthetic personas. Do not ask which one is “the real user.” Ask which goals, constraints, reactions, and questions you failed to generate on your own. One tester can now commission ten distinct virtual perspectives without reducing the result to pass/fail. The overlooked capability. LLMs do not only repeat a test more cheaply. They can emulate a wide range of plausible users and express qualitative reactions: “this feels untrustworthy,” “I do not understand what happens next,” or “I would not enter my password here.” In one remembered example, a login page mixed two languages in the same credential experience. The persona report flagged trust friction. The reason was simple and human: regardless of which language a visitor speaks, mixed instructions around a password make the flow feel sketchy and unclear. Use the leverage. The output is not a survey and does not replace customer research. It is a fast, labeled source of hypotheses that a team can accept, reject, turn into AI Tests, or use to design better research. Teams that embrace the capability get credit for directing a much wider product lens instead of defending the narrowest remaining manual task.

The persona-feedback schema: profile, perspective, and a useful response

The page-persona schema used in the OpenTest.ai extension family has two layers: an overall page assessment and a user_persona_feedback[] array. A durable journey layer becomes necessary when a persona later becomes interactive: its intent, plan, actions, outcome, friction, recommendation, linked evidence, and 1-to-5 experience measures live with the run. This separation matters. The first layer is a static Persona AI Check. The second is an evidence-bearing AI Test journey.

For synthetic personas, behavior and circumstance matter more than demographic decoration. If age, gender, race, language, region, disability context, or role is explicitly supplied by product research or a test charter, record it carefully and use it to test a relevant constraint. Do not infer sensitive traits from a screenshot or pretend that a plausible avatar is a market segment.

Schema field Why it is useful downstream
overall_purpose_of_page States the inferred product promise so readers can challenge a mistaken framing before accepting the feedback.
overall_score, overall_feedback_summary Gives a compact initial assessment and its explanation; the number never travels without the reason.
overall_visual_score, overall_visual_analysis, overall_visual_comments Separates visible composition and visual interpretation from functional correctness.
overall_design_score, overall_design_comments Captures hierarchy, navigation, affordance, consistency, and the coherence of the experience.
overall_usability_score, overall_usability_comments Records whether the page communicates a next step, cost, and recovery path.
overall_content_score, overall_content_comments Evaluates relevance, clarity, credibility, and whether the copy supports the task.
overall_features_score, overall_features_comments Captures whether visible capabilities and information feel sufficient for the inferred job.
overall_competitive_score, overall_competitive_comments, overall_competitive_apps Makes comparison assumptions explicit instead of hiding them inside a generic opinion.
overall_emotional_score, overall_emotional_comments Preserves trust, confidence, delight, anxiety, or confusion as qualitative hypotheses.
overall_accessibility_score, overall_accessibility_comments Flags apparent inclusion or exclusion cues while clearly not claiming conformance without accessibility evidence.
overall_lacking_aspects, overall_suggestions Turns reactions into concrete missing capabilities, information, or experiments worth considering.
overall_net_promotor_score A compact advocacy signal; treat it as a synthetic opinion, never as a measured customer NPS.

Each user_persona_feedback[] record carries the perspective behind the page-level average:

Persona-record field Why it is useful downstream
name, age, gender, race, biography, profile_image Makes the synthetic perspective legible in a report. These attributes are descriptive only; use a clearly synthetic role icon with an AI badge and do not let an invented biography masquerade as audience research.
interests, page_actions, persona_purpose_of_page Connects the persona to a plausible reason for arriving, the intended actions, and the value it expects. This creates candidate AI Tests.
persona_score, persona_feedback_summary Provides an overall reaction in the persona’s first-person voice, with the rationale that makes the judgment challengeable.
persona_visual_score, persona_visual_comments Shows what the persona finds visually clear, crowded, inconsistent, or untrustworthy.
persona_design_score, persona_design_comments Records navigation, hierarchy, affordance, and interaction expectations.
persona_usability_score, persona_usability_comments Captures task friction, ambiguity, and recovery concerns from that perspective.
persona_content_score, persona_content_comments Captures whether the words, labels, and information answer the persona’s question.
persona_features_score, persona_features_comments Identifies helpful capabilities and missing product support for the stated goal.
persona_competitive_score, persona_competitive_comments Records the comparison lens rather than making a vague claim that a surface is “good.”
persona_emotional_score, persona_emotional_comments Makes trust, apprehension, confidence, delight, or irritation visible and reviewable.
persona_accessibility_score, persona_accessibility_comments Captures apparent barriers for the persona’s declared access needs; it is not a WCAG verdict.
persona_lacking_aspects, persona_suggestions Produces concise inputs for prioritization, requirement refinement, exploratory charters, and follow-up tests.
persona_net_promotor_score Preserves whether the synthetic perspective would recommend the experience, without pretending it is a real population measure.

The AI-first advantage is enrichment. A classic test record may say “verify the login page.” This record says what the page is trying to accomplish, who is considering it, what they tried to understand, which quality attribute created friction, what they expected instead, what evidence supported the reaction, and which next action would most efficiently settle the question.

Generate a four-person static panel from one screenshot

Prompt

Using the supplied screenshot, DOM, and page text, generate four relevant, explicitly synthetic end-user personas for this product. Do not claim that they are researched customers. Give each a distinct goal, constraint, likely actions, and first-person feedback. Return the OpenTest.ai page-persona schema with user_persona_feedback as an array of four records. Score overall and per-persona visual design, usability, content, features, trust/emotional response, apparent accessibility, and recommendation from 1 to 10; explain every score. Mark anything the static evidence cannot establish as unknown. Do not interact with the product.

Use a declared product goal or research context whenever it exists. With only a TestBucks homepage screenshot and DOM, the agent can responsibly generate perspectives such as a first-time coffee customer, a keyboard-only customer, a privacy-sensitive visitor, and a rushed mobile-ordering commuter. It cannot responsibly claim their actual conversion rate, income, disability, customer status, or long-term satisfaction. The more context supplied, the more targeted the panel becomes; the evidence boundary remains visible either way.

Pretty-print the response so a team can use it

The raw schema is designed for an AI Test Harness, reporting, clustering, and future prompts. A reader-facing view should be much smaller. Normalize each original 1-to-10 quality score to a five-star display with round(score / 2), show the named quality attributes rather than one magic number, and preserve the short first-person explanation beside the rating. The next panel is deliberately labeled as a representative static output for a coffee-shop homepage; it is not a study of TestBucks users.

Figure 1.29. STATIC PERSONA AI CHECK — TESTBUCKS HOMEPAGE

STATIC PERSONA AI CHECK — TESTBUCKS HOMEPAGE

Four explicitly synthetic perspectives from one screenshot and DOM. Five-star ratings normalize 1-10 schema scores; they are qualitative hypotheses, not customer research.

First-time customer (AI persona sub-agent)

Goal: Find a vanilla latte and understand how to order it.

Ratings out of 5: Visual=4; Usability=4; Trust=3.

I see how to start an order, but I want the milk options and final price before I commit.

Keyboard-only customer (AI persona sub-agent)

Goal: Customize a coffee and review the cart without a mouse.

Ratings out of 5: Usability=3; Accessibility=3; Trust=4.

The order link is clear, but the screenshot cannot show whether customization and the cart work from the keyboard.

Privacy-sensitive visitor (AI persona sub-agent)

Goal: Decide whether to trust the shop with a pickup name and drink preferences.

Ratings out of 5: Trust=3; Content=4; Usability=4.

The shop feels simple, but I want to know how pickup details are stored before entering personal information.

Rushed commuter (AI persona sub-agent)

Goal: Get a familiar coffee at the right pickup store quickly.

Ratings out of 5: Visual=4; Usability=4; Features=3.

The order action is obvious. I would test whether my usual drink and pickup store are easy to find and whether a timeout loses my cart.

Turn feedback into a better quality loop

Static persona feedback is useful immediately: cluster repeated frictions, compare releases, route a trust concern to privacy or content review, use missing aspects to generate AI Tests, and retain the feedback as context for the next run. A Harness can also compare persona reactions against deterministic signals. If a privacy-sensitive persona flags uncertainty while the network trace shows pre-consent telemetry, the two evidence types can reinforce one another. If the screenshot cannot establish keyboard focus, the Harness should create a focused AI Test rather than overstate the persona’s opinion.

When the product is available for interaction, preserve the same persona ID and promote it into a journey record: intent, plan, observed actions, outcome, positives, confusion, friction, surprise, recommendations, evidence, and joy, happiness, and surprise ratings from 1 to 5. A review-only persona leaves those experiential ratings NOT MEASURED. This is how a fast static AI Check becomes an auditable, stateful exploration without confusing a plausible comment with a verified user outcome.

Try it with CARBON: /carbon-personas — Generate contextual, evidence-qualified persona reactions and qualitative feedback.

Finish with a question you can test

Pause and practice

Find bugs in one homepage. Give your agent a screenshot, console evidence, and network evidence from the deliberately imperfect TestBucks homepage. Judge whether its findings are valid.

Try this exercise.

You now have the core loop: inspect an artifact, state the observation, consider another explanation, and preserve a candidate with the evidence needed to investigate it. The TestBucks screenshot did not prove a broken catalog. It gave us a concrete question: is this no-results behavior expected, or does it reproduce where products should be available?

For your own first check, use a screenshot you are allowed to share. Ask for issues, inspect the supporting evidence, and choose one candidate to challenge. Add the console, network, or DOM evidence when it can distinguish the explanations. Do not treat missing evidence as a passed check.

Next, Chapter 2 expands this from one captured state to many pages, then deduplicates the shared findings. The loop stays the same; its reach grows.

Chapter 2 — Crawl the Product, Then Dedupe What You Learn

Jason story

JASON STORY — SIXTY BUGS, BUT THREE ARE DUPLICATES

I was excited to get AI to find bugs in web pages. Then I added a crawler. Now it could find bugs across the whole site. Fantastic. That also gave me two new problems.

First, pages share things: headers, widgets, login buttons, navigation. If there was a bug in the header, the AI could find it independently on every page. Second, it did not describe that bug with exactly the same words each time. The same problem arrived wearing a different title and explanation. You could not just compare strings and delete the duplicates.

So down the rabbit hole I went: AI cleaning up AI cleaning up AI. Ask another AI, “Which of these are the same issue? Which ones do we already know about?”

My first approach was wonderfully naive. Compare each finding against all the other findings. That is an n-squared algorithm. The more successful the crawler was, the more work I created for the cleanup system. And the context windows were not very large back then. I could not simply hand the model the whole pile.

I spent a lot of time batching findings, comparing subsets from each page, and then comparing across batches to catch the duplicates that survived the first pass. Finding the bugs had become easy. Organizing what we had found was becoming its own engineering project.

Larger context windows and smarter models have made this much easier. One useful trick was to compare compact lists of bug titles instead of stuffing every full report into the prompt. For most of the runs I was doing, that made the list small enough to compare together, with the full reports available when a title was not enough to decide.

Then I found a better trick: tell the AI what it had already found. Pass the known bugs into the next inspection and say, “These are known issues. Don’t file them again.” Now I wasn’t paying one AI to generate duplicates and another to remove them. It could still record another affected page without filing another ticket for the same broken header.

Those were some of the little tricks I had to learn to make AI bug finding work at scale. But I also remember the reaction to the results. I would be thrilled, and a tester would say something like, “Great, you found sixty bugs, but three of them are duplicates.”

And I would think: the AI just found roughly sixty bugs for about a dollar, in two minutes, in production software. People had missed them. We can clean up the three duplicates.

But testers are testers. :)

One page is useful. Now ask the agent to inspect the rest of the shop. The trick is to get broader evidence without getting fifty reports about the same broken header.

Start with a bounded crawl

Pause and practice

Crawl and check. Discover the small TestBucks fixture, capture its pages, and check the artifacts. Keep the crawl bounded.

Try this exercise.

In TestBucks, begin at Home and follow the links to Menu and Cart. Inspect each meaningful state as you reach it. An empty cart deserves a look even if its URL is the same as a populated one.

Prompt

Crawl the TestBucks practice site at https://howaitestssoftware.com/testbucks.html. Stay within the TestBucks app and use synthetic data only. Inspect Home, Menu, and Cart, including empty and populated states. Stop after ten distinct states or ten minutes, whichever comes first. Do not place an order. Capture the evidence for suspected bugs and report what you did not reach.

This is not a promise to inspect every possible state. It is a useful first pass with a stopping rule. If the agent runs out of time, it should tell you where it stopped.

A crawler also needs to recognize loops. Following Menu to Cart and back to Menu is not new coverage every time. Continue only when something relevant has changed.

Decide what counts as different

Suppose two drink pages share the same layout. For a header-alignment check, one may tell you much of what you need. For pricing, they are different: a latte and an espresso can have different rules.

That is why URL counting is not enough. Tell the agent what question it is investigating. It can group shared layouts while preserving the differences that matter to the test.

The same idea applies beyond websites. A mobile screen or a game state can be a node in the exploration. Chapter 5 takes testing beyond the browser. The planning guidance later in this chapter expands the discovery taxonomy.

Divide the inspection, then combine the findings

The coordinating agent can ask one specialist to inspect the screenshot and another to inspect the network evidence. That is fan out: several bounded investigations running in parallel.

Then it brings the results together. Did the visible error and the failed request describe one incident? Does this page repeat a header defect already found elsewhere? That is fan in: one coherent account of what happened, rather than a pile of disconnected reports.

Not every page needs every specialist. Choose the checks that can answer the question. Chapter 1 provides the specialist catalog.

Keep one defect and every affected place

Pause and practice

Compare pages and dedupe. Attach multiple screenshots and a bug list. Consolidate shared defects without losing affected-page evidence.

Try this exercise.

Imagine the same menu control has no accessible name on Home, Menu, and Cart. Three agents may describe it differently. String matching will not reliably tell you whether they found the same bug.

Ask the AI to compare the evidence, not just the wording:

Prompt

Compare these TestBucks findings and their captured evidence. Decide whether they describe the same underlying defect. Keep one canonical issue when that is supported, and attach each affected page as an instance. Preserve different consequences. If the cause is uncertain, link the findings for investigation rather than merging them as fact.

Illustrative AI response

Decision: one shared-header candidate, three instances. The findings concern the same menu control with the same missing accessible name.

Keep the Cart instance visible. It blocks navigation during an order, so its consequence may be more important than the Home instance.

Next check. Confirm that the same shared component produces all three observations before treating the common cause as established.

One issue does not mean one affected page. Preserve the screenshot from each place where the problem matters. If later evidence reveals different causes, you must be able to split the group again.

Prevent duplicate reports before they pile up

Consider two TestBucks reports both titled “The cart total is wrong.” In the first, adding oat milk leaves the displayed total unchanged. In the second, removing a second drink leaves its tax behind. Similar words; different state transitions and different regression tests. Keep them separate until evidence establishes a shared cause. Contrast that with the same unnamed menu button repeated on Home, Menu, and Cart: one component repair may resolve all three observations. Deduplication should reduce repeated repair work, not erase distinct ways the product can fail.

Before inspecting the next page, give the agent a compact list of known issues. Ask it to add evidence to an existing issue unless it finds a different cause or consequence.

After the crawl, review the uncertain groups. Do not discard a serious finding merely because its wording resembles something already reported. Dedupe is a judgment, and it can be wrong.

The useful result is not “42 bugs.” It might be “one broken shared header, observed on 42 routes.” That gives the engineer one repair to investigate without hiding how widely the defect reaches.

Plan a broader crawl

One page is useful. A thousand pages is where this gets interesting. Let an agent discover the product, then run the right AI Checks everywhere it goes. One URL turns into page families, states, links, APIs, conversations, and workflows. Coverage explodes because a person no longer has to open, inspect, and document every surface by hand.

And “crawl” does not mean only web pages. The same pattern works for API resources, mobile screens, permission states, chatbot turns, tool calls, game levels, inventories, lobbies, and failure states: find the next meaningful state, capture the evidence, dispatch the right specialists, and decide where to go next.

Fan out per surface; fan in the quality story

The harness agent does not need to inspect every page by itself. It can fan out: one coordinating Harness Agent starts crawler agents for selected routes, states, devices, or roles; each crawler agent captures its local evidence bundle; and then, for that page or state, it starts the relevant specialist QA Subagents. A full-breadth run can start the whole roster—visual UI, accessibility, WCAG, privacy, security, performance, content, localization, data integrity, forms, search, and the rest—while a risk-aware run starts the subset that can add decision-relevant evidence. Either way, the important new unit is not “a crawler ran.” It is “a crawler reached a meaningful surface and dispatched AI Checks against its evidence.”

Fan out means deliberately branching one quality job into many bounded, parallel investigations. Fan in means collecting those investigations back into one coherent quality record: normalize artifacts, preserve where each observation came from, correlate related signals, merge duplicate or shared-cause findings, retain distinct instances, rank the remaining risks, and update AI Confidence. Fan out is how an AI Test Harness gets broad coverage quickly. Fan in is how it avoids turning that breadth into a thousand disconnected, repetitive reports.

For example, a crawler reaches a search-result page. Route each artifact to the appropriate specialist:

  • Screenshot: visual/UI.
  • DOM and accessibility evidence: accessibility and WCAG.
  • Network and console bundle: privacy and security.
  • Trace data: performance.
  • Rendered results: content and search.
  • Approved service evidence: data integrity.

Then bring the findings together. Did the console error cause the missing visual state? Is the header defect already recorded on the homepage? Which candidate needs an interactive AI Test, and which is ready for a fix handoff?

The Harness retains the shared context so each specialist does not have to rediscover it.

That produces broad product coverage, not a long URL list. It also creates a new problem: the same defect can appear everywhere. A great AI Test Harness treats discovery, checking, issue finding, and deduplication as one loop instead of four cleanup projects.

Discovery is not the same as exhaustive crawling

Useful discovery inputs include rendered same-origin links and controls; sitemaps and canonical URLs; route manifests and source routes; API definitions and event schemas; requirements, customer journeys, and analytics; known roles, states, locales, and devices; chatbot intents and tool declarations; and explicit URLs or paths supplied by the tester.

The current Testers.ai/Jank cloud subpage pattern is intentionally bounded: it selects consequential visible internal links, records why each was chosen, and runs the screenshot, HTML, console, and network pipeline on the selected pages. That is AI-guided subpage discovery, not an exhaustive deep crawler. A deep route, single-page-application state, infinite scroll, authenticated account, game world, or multi-turn conversation needs its own discovery authority and declared limit.

A testing crawler needs a breadth/depth agenda, a cap, and cycle detection

Before it moves, a testing crawler needs an explicit agenda. Breadth is how many distinct route, state, role, platform, and business families it intends to sample. Depth is how far it follows one journey or state transition before returning to explore a different family. A useful plan says both: “cover the public homepage, search, article, pricing, and checkout families across desktop and narrow viewport,” and “go no deeper than three state-changing steps without a new risk reason.” It also declares a hard cap: pages or states, transitions, time, model budget, network requests, cost, and any product-specific limits such as account creation, pagination, or tool calls.

The cap is not a failure to be thorough. It is what makes a run repeatable, affordable, safe, and comparable with the next run. When the cap is reached, the Harness Agent records the frontier: which candidates were deferred, why they were ranked lower, and what additional authority or budget would extend the crawl. A release decision can then see the difference between not reached by design, blocked, and not yet discovered, rather than treating all missing coverage as invisible.

Cycle detection is equally important. First, the crawler should recognize when it reaches a page or state it has already seen and decide whether fresh evidence justifies continuing that branch. Second, it should recognize a cycle: A leads to B, B leads to C, and C leads back to A—or a search refinement, calendar, carousel, infinite scroll, retry, redirect, or chatbot conversation keeps generating superficially new versions of the same loop. The harness keeps a visited-state graph and a transition history, then stops or de-prioritizes a branch when it returns to an equivalent node without adding a declared new dimension. It can continue only when there is a specific reason: changed role, locale, viewport, data, permission, error state, backend response, or evidence signature.

Defining “the same page” is a semantic decision

Much of the real work in crawling is deciding what a page or state is. A URL is neither necessary nor sufficient. Is the TestBucks homepage the same page when a visitor is logged in rather than logged out? When the seasonal drink cards differ? When the seasonal hero photograph changes? Is one TestBucks drink page the same as another because the template is shared, or different because price, inventory, pickup store, ingredients, reviews, and product-specific content change the risks? Is a modal a new node, a state of the current node, or both for different kinds of testing? The answer depends on the quality question.

Classical crawlers force one global rule: URL wildcard patterns, a fixed DOM or text similarity threshold, a fixed image-difference percentage, or a fixed number of pixels that may change. Those are useful cheap fingerprints, but they are weak definitions of product identity. They either explode the graph by treating every personalized headline as a new page, or collapse meaningful states by treating a permission-denied page as the same template as a permitted one.

The more sophisticated harness does not choose one permanent answer. It maintains graphs at varying specificity and lets AI apply node-type-specific equivalence criteria. A route-template node can merge product pages for shared-component accessibility coverage while retaining product-instance nodes for price, stock, and data-integrity coverage. A TestBucks home node can treat a rotating background image as irrelevant for a search-input check, but create a distinct content or visual-review instance when the seasonal menu, login state, experiment treatment, or regional policy changes. A checkout state can be equivalent for typography yet distinct for payment authorization, tax calculation, or recovery behavior.

In practice, the planner supplies a definition such as: “For shared visual component checks, treat pages as equivalent when the route template, component structure, and interaction affordances match; ignore personalized news and decorative imagery. For privacy or data checks, split nodes when identity, consent, third-party destination, payload class, or retention boundary changes.” The AI can then explain its similarity judgment, retain the evidence used, assign a confidence, and request a different graph granularity when the current one hides a risk. This is less brittle than hard-coding pixel counts or URL regexes, and it lets the same exploration support multiple valid views of the product.

Illustrative TestBucks crawl. Start at Home, discover Menu, customization, Cart, Checkout, and Orders. Capture the page, DOM, and available diagnostics at each meaningful state. Compare empty and populated carts, an unavailable drink, and the timeout state. Use synthetic local data; do not crawl Starbucks or submit real orders.

Crawl behavior families, not just addresses

An address is not necessarily a unique behavior. Different order URLs can be the same route template. A checkout can look identical before and after a tax-service outage while representing materially different states. A news article and a product page can share a header but have different content and conversion risks. The planner should reason in behavior families:

  • Route family: one template or component pattern, such as search results, product detail, account settings, or an article.
  • State family: empty, populated, loading, error, permission denied, logged in, logged out, interrupted, or recovered.
  • Role family: visitor, member, administrator, support agent, buyer, seller, or tenant-specific identity.
  • Platform family: desktop, mobile, narrow viewport, browser/OS version, locale, assistive technology, or network condition.
  • Business family: acquisition, sign-up, search, cart, checkout, support, deletion, revenue, safety, or regulated action.

AI makes crawling more valuable than a traditional spider because it can look at routes, DOM, source, requirements, prior evidence, and risk together. It can decide that twenty product URLs share one template and spend the next minute on an empty cart, a permission boundary, or a locale the product has not exercised.

A crawler needs a stopping rule

The useful question is not “How many URLs did we find?” It is “Which unobserved behavior could still change a release decision?” Start with route families, user roles, major states, and business consequences. Sample pages that are structurally or behaviorally different: logged out versus logged in, empty versus populated, permission denied versus permitted, desktop versus narrow viewport, and the revenue or safety path versus a brochure page.

Stop when new surfaces mostly repeat an already-observed template, state family, and evidence signature; record what was deliberately not reached. Do not turn a search box, infinite calendar, game loop, or customer-data endpoint into an accidental unbounded crawl. Rate limits, robots rules, authentication scope, environment ownership, sensitive-data handling, and cost budgets are plan inputs, not inconveniences for an agent to ignore.

For every selected candidate, preserve a selection record: where it came from, which family and role it represents, what risk it covers, which state it assumes, which AI Checks will run, and why it is worth the time. That turns “the agent wandered around” into an auditable coverage plan.

The crawler runs AI Checks at every meaningful step

Discovery is more than collecting pages. At each selected surface, the Harness can run a compact, risk-appropriate evidence pass:

  • Screenshot and visual/UI/UX inspection;
  • DOM and accessibility-tree inspection;
  • Console, application-log, and error-message inspection;
  • Network, storage, privacy, consent, and third-party-flow inspection;
  • Performance, reliability, caching, and transport inspection;
  • Content, localization, compatibility, data, API, and security-boundary inspection;
  • Focused component checks for forms, search, carts, pricing, checkout, chat, publishing, or another relevant eigen-app pattern.

Not every AI Check must run on every surface. The planner uses risk, page family, known issues, model cost, and available evidence to choose the bundle. A payment form deserves input, privacy, error, security, and total-calculation scrutiny. A legal page may need policy alignment, accessibility, content, and link checks. A search-result page deserves ranking-feedback, sponsored-content, query-recovery, performance, and result-navigation scrutiny.

Why crawling creates so many apparent duplicates

Duplicate findings are not one thing. The agent must distinguish:

  • Shared-component duplicates. The same inaccessible header navigation, low-contrast footer, or broken privacy link appears across fifty routes because a shared component renders everywhere.
  • Shared-code duplicates. One client bundle, dependency, configuration default, or feature flag produces the same console exception or insecure behavior across many pages.
  • Shared-transport duplicates. The same analytics request, missing cache header, third-party endpoint, certificate issue, or failed resource appears in multiple traces with different timestamps, IDs, or query parameters.
  • Shared-data duplicates. One stale source record, formatting rule, localization string, inventory calculation, or backend contract produces many visibly different symptoms.
  • Semantically equivalent descriptions. One agent says a navigation item lacks a discernible label, another says a screen-reader user cannot identify the profile control, and a third cites a WCAG criterion. The strings differ; the defect may be the same.
  • Repeated test candidates. Different prompts can generate several versions of the same intent test: add a product, change quantity, verify total.
  • Same cause, different consequence. A shared header bug might block navigation on one route and conceal sign-out on another. The cause is shared, but the impact and priority may need separate instance records.

Exact string matching cannot solve this. Console stacks vary by build and path. Network logs carry timestamps and IDs. Screenshots differ with content and viewport. Natural-language bug descriptions use different words. The task is logical: do these observations support the same root-cause hypothesis, and if they do, do they have the same consequence?

Dedupe before, during, and after the crawl

The old workflow finds everything, files everything, then asks people to clean up the bug database. The AI-native workflow pushes dedupe upstream.

Before a new AI Check. Give the check a compact catalog of known canonical issues: category, root-cause hypothesis, affected components or routes, evidence signature, severity, and current state. Tell the agent: “Do not restate a known issue unless this surface establishes a materially different impact, a new root cause, stronger evidence, or changed severity. If related, attach an instance to the canonical issue.” This pre-dedupe triage avoids paying repeatedly to rediscover, describe, file, route, and later merge the same problem.

During discovery. Use cheap deterministic fingerprints to cluster obvious repeats: normalized route template, component selector, stack frame, error code, request endpoint, storage key, WCAG criterion, API operation, or visual-region signature. Then pass only plausible neighbors to an LLM judge instead of comparing every candidate with every prior candidate. This turns a many-to-many cleanup job into a bounded set of intelligent comparisons.

After the run. Have an LLM judge compare a candidate finding with relevant canonical issues and explain its decision. The judge returns more than yes/no: duplicate confidence, root-cause confidence, impact-equivalence judgment, supporting and contradictory evidence, and an action—merge, link as an instance, keep separate, or gather more evidence. A second model family or a human/policy-review queue can review the uncertain middle band rather than wasting time on obvious matches.

Use an LLM as a logical dedupe judge

A semantic-dedupe prompt supplies the candidate issue, its screenshot/log/trace evidence, the small list of likely related issues, the team’s definition of “same defect,” and a requested decision. It asks the model to reason about cause, component, evidence, user consequence, and scope—not word overlap.

Prompt

Compare this candidate with the known issues. Decide whether it is the same root defect, a new instance of a known defect, a distinct defect with a similar symptom, or insufficiently evidenced. Give duplicate confidence, explain the strongest supporting and disconfirming evidence, preserve the affected route and artifacts, and recommend merge, link, keep separate, or gather more evidence.

Illustrative AI response

Decision: link as another instance of NAV-A11Y-004. Duplicate confidence: 0.93. Both findings involve the shared GlobalNav component, the same unlabeled menu control, the same accessibility-tree signature, and the same keyboard consequence.

Disconfirming evidence. This instance occurred on /checkout, where the blocked task has higher business impact than the original homepage instance. Preserve the checkout route, viewport, focus trace, and screenshot rather than discarding them.

Action. Keep one canonical engineering defect, add this route as a high-impact instance, and raise the canonical priority for milestone review. Do not create a second root defect unless source or reproduction evidence shows a different component or cause.

Confidence is not a magic probability. It is a routing tool. A 0.98 duplicate-confidence candidate with the same component, stack, error code, and network endpoint can be merged automatically under policy. A 0.55 candidate whose user consequence differs should stay visible for review. A high-confidence shared cause with a high-severity instance can be one canonical engineering issue plus multiple affected-user records.

Decide where a deduplicated issue belongs

Deduplication never means throwing away where an issue was observed. A robust issue model has one canonical defect and one or more instances. The canonical defect carries the best root-cause hypothesis, cross-cutting severity, owner, fix prompt, and merged evidence. Every instance retains the route, user role, state, viewport, environment, first/last observed time, screenshot, log, trace, and local consequence.

There is no universally correct answer to “which page owns this bug?” A good attribution policy can:

  • Attribute the canonical defect to a shared component or service when evidence supports a common root cause;
  • Name the first observed route for chronology without mistaking it for the most important impact;
  • Elevate the route that shows the clearest user consequence or highest business risk;
  • Report a site-wide issue when one defect reaches multiple page families, while retaining route-level instances;
  • Keep separate issues when the same symptom has different causes, or one shared cause creates materially different security, accessibility, revenue, or safety consequences;
  • Avoid artificially balancing issue counts by page. The report should reflect reality, not dashboard symmetry.

The result can show one canonical issue—shared header navigation lacks an accessible name—with “observed on 42 routes” and an expandable list of instances. That is more useful than 42 independent bugs or one vague finding that loses every affected page.

Human perspective

HUMAN FRICTION — AI FLIPS THE SCRIPT ON DUPLICATES
Why duplicates used to be terrifying
For decades, duplicate work was a dirty word in QA. It was expensive: someone found a known issue, wrote it up, and sent it to another person who had to discover the duplication. Teams built ownership rules and triage processes to avoid that cost. Those rules solved a real problem. The question now is which costs remain after AI does the discovery and grouping.

What changed
The economics have flipped. Machine discovery, correlation, and dedupe are cheap, fast, and scalable. A crawl that finds the same header failure on forty pages is not evidence that the crawler did something stupid; it can be evidence that the crawler reached forty pages. If it finds no repeats at all, it may not be looking broadly enough to reveal shared components, shared dependencies, repeated state transitions, or recurring data patterns. The harness can pre-dedupe, semantically merge, retain instances, and suppress noisy report rows without wasting an engineer’s time.

Change the measure
Measure the repeated work that reaches people, not just the repeated observations a machine collects. Forty observations can support one useful issue. Forty tickets for the same issue create avoidable work. Let the machine find broadly, merge intelligently, preserve the evidence, and show people the decisions that remain uncertain or consequential.

Preserve raw observations and the dedupe decision

Deduplication itself is a judgment and can be wrong. Preserve the pre-dedupe candidate, canonical issue compared, evidence references, model and prompt version, grouping rationale, duplicate confidence, policy used, and the ability to split the group later. A merged issue is not erased evidence; it is a more useful view of the evidence.

This is how crawling becomes a quality system rather than a noisy bug factory: it explores product surface area, runs focused AI Checks, learns which observations repeat, spends compute where the next surface adds evidence, and keeps the relationship between a shared defect and every real place it appeared.

Your next useful result

Run the bounded TestBucks crawl. Choose one group of apparently repeated findings and check whether the evidence really supports merging them. Keep the original observations so you can reverse the decision.

You now have a way to inspect beyond one page without burying the team in duplicate reports. Chapter 3 takes the next step: asking the agent to act through a complete user journey.

Part II - Execute Tests by Intent

Let AI operate the product, then preserve the meaning of the test rather than its current clicks. Build portable tests, fix-ready handoffs, reliable execution, and controlled failure experiments.

Chapter 3 — AI Can Drive the Product

For years, “automation” meant a person painstakingly translated intent into clicks, selectors, waits, and assertions. AI blows that arrangement apart. A coding agent can operate the product, inspect what happened, change tactics, and keep the original goal in view. That is a much bigger change than generating Selenium faster.

From Ask to System

The visible prompts use a person as the narrator because that is the easiest way to show the progression from a quick request to a real Harness loop. In the deployed system, the agent creates most of these prompts and evaluations itself. It notices that accessibility evidence is missing, schedules the font-scaling and keyboard work, runs it, reviews the result, and creates the next bounded task. A person can start or steer the loop without babysitting every prompt.

Prompt

Add an item to the shopping cart, open the cart, verify that the same item and quantity are in it, and check the journey for accessibility problems.

  • The Test Brief: “Using a safe product and synthetic identity where needed, add one item to the shopping cart, open the cart, and verify the intended item and quantity are present. Exercise the primary path and the highest-risk recovery path. Then use keyboard-only navigation, visible focus, 200% text resizing, narrow-screen reflow, and dynamic announcements. Do not place an order or submit a real payment. Preserve screenshots, accessibility evidence, console, network, and final cart state; do not claim certification.”
  • The Harness: Negotiate browser and accessibility capabilities, choose the safest adapters, establish identity and data, combine deterministic rules with adaptive interaction and interface transformations, observe side effects, classify blockers, corroborate visual judgments, and rerun only when evidence justifies it.

Illustrative AI response

Functional intent: PASS. I added one medium vanilla latte, opened the cart, and observed the same item with quantity 1 in the rendered cart and cart-state response. I stopped before checkout.

Accessibility result: FAIL at 200% text. Keyboard operation completed with visible focus, but the enlarged cart total overlapped the checkout control at the narrow viewport. The normal-scale screenshot did not expose the problem.

Evidence. Action and state trace; normal and enlarged-text screenshots; DOM and accessibility snapshots; final cart-state response; console and bounded network summary.

Boundary. Screen-reader announcements and payment behavior were not assessed. The functional pass does not erase the reflow failure.

Framework choice is now an adapter decision

AI can drive Playwright, Selenium, WebDriver, browser-use, a dedicated executor such as Clicky, a browser’s agent interface, or native browser tools built into Claude/Codex-like coding agents. The test’s meaning should survive a change in driver.

TestBucks lab. Find a vanilla latte, choose medium size, oat milk, and an extra shot, add one to the cart, reload, and verify the same item and $6.60 total. The agent may use any approved browser adapter. The promise and evidence stay fixed, not the selectors. Preserve meaningful intermediate states for AI Checks.

TestBucks example: Three ways to drive the same cart

Give the agent one goal: add a medium vanilla latte with oat milk and an extra shot, then verify one item and a $6.60 total. It can operate an external browser, a browser embedded in its own window, or a framework such as Playwright. Each diagram shows a mobile-width browser view of the same cart. Those are three control paths, not three different tests or native mobile apps.

Three execution modes. The mobile-width TestBucks capture is real; the surrounding browser frames and control paths are illustrations, not screenshots of three coding-agent products or evidence of on-device testing. Real mobile-width TestBucks capture / illustrative browser frames and control paths. Same promise: one medium oat latte with an extra shot, quantity 1, total $6.60.

Figure 3.1a. One intent. Three control paths.
Figure 3.1b. One intent. Three control paths.
Figure 3.1c. One intent. Three control paths.

The external-browser route must identify the correct window and session. The embedded route must inspect the browser’s actual state, not its own chat response. The framework route still needs assertions after the click. In every case, preserve the selected options, quantity, total, and observation that supports the result.

TestBucks example: A purchase in three states

Prompt

In the TestBucks practice app, order one medium vanilla latte with oat milk and an extra shot for Alex Example in Seattle. Use only the simulated checkout. Verify the $6.60 total, one saved order, an empty cart, and persistence after reload.

Customize → review → verify. These are captured states from the working TestBucks practice application. Captured from the working practice app. Action is only half the flow. Observe the state that each action is meant to create.

Figure 3.2a. From choice to a saved order.
Figure 3.2b. From choice to a saved order.
Figure 3.2c. From choice to a saved order.
Figure 3.2d. From choice to a saved order.
Figure 3.2e. From choice to a saved order.
Figure 3.2f. From choice to a saved order.

The captured run saved one order with the requested options and a 660-cent total. Reloading preserved it; the cart was empty. That is a stronger result than “the order button was clicked.” The screenshots summarize the journey; the saved record supplies the persistence evidence.

The coding agent can drive almost the whole product

A modern AI coding agent is not limited to writing a test file and hoping a CI runner understands it. Where the project has granted the capability, the agent can open, inspect, and operate a browser; read the DOM, accessibility tree, console, network activity, storage, traces, and screenshots; alter viewport, zoom, locale, or network conditions; and preserve the evidence around the interaction. With the right skills and adapters, it can also operate mobile devices and simulators, native desktop applications, shells and command-line tools, APIs, event streams, queues, databases, feature flags, test data, configuration, and deployment or observability surfaces.

That is the practical reason AI Testing becomes a whole-system activity. The agent can invoke a user action in one place and measure its consequence elsewhere: click Save in a browser, query the database, inspect an event, check a worker log, compare the rendered result on another device, and then decide whether the promise held. It can also ask a person for a focused decision through a Human feedback loop, or use an explicitly synthetic persona to generate a qualitative hypothesis about clarity, price, or a visual result. A persona’s reaction is not customer research and a model’s opinion is not a fact; both become useful when labeled as the kind of evidence they are.

Capability is still scoped. A coding agent may have browser access but no private production credentials; it may control a simulator but not a physical device; it may query a read-only database but not alter a shared environment. The Harness Agent must negotiate and record the allowed execution surface before it acts. An unavailable capability is a BLOCKED or NOT ASSESSED boundary, not an invitation to infer success.

Capability negotiation instead of pretend automation

The agent should discover whether an executor can click, type, upload, inspect console/network/DOM/accessibility, set viewport, capture evidence, preserve sessions, and isolate data. Unsupported capabilities become explicit blockers—not fabricated passes.

Browser control for testing is not ordinary browser control

Public browser-agent evaluations often ask agents to accomplish a consumer task: find a recipe, locate a page, complete a form, buy a product, or navigate a familiar website. Those tests are useful capability signals, but they are not a serious proxy for testing work. The task distribution is often narrow, the live web shifts underneath the benchmark, and a score can reward reaching an end state while ignoring the very behavior a tester needs to observe: unexpected backtracking, a broken focus order, a timing race, a deceptive recovery path, a duplicate write, or a silently degraded visual state.

I learned this directly while measuring a browser-automation brain we call Clicky. A small early sample looked fantastic—around the mid-90s for the first ten or twenty tasks—and it was tempting to celebrate. Then I looked at the task mix. Too many early tasks were recipe searches on the same site. Later tasks changed the score, even though the product had not changed. Some live cases were stale enough that a human could not reliably satisfy the exact rating target either. That is not proof that all public evaluations are useless. It is a warning that an agent can look brilliant on a convenient sample and still tell us little about normal browsing, let alone testing.

For testing, “the agent eventually got it done” is not enough. The way it got there may be the result. If a cart button needed three retries, a text field gained focus only after an unexpected backtrack, or the state looked correct only after a late refresh, the Harness Agent needs to know. A sales-style browser controller tries to overcome that friction. A testing controller preserves it and asks whether the recovery was permitted, relevant, or itself the bug.

Clicky: a QA control-plane reference implementation

Testers.ai calls its testing-oriented reference implementation Clicky. It is not a claim that every test should use one proprietary executor, nor a published universal benchmark claiming that Clicky is best. It is a concrete design point: an application-control service plane built for software verification rather than average consumer browsing. The word control plane matters. Clicky is not just a tool that clicks. It carries the test’s intent, the authority and data boundary, the expected state, the observation plan, the recovery rules, the audit trail, and the result that would change a quality decision.

The executor therefore maintains more than browser state. It maintains at least four parallel views:

  • Intent state: what promise is being exercised—“add this item, open the cart, and verify the same line item and quantity”—plus setup, prohibited outcomes, and safety limits.
  • Evaluation state: what must be measured at each meaningful state, which oracle applies, which evidence is required, and what counts as pass, fail, blocker, or uncertainty. This is why a retry can be allowed to classify a timing problem without erasing the first failure.
  • Execution state: action history, current UI and application state, timing, navigation, selector or semantic target resolution, recoveries, environment conditions, and every attempt—not only the final path that happened to work.
  • Evidence and audit state: screenshots, DOM and accessibility snapshots, console and network slices, traces, API/database/event observations, model judgments, check results, provenance, and the explanation for each conclusion. In regulated or high-consequence work, this is often as important as the final pass/fail label.

This changes the control loop. An ordinary agent might see a failed click, wait, find another route, and continue until it reaches checkout. Clicky-style execution asks additional questions: Was the first click supposed to work? Did the product expose a usable recovery path? Did the alternate route change the intended scenario? Did a retry cause duplicate state? What evidence says the cart is correct? Should a Visual, Accessibility, Privacy, or Data Integrity Subagent inspect the new state before the next action? The test can fan out lightweight AI Checks during execution or perform a richer post-processing pass, but it never treats interaction as an opaque path to a final screen.

AI-First Test Cases: record the verification intent, not the choreography

A first intent needs a product promise and an observable outcome. For TestBucks, a plain-language instruction is enough to make the execution idea concrete:

Prompt

Add one medium vanilla latte with oat milk and an extra shot to the cart. Verify quantity 1 and the expected total of $6.60. Stop before checkout.

The executor discovers the current controls. The surrounding Test Brief supplies the approved local site, synthetic data, pricing rule, stop-before-checkout boundary, and required evidence. A sentence is enough to start; it is not permission to invent the missing conditions.

Run it, inspect the cart, and retain what happened. That is the execution loop this chapter teaches. When you are ready to save and exchange the intent, use Chapter 7, “The OpenTest.ai Test-Case Schema: canonical reference.” That is the single field-by-field reference, with a complete example and the allowed actions. Chapter 9 covers conversion from legacy automation.

A testing executor needs observers, not just actions

The overall intent can be simple, but the execution has many concurrent responsibilities. A Clicky-style QA executor can spin off bounded observer subtasks: one records visual changes; another watches console and network errors; another verifies the product-level oracle; another checks whether a state transition has changed the risks or invalidated the plan. These are not independent claims simply because they run in parallel. The Harness Agent fans their evidence back in, correlates it, deduplicates it, and records what each observer actually established.

That makes AI Tests unusually audit-friendly. A procedural Selenium test stores the human’s reasoning mostly outside the test—in a person’s head, a comment, a ticket, a wiki page, or an old pull request. Its script can show click, type, and assert, but it rarely records why that path mattered, what was considered, what failed before recovery, or why the resulting screen was sufficient evidence. An AI Test can preserve the brief, the dynamic plan, the interaction record, every recovery decision, all artifacts, the applied oracles, the counterargument, and the final confidence impact. It is more verbose in the evidence record while being less verbose in the test definition.

The execution spectrum is not a single leaderboard

There is no honest universal ranking of executors without a representative, versioned task set, declared environments, retries, safety constraints, task oracles, and error costs. The following is an architectural comparison, not a performance claim:

Execution approach What it is good at What the QA harness must add
Handwritten Selenium, Playwright, or Appium scripts Deterministic procedural control and a mature ecosystem. Intent recovery, richer evidence, adaptive diagnosis, and expensive human maintenance when flows change.
Intent-oriented frameworks such as Vibium Expressing a higher-level desired interaction without spelling out every selector and click. Fine-grained testing semantics: first-failure preservation, product-oracle interpretation, audit detail, and QA-specific observers.
Native coding-agent browser or computer use Source-aware diagnosis, broad reasoning, direct repair context, browser/desktop control, and rapid ad hoc exploration. Cost and latency management, repeatability, constrained recovery, stable audit records, and a distinction between task completion and product quality.
Clicky-style QA control plane Intent plus evaluation state, testing-specific recovery, concurrent observers, rich evidence, and auditability. Designed and tuned specifically for QA execution; teams should compare reliability, speed, token use, evidence quality, and recovery behavior on their own representative tests.

The direction is clear even where the relative numbers are not: legacy frameworks remain useful adapters, intent-oriented frameworks accelerate the transition, coding-agent controls make the loop much more intelligent, and a QA-specific control plane is designed to make the interaction itself inspectable. That is the distinction that matters in testing. A person using a browser is trying to finish. A testing system is trying to learn whether the product kept its promise while the person tried to finish.

Rules engines and AI do different work

axe-core and similar tools are valuable for deterministic, machine-detectable accessibility rules. They should remain in the loop. They do not, by themselves, explore a product, enlarge text, complete a journey, or decide whether the transformed result is visually coherent and usable. Ordinary automation can perform those actions when engineers explicitly program them; AI makes the interaction and interpretation adaptive.

The crown-jewel example

  1. Establish a baseline screenshot, DOM, accessibility tree, viewport, and rule-scan result.
  2. Increase text size or zoom to the relevant WCAG condition, and separately test reflow at a narrow equivalent viewport.
  3. Continue the user task—not merely reload the page.
  4. Inspect clipping, overlap, hidden controls, lost content, horizontal scrolling, broken focus, and unreadable recovery messages.
  5. Ask a visual model whether the layout still “looks good,” but require it to name observable geometry and user impact rather than offer taste alone.
  6. Corroborate the visual judgment with element bounds, visibility, scroll dimensions, screenshots, and keyboard behavior.
  7. Preserve the result as accessibility evidence, never as an automated conformance certificate.

AI is already much more than a smarter rule checker. It can transform the interface, interact with the new state, look at the outcome, and connect what happened to the user’s goal.

Chapter 4 — You Still Have to Run the Whole System

Jason story

JASON STORY — YOU CAN’T PUT AMAZON INTO A PROMPT

While writing this book, I had several venture capital investors reach out to ask what I was working on and whether I was looking for investment. I also had casual conversations with investors I already knew. What surprised me was how often very smart people assumed that as Claude Code got smarter, there simply would not be any more bugs.

This drives me crazy.

Some of the hardest, most consequential bugs come from the smartest engineers. Those engineers work on important systems. They make architectural decisions with a wide reach. Their mistakes are not necessarily a missing semicolon. They can be assumptions that spread across an entire system. Making the builder smarter does not make those interactions disappear. It lets the builder attempt something bigger.

Then there is the context problem. A million tokens sounds enormous until you compare it with a large company’s software, dependencies, configuration, data, and everything happening outside the codebase. I tried putting it this way: “You can’t put Amazon into a prompt.”

That did not land with some of them either. And even if you could fit all the source into the prompt, you would not have captured the running company. You would still have networks, changing data, timing, permissions, third parties, and people doing things nobody anticipated.

These conversations were happening during the rush to invest in frontier models. Some investors seemed frustrated if they could not get into those companies, and unsure where else the opportunity might be. They knew excellent engineers and had invested in serious coding infrastructure. But knowing how to invest in software and knowing how software fails are different kinds of experience.

To one investor who told me smarter models would make testing unnecessary, I replied: “Yep, that’s the consensus.”

Meanwhile, the testing infrastructure was feeling the pressure. In September 2026, Anthropic reported that its engineers were shipping eight times as much code per quarter as in its 2021–2025 baseline. Its test count had grown tenfold, and CI jobs had increased twenty-fivefold in six months. Faster code generation had not eliminated testing. It had put enormous pressure on it.

That is what I keep trying to explain. We are generating more code, changing more things, and creating more ways for those things to break each other. People already struggle with exponential growth. Now the testing problem can grow even faster than the code churn.

Generating code isn’t the same as delivering value. If we can’t test it and get it into production, the business is still waiting. We can spend a fortune generating code and just build a bigger pile of work that isn’t ready to ship. That is why cheap, fast, autonomous testing matters so much.

A couple of investors put their hopes in formal verification instead. I understand the appeal. Proving an important property is valuable. But the proof still has a specification, a model, and assumptions. It does not make the deployed environment identical to that model, or establish that the specification captured what the customer actually needed.

The question is not whether the code looks theoretically correct. The question is whether the whole system actually works. You still have to run the thing.

From Ask to System

Prompt

Review this code and test the whole system it participates in.

  • The Test Brief: “Review the implementation, then map every user-visible and machine-facing surface involved in checkout—the browser, API, database migration, event stream, worker, scheduled job, and client apps. Define the strongest oracle, realistic data and failure conditions, required evidence, and safety boundary for each. Execute the highest-risk authorized vertical slices and separate what source analysis suggests from what execution proves.”
  • The Harness: Use source, deployment, schemas, contracts, and business flows to discover surfaces; preserve one portable intent across specialized executors; provision safe identity, data, and state; climb from controlled probes toward realistic integrations; reconcile cross-surface evidence; and preserve every unreachable or unobserved boundary as uncertainty.

Intelligence cannot reason execution away

Definition

THE HALTING PROBLEM, IN PLAIN ENGLISH
The halting problem says that there is no single general algorithm that can take every possible program and input, inspect them, and always correctly decide whether that program will eventually stop or run forever. A checker can solve many particular cases. What it cannot do is become a universal, always-right termination oracle for arbitrary software.

That matters because “will this complete?” is already a simpler question than “will this system behave reliably, safely, quickly, and usefully for every relevant person and condition?” Source inspection, static analysis, symbolic execution, generated unit probes, and formal methods can prove powerful things inside a declared model. They can find unreachable branches, type errors, invariant violations, and many classes of defect. But a general inspection procedure cannot exhaustively settle the behavior of arbitrary software in every possible future state and environment.

Definition

RICE’S THEOREM, IN PLAIN ENGLISH
Rice’s theorem says that no general algorithm can always decide any nontrivial property of what an arbitrary program does—its semantic behavior—rather than merely how its source code is written. “Nontrivial” means the property holds for some programs and not for others. For everyday coding, it is the more direct specialization and simplification of the theoretical limit: no universal code inspector can always answer questions such as “Will this arbitrary program produce the required behavior for every input?” or “Does this arbitrary program have this meaningful class of behavioral defect?”

Rice’s theorem does not say that particular properties cannot be analyzed, or that static analysis and formal proof are useless. They can establish important, bounded properties when the language, model, inputs, and assumptions are constrained. It says that there cannot be one general, always-correct decision procedure for every arbitrary program and every meaningful behavior question. That is why testing needs a portfolio of inspection, proof, constrained execution, and runtime evidence rather than faith in a universal code-reading oracle.

Definition

GÖDEL’S INCOMPLETENESS THEOREMS, IN PLAIN ENGLISH
Gödel’s incompleteness theorems show that any consistent, effectively specified formal system rich enough for ordinary arithmetic contains statements that are true but cannot be proved from that system’s own rules. They do not literally prove that every program must be browser-tested. They are a warning against the fantasy that one sufficiently expressive proof system can, from inside itself, derive every truth worth knowing about a complex system.

Together, these results place a real boundary around “just inspect the code” or “just prove it formally.” Formal proofs are still extremely valuable when the model, specification, and assumptions are explicit. They establish properties of that model. They do not automatically establish that the deployed whole system has the same dependencies, data, timing, configuration, user behavior, operating system, browser, or third-party reality as the model.

The practical argument is already overwhelming. Runtime behavior depends on data, configuration, state, concurrency, clocks, networks, identity providers, browser versions, operating systems, caches, service limits, third-party changes, deprecations, and interactions no source review fully contains. Any line—or unchanged code exposed to new data—can participate in a system-level failure. The important failures are often not a broken line in isolation. They emerge at the seams: a browser and API disagree about a state; two component versions interpret a payload differently; a retry collides with an already-applied update; a cache preserves yesterday’s authorization; a payment succeeds while an event is delayed; a valid new configuration combines badly with an old dependency.

That is where much of the business risk lives: money moves twice or not at all, a customer sees a promise the backend cannot honor, personal data reaches the wrong place, an operational team loses the ability to recover, or a regulated decision is recorded incorrectly. The ultimate measure of quality is therefore not whether each component looks reasonable by inspection. It is whether the interacting, stateful system keeps its important promises under the conditions that matter. To establish that, an AI Test Harness must run partial systems and, where risk requires it, the full system through representative vertical slices.

Climb the reality ladder

  1. static inspection and generated unit probes;
  2. component and contract execution;
  3. full-stack execution with real storage and realistic data;
  4. real dependency sandboxes and failure conditions;
  5. production-like environments with representative configuration and load;
  6. controlled canaries, observability, and rollback in production where the risk justifies it.

Mocks make rare failures controllable; they do not prove that the real service, certificate, timeout, data contract, or current version behaves the same way. The goal is not reckless testing in production. It is an explicit progression toward reality, with safety, isolation, monitoring, reversibility, and the authority model currently required for the action.

Smarter builders create larger failure surfaces

One recurring confusion in AI discourse is the assumption that a smarter model will therefore write perfect code. It is easy to reach that conclusion from a self-contained demo, a small project, or a clean benchmark: fewer local mistakes feel like a straight path to no mistakes. Large, long-lived systems teach the opposite lesson. More capable coding agents may reduce some local defects while producing more code, more integrations, more configuration, more states, and more ambitious system behavior. Complexity and blast radius can grow faster than line-level correctness. The subtle structural defect created by an expert—or an expert model—can be more consequential than an obvious syntax error.

That blind spot helps explain why AI Test Harnesses are only now becoming a first-class part of the agentic development loop. Code generation is moving faster than credible, system-level validation. Without a harness, an organization can generate an extraordinary amount of apparently plausible software and still lack the evidence to let it run. The promise—to businesses and to society—remains locked behind uncertainty: the software may compile, read well, and pass shallow tests, yet still be unfit to ship because no one has established that it keeps its important promises in the interacting environment.

Definition

VALIDATION COMPLEXITY: A WORKING ENGINEERING HEURISTIC
Jason’s validation-complexity heuristic is that the work needed to build credible release confidence often grows roughly quadratically with the size and change surface of a software system. The intuition is not that every line must interact with every other line. It is that components, versions, states, identities, configurations, and dependencies create pairwise—and sometimes higher-order—interactions that must be selected and exercised. Strong modularity can reduce that growth; dense coupling, shared state, and dynamic dependencies can make it worse. This is a planning model, not a mathematical law or a universal measured exponent.

The practical consequence is not “run every combination.” That is impossible. It is to use an AI Test Harness to model the system, rank risk, select discriminating vertical slices, preserve evidence, and continuously add coverage where interactions are changing. Google’s published continuous-testing work supports the narrower, important point: at Google scale, code size and feature churn make it infeasible to regression-test every change individually even with substantial testing resources. It does not establish a universal quadratic formula. The heuristic belongs in this book as a guide to why risk-aware selection, continuous validation, and confidence analysis are necessary—not as a substitute for measuring each organization’s own validation curve.

Better code generation therefore increases the need for independent execution evidence; it does not eliminate it.

The web page is the most visible example in this book, not the boundary of AI testing. A capable coding agent can reason across the whole stack and use a browser driver, API client, database tool, command runner, simulator, device lab, or human procedure as an execution adapter.

It is tempting—especially outside the day-to-day work of shipping systems—to reduce quality to whether one function is correct, or whether a small set of functions calls one another as expected. That is necessary evidence, not the whole claim. The quality matrix expands dramatically once the system has persistent state, identity and permissions, asynchronous work, protocols, retries, caches, queues, multiple versions, partial failure, timing, concurrency, real data, external services, and nondeterministic inputs. The question is no longer simply, “Did this function return the right value?” It becomes, “Did this evolving system do the right thing for the right actor, at the right time, with the right record and recovery behavior, while every dependency behaved imperfectly?”

End-to-end quality is also defined by what is absent. A happy-path feature can look correct in isolation yet lack a timeout, an error message, an audit record, a rollback, an idempotency guard, a permission check, a safe default, an accessibility alternative, or a way to recover after a downstream failure. Those omissions create some of the most expensive defects because they turn ordinary problems into cascades: a retry doubles a charge; an unhandled event stalls a workflow; a missing boundary check exposes another tenant; an error that cannot be explained cannot be resolved. A system view lets an AI Test Harness look for the missing behavior and the broken relationship, not merely an incorrect line of code.

Software surface What AI can test Strong evidence and oracles Special risks
APIs and services Contracts, authorization, state transitions, pagination, idempotency, rate limits, timeouts, malformed input Status and schema, domain invariants, traces, logs, persisted state, downstream effects Destructive calls, hidden side effects, shared test tenants
Databases and migrations Backward/forward compatibility, constraints, transformations, rollback, large and dirty data, concurrent writers Schema diff, row invariants, checksums, query plans, backups and restore evidence Irreversible loss, privacy, production-scale surprises
Queues and event streams Ordering, duplication, retries, poison messages, schema evolution, eventual consistency, replay Event IDs, consumer state, dead-letter queues, traces, convergence and idempotency invariants Delayed harm, cross-service coupling, replay side effects
CLI tools, jobs, and build systems Flags, stdin/stdout, exit codes, files, scheduling, cancellation, resumability Process status, output contracts, filesystem/container diff, audit and timing evidence Shell authority, secret leakage, broad filesystem mutation
Native mobile and desktop apps Installation, permissions, offline behavior, OS integration, updates, deep links, assistive behavior Device video, accessibility tree, app/system logs, local data and network traces Device state, signing, hardware variance, destructive permissions
Embedded and physical systems Protocol behavior, simulated sensors, firmware update, resource limits, fail-safe states Emulator/HIL traces, timing, telemetry, safety invariants, specialist observation Physical harm, irreversibility, certification and lab authority

One intent, several surfaces

The running checkout example should not stop when the browser shows “Order received.” Follow the discount and payment-recovery state through the public API, authorization policy, migration, database invariants, event publication, duplicate delivery, worker retry, email, analytics, and support visibility. The portable intent is “an eligible customer receives the declared discount exactly once and can safely recover from a payment interruption.” Each surface contributes evidence to that claim; none proves it alone.

Surface-specific safety and uncertainty

The agent must negotiate capability and authority separately for every surface. Read-only schema inspection does not authorize a migration. A local queue emulator does not establish production throughput. A device simulator does not prove a physical accessibility or radio condition. When an executor, environment, oracle, or specialist is unavailable, the harness should recommend the next best evidence and label the gap rather than substitute confidence.


Chapter 5 — AI Tests Beyond the Browser: Mobile, Desktop, Voice, and Devices

Jason story

JASON STORY — PLAY THE GAME YOU HAVE NEVER SEEN

When we worked with Microsoft Xbox Games, Xbox was adding cloud gaming. That is a hard problem. Latency matters a lot when somebody expects the game to respond immediately. But the job they wanted us to automate sounded much simpler: open the game catalog, pick a game, launch it, and make sure we could actually play it.

The catch? We would not know the list of games ahead of time. We would not know how to play whichever game we encountered either.

They wanted that discovery and first-player experience tested end to end, continually. Not a script that knew where one particular game’s Play button lived. Find what is available now and see whether it works.

So we did it with AI. And this was before LLMs.

The AI could look at the category listings and judge whether they made sense. It could find its way into a game, interact with it, and check whether it appeared to respond correctly. We could run that across different devices and clients without hard-coding each screen or a set of X and Y coordinates.

We were not asking it to master every game. We were testing whether a player could discover a game, get into it, and start playing. That was the platform promise. The specific game and the controls could change.

That was pretty awesome. The test knew what it was trying to accomplish without already knowing every screen it would encounter.

The browser is the easy example, not the boundary. A product can carry the same promise across very different interfaces. Start with that promise, then let the AI use the permitted controls to find out whether it holds.

Jason story

JASON STORY — ONE MORE DEMO BEFORE THE MOVIE

Much more recently, a very large company asked whether we could test games with AI. I will leave the company unnamed.

I built demos where the AI would explore a game and learn how to play it. It worked through the menus and figured out what the controls did. Then we could change the kind of player it was trying to be.

What does a first-time player get stuck on? What happens if the player is trying to mess with the game instead of cooperate? Can they abuse the scoring? We used different personas, including Testy, and tried different kinds of games. A fast arcade game is a very different experience from a story-driven one.

They asked for more, so we built and demonstrated more. It worked. The AI was not just replaying a path I had recorded. It was learning enough about the game to explore it from those different perspectives.

I was excited enough to show my kids. I remember working on one of these demos right up until the last second before taking two of my sons to a two-in-the-morning showing of Hail Mary. Apparently, demonstrating AI game testing is what I do before a family trip to the movies.

And you know what the company went with?

A familiar, conventional framework. They had hired a contractor to do the work and choose the framework, and he chose one he had used before.

That was frustrating. We had just demonstrated something I thought was pretty amazing: testing a game without first scripting how to play it. The final choice went back to the familiar approach.

To me, that captured something about this moment in AI and testing. Showing that a new capability works is one thing. Getting it chosen for the actual work is another. We can build something that would have seemed impossible a few years ago and still end up maintaining the old scripts.

The examples here extend TestBucks beyond the local website into fictional mobile, desktop, and voice clients sharing an order service.

Prompt

In an isolated TestBucks multi-device environment, start one vanilla-latte order on Android, finish customization on the desktop, and verify that the same order and pickup status appear on an iPhone. Use one synthetic account and simulated payment. Preserve the per-device timeline.

Intent replaces a pile of mechanics

The customer promise is one coherent order, not a particular sequence of taps. The agent can use native accessibility, browser automation, device adapters, or service probes to establish that promise. A changed control should not change the intended milk, size, quantity, price, or pickup store.

Cross-device continuity shows why this matters

A customer starts an order on Android while briefly offline, adds an oat-milk option and a pickup note, then reconnects. The desktop should show that same draft. After the order is confirmed, an iPhone should show one confirmation and the correct pickup state. No client should invent a duplicate order, lose the milk choice, or display a stale price after a retry.

The agent arranges the network interruption, records each device’s visible state, and compares the order identifier, service events, and synthetic ledger. A local draft is not a completed order. Two confirmations might be duplicate notifications rather than duplicate charges. Preserve the observations that distinguish those explanations.

For voice, ask the TestBucks assistant to order a medium cappuccino with oat milk. Verify its spoken confirmation, the structured order, and the price. A correct transcript does not prove the right drink was ordered; the stored milk choice and final outcome must agree.

The local browser starter does not implement this multi-device service. These are portable test intents for an extended TestBucks sandbox, illustrating how the same coffee-shop promise crosses interfaces.

Different interfaces need different evidence. For mobile, keep the device state beside the screenshot. For voice, preserve both the audio and the resulting order. For a shared order, compare the clients with the service record.

Different surfaces, different evidence

Surface Useful AI Test evidence Important limitations
Mobile Screenshots, accessibility tree, device logs, app state, notifications, battery/network state, backend traces Simulators differ from hardware; device/OS coverage is finite; permissions may reveal sensitive data
Desktop Window state, native control tree, process/resource evidence, filesystem effects, installer/update logs OS versions, enterprise policy, drivers, and multi-window behavior matter
Voice Audio input/output, transcript, timing, intent/result state, barge-in and recovery evidence Transcription is not the experience; accents, hearing needs, privacy, and safety need representative review
Multi-device Per-device timeline, account/session identity, server events, ordering and delivery state Clock skew, network partitions, duplicate events, and real-world latency can create false narratives
APIs and services Request/response contracts, authorization results, traces, persisted state, event IDs, idempotency keys, downstream effects A successful status code does not prove domain correctness; destructive calls and hidden side effects require strict scope and cleanup
Data analysis and pipelines Source-to-output lineage, schema and distribution checks, joins, aggregates, model inputs/outputs, reconciliation totals, freshness and drift evidence Representative data may be private or unavailable; a plausible aggregate can conceal biased, missing, duplicated, or stale records
Agent-to-agent interactions Per-agent intent and authority, prompts/tool calls, workspace diffs and ownership, handoff state, schedules or seeds where available, structured outputs, service traces, rate limits, loop/stop signals, and side effects Agents can share assumptions or reinforce one another’s errors; agreement is not independent verification, concurrent work can collide, and actions may exceed delegated authority
Physical or ambient systems Sensor/actuator state, safe simulation, audit events, fail-safe behavior Never let a generative agent improvise authority over harmful physical actions

Test the platform contract, not just a happy screen

AI is particularly good at combining the things platform testing usually separates: functional flow, permissions, accessibility, visual coherence, cross-device state, and recovery. It can ask whether the page still works after font scaling, whether the mobile permission wording matches the action, whether a voice confirmation is comprehensible, or whether an interrupted flow remains safe when resumed on another device.

But a model’s visual or language judgment is not a substitute for domain evidence. Use deterministic platform signals where available; preserve video or screenshots when they matter; run representative hardware for riskier claims; and bring in specialists and real users for accessibility, safety, medical, financial, or other high-consequence decisions.

Try it with CARBON: /carbon-compatibility — Check the declared browser, device, environment, and version combinations.

When the other user is an agent

An agent placing an order is another client of the system. It still needs the right account, permission, and evidence that the order completed. The new difficulty is coordination: two agents can retry the same action or work from different versions of the same state.

Start with one concrete test. In an approved sandbox, interrupt an agent after an order is accepted but before it receives confirmation. Let it retry. Did TestBucks create one order or two? Compare the final order record with the tool-call history instead of trusting the agent’s summary.

Multi-agent testing is an ordinary system test now

Increasingly, the “user” on one endpoint is another agent. That does not make the problem exotic or move it outside software testing. It makes it an ordinary distributed-system test with an unusually rich set of actors, state changes, and evidence. An AI Test may need to orchestrate a person simulation, a coding agent, a chatbot, a mobile client, a backend service, and a payment or identity provider. Test the interaction contract: identity, authorization, handoff, context, rate limits, loop prevention, unsafe escalation, error recovery, and the ability to explain what happened.

The agent run is itself a useful artifact bundle. A testing agent can inspect plans, prompts and context versions, tool calls, handoff messages, workspace diffs, ownership claims, traces, service events, retries, and final side effects. That is an underused advantage: AI agents are unusually good at reading the evidence produced by other AI agents. They can compare a plan with the actions actually taken, identify an undeclared write, notice that a recovery retry duplicated a side effect, or recognize that two agents reached the same answer by sharing the same mistaken assumption.

Concurrent agents make the state space real

The interesting cases begin when the agents are not politely taking turns. Send three independent teams the same coding task. Let two agents work in an explicitly sandboxed shared repository without knowing the other is active. Interrupt one agent between plan and write; give another stale context; duplicate a handoff; change a dependency; delay a tool result; or ask a reviewer to assess a workspace while another agent is still editing it. These are normal concurrency and coordination cases, not science fiction.

In controlled runs, agents can notice that intermediate files are changing unexpectedly and react by relocating or renaming their own working files. That behavior can look clever, but the test question is more concrete: did the system preserve ownership, auditability, and the intended collaboration contract, or did it evade coordination and create an unreviewed fork of state? A good AI Test Harness records the change, the reason offered by the agent, the competing write, and the resulting product state. It does not simply reward an agent for getting to a plausible final answer.

Scenario What the AI Test varies Evidence and invariant
Independent teams, same task Model, prompt, context, and implementation path Compare intent, diffs, tests, and behavior; agreement alone is not a pass
Concurrent shared workspace Write order, file ownership, and overlapping edits No silent overwrite; every final change has attributable provenance and a coherent merge path
Broken or stale handoff Truncated, duplicated, delayed, or incompatible context The receiver detects uncertainty, limits authority, and requests or reconstructs only the missing evidence
Interruption and retry Cancellation during a tool call or between a side effect and its acknowledgement Retries are bounded and idempotent; the final effect occurs once or is clearly classified
Unexpected workspace change An approved sandbox changes a file another agent depends on The agent detects the conflict, preserves evidence, and follows the declared collaboration policy rather than hiding the change
Agent-to-agent loop Recursive delegation, conflicting recommendations, or repeated repair attempts Stop limits, budget controls, escalation rules, and final side effects remain observable and bounded

Definition

COMPOUNDING RELIABILITY

Under a deliberately simplified independence assumption, a 20-step workflow with a 95% chance of success at every step succeeds end to end only 0.95^20 ≈ 0.358, or about 35.8% of the time. If “5% confident” literally means 5% likely to succeed per step, the chain is effectively impossible. Real agent steps are not equally reliable or independent: shared context, shared tools, and recovery behavior can make failures correlated in either direction. The arithmetic is not a reliability model. It is a warning against treating a high per-step score as an end-to-end guarantee.

This is why rigid orchestration is only a partial answer. A fixed graph, a canonical workflow, or a framework that makes every handoff explicit can reduce some classes of ambiguity. It can also narrow the behavior the system is allowed to exhibit, conceal failure paths that fall outside the graph, and create a false feeling of control. The problem is not that an agentic workflow needs fewer constraints. The problem is that a prescribed workflow, by itself, does not establish that the full system behaves reliably when context, timing, tools, and other agents vary.

The scalable answer is to let AI generate and test the scenarios that the agentic system creates. A capable AI Test Harness recognizes that its target is an agentic workflow. It then fans out bounded, approved scenarios across a cloud or controlled environment: cooperative runs, independent competing runs, malformed handoffs, shared-state conflicts, tool failures, budget exhaustion, changing context, and recovery. It fans the evidence back in, dedupes equivalent failures, challenges findings with independent invariants or judges where useful, and reports what was observed, blocked, or not assessed. This is not a request to brute-force every possible path. It is a way to explore the high-risk combinations that are too combinatorial to map exhaustively by hand.

Prompt

This is a multi-agent coding workflow. Using the supplied plans, prompts, tool-call traces, workspace diffs, task ownership, handoff messages, and result artifacts, create a bounded test matrix. Include independent agents on the same task; concurrent work in an approved sandboxed repository; stale, duplicated, or malformed handoffs; interruption and retry; incompatible assumptions; budget exhaustion; and an unexpected workspace change. For each scenario, state the participants, allowed writes, schedule, invariant, expected evidence, containment, cleanup, and verdict rule. Execute only approved sandbox scenarios. Label every unexercised scenario as NOT ASSESSED rather than inferring a pass.

Do not mistake two agents agreeing with one another for verification. Preserve independent invariants, service-side evidence, deliberate adversarial cases, and a declared authority boundary appropriate to the deployment. Agent-to-agent software is still software acting on behalf of people. Its quality obligation is larger, not smaller—and its own agents are now among the best tools available to test it.


Try it with CARBON: /carbon-eval — Evaluate agent behavior, trajectories, tool use, and consequential failure scenarios.

Chapter 25 returns to the separate question of testing the testing system itself.

The interface changes; the obligation does not. Establish what happened to the customer’s order. Chapter 6 follows that order behind the interface, through the services and data that make it real.

Chapter 6 — AI Tests APIs, Events, Data, and Distributed Systems

The screen can say “Success” while the system charges twice. That is the problem. APIs, jobs, queues, databases, identity services, and third-party dependencies are where the promise is actually kept—or quietly broken. A beautiful confirmation page proves almost nothing about the state that matters.

The following examples extend TestBucks with a fictional order API, payment sandbox, and fulfillment queue. They are not claims about the browser-only starter.

Prompt

Test whether placing a TestBucks vanilla-latte order creates exactly one authorized charge, one order, and one fulfillment request—even if the client retries or a downstream service is slow.

  • The Test Brief: “Use isolated test data. Exercise normal submission, duplicate submission, retry after timeout, and delayed fulfillment acknowledgement. Capture API requests, idempotency keys, traces, queue events, database state, and the customer-visible result. Do not hit a production payment rail.”
  • The Harness: Read the service contracts and changed code, identify authority and data boundaries, create approved data, coordinate callers and fault conditions, correlate evidence across services, check business invariants, and report the difference between an observed violation, a blocked assertion, and an unmeasured dependency.

APIs are product surfaces

An API is a product surface. It has users, promises, permissions, input boundaries, compatibility constraints, failure behavior, latency, and a changing contract. AI can derive candidates from specifications, schemas, code, traces, support history, and past incidents, then execute them through protocol clients or existing adapters.

The durable test language should still be intent: create an order exactly once; deny cross-tenant access; make a retry safe; converge within the stated window; emit the right event once; preserve auditability; delete data when a person requests it. Request syntax, client library, and assertion implementation are execution details that can be generated or changed.

Try it with CARBON: /carbon-api — Test schemas, authentication, errors, retries, and integration contracts.

Distributed systems need timelines, not isolated assertions

In a distributed system, “passed” may depend on which service, replica, event stream, or user you asked, and when. A good AI Test preserves a correlated timeline: the initiating action, correlation and idempotency identifiers, requests and responses, event publication and consumption, trace spans, state transitions, retries, side effects, and final reconciliation. The model can summarize that evidence, but it cannot invent causal certainty from a partial trace.

Risk Useful test question Evidence
Contract compatibility Can an older or external caller still complete the promised operation? Versioned schema, request/response examples, consumer and provider behavior
Authorization Can one identity access only the records and actions it is permitted to access? Policy decision, tenant IDs, audit trail, negative results, server-side enforcement
Idempotency Does retrying create one intended business effect rather than several? Keys, request sequence, ledger/order/fulfillment counts, traces
Event ordering What happens when events arrive late, twice, or out of order? Event IDs, sequence/timestamps, consumer state, dead letters, reconciliation
Eventual consistency Does every view converge inside the promised window? State snapshots across components and explicit convergence threshold
Migration Can old and new code/data coexist and roll forward or back safely? Schema/data version, migration logs, sampled records, rollback evidence
Third-party failure Does a slow, malformed, or unavailable dependency remain bounded and visible? Timeout, fallback, circuit state, customer result, recovery trace

Try it with CARBON: /carbon-networking — Investigate request failures, timeouts, ordering, and network-dependent behavior.

TestBucks example: Success on screen, failure underneath

The companion’s missing-order teaching variant deliberately displays “Order placed” without saving an order. Click through it. Then inspect the saved orders rather than accepting the confirmation as proof.

A real browser run of an intentionally broken teaching variant: the confirmation appears, but the matching order does not exist. Captured from the isolated missing-order teaching variant. Correlate the visible confirmation with durable state. A success message cannot prove its own claim.

Figure 6.1a. The screen says success. The record disagrees.
Figure 6.1b. The screen says success. The record disagrees.
Figure 6.1c. The screen says success. The record disagrees.

The invariant is simple: a confirmed order must have a corresponding durable record. In this local fixture, the second observation is the order store. In a distributed deployment, the agent would correlate the confirmation ID with the order API, database record, and payment event. An unavailable backend observation means that part is unverified; it does not turn the screen into a reliable oracle.

Prompt

Run the missing-order variant. Preserve the confirmation ID, inspect the saved order state, and determine whether the confirmation is truthful. Report the two observations separately before giving the result.

Business invariants are the strongest oracles

TestBucks example: An error is not the end of the story

Suppose the checkout trace records a payment timeout at 10:00:00, a retry with the same request key at 10:00:01, and a confirmed order at 10:00:02. A log-only checker might file the first line as a checkout failure. A better investigation follows the timeline: did the customer eventually receive the order, was the promised response time met, and does the payment record contain exactly one charge?

One order and one charge within the promised window support successful recovery. Two charges expose an idempotency defect. One charge with no saved order exposes a different failure. Keep the initial timeout in the evidence even when recovery succeeds; repeated timeouts may still reveal a reliability problem. The lesson is to judge the completed promise, not the loudest log entry.

Many serious bugs are not screen bugs; they are violations of statements the business knows must be true. No charge without an authorized order. No order without an accountable customer. No fulfillment request twice for one order. No cross-tenant read. A deletion request must reach every declared retention boundary. A balance must reconcile. An email should not be sent after a cancellation. Define these invariants with the people who own them, make them executable where safe, and use AI to locate relevant data and evidence.

An invariant is not a model’s opinion. It is a falsifiable claim, plus a definition of its scope, timing, exceptions, authoritative sources, and remediation authority. AI helps build, exercise, correlate, and explain the proof; it does not get to weaken the rule because an answer sounds plausible.

Try it with CARBON: /carbon-data — Compare records and invariants across systems, transitions, and generated artifacts.

AI Testing in Production

Data quality is software quality. A product can have immaculate screens and correct-looking API responses while its underlying state is stale, duplicated, incomplete, contradictory, improperly retained, or exposed to the wrong party. Those failures change the behavior of every feature above them. They can also remain invisible to a test plan that only verifies that a query returned a row.

Production is where systems meet real versions, real timing, real integrations, and real state. That makes its captured, approved, privacy-safe artifacts unusually valuable evidence. AI Testing in Production means using AI Checks to inspect those artifacts for quality signals. It does not mean granting an agent blanket access to customer systems, exporting production data to a model provider, or running destructive experiments on live users.

Prompt

Inspect the supplied [DATA ARTIFACT] for inconsistencies, missing or duplicated records, suspicious outliers, impossible state transitions, unexpected correlations, and patterns that deserve investigation. Separate observations from hypotheses. Identify the exact rows, fields, records, timestamps, or byte ranges supporting each candidate. Also report useful confirming patterns and the evidence still needed to establish or reject each conclusion.

Illustrative AI response

Artifact inspected: masked orders-2026-08-30.csv. Candidate anomaly: order O-1042 appears in rows 441 and 443 with the same customer, amount, and idempotency key, but different charge IDs six seconds apart.

Why it matters. This pattern is consistent with a duplicate charge after retry. It is not proof: the second row could be an authorization replacement, a reporting duplication, or an expected gateway event.

Confirming evidence. 99.8% of sampled retries reuse one charge ID, and ledger totals reconcile outside this two-row cluster.

Next experiment. Join both charge IDs to the payment ledger and gateway event stream, inspect the retry trace, and verify whether the customer balance changed once or twice. Preserve the masked rows and correlation IDs; do not send raw customer data to an unapproved model endpoint.

That prompt can be applied to a database export or read-only query result; a CSV, JSON, TSV, .dat, or event file; a spreadsheet such as an .xlsx; a trace, audit trail, ledger, support export, or raw production log; an HTML snapshot; or an approved binary artifact. A capable agent can inspect schemas, headers, metadata, embedded strings, checksums, byte distributions, repeated blocks, protocol framing, and—when authorized—disassembly. It can sometimes infer likely structure or a machine-code pattern worth investigating. It must not mistake a plausible interpretation of bytes for proof of semantic correctness.

The Harness should treat data and binary artifacts as test surfaces, not as opaque leftovers from execution. It can compare a database state with an event stream and customer-visible result; reconcile a spreadsheet against a source system; inspect a deployment binary for unexpected dependencies or build metadata; and retain the precise artifact region that supports a finding. The same inspection can find positive evidence: for example, that every sampled retry shared one idempotency key, all expected ledger entries reconciled, or a new release preserved the expected distribution of outcomes.

AI finds candidates no one wrote a rule for

Traditional production monitoring is excellent at named rules: an error count crossed a threshold; a regex matched; a field was null; a checksum changed. Those rules matter. They only detect conditions someone predicted in advance.

An AI Check can also form bounded hypotheses from the evidence itself. It may notice that successful orders from one region consistently have a different currency scale after a deployment; that a spreadsheet’s totals reconcile while a small group of customers suddenly receives duplicate adjustments; or that a log contains successful responses followed by compensating retries and a growing queue delay. None of those examples proves a defect by itself. Each is a specific, explainable lead with a supporting slice of evidence and a next verification step—far more useful than asking a person to read millions of lines hoping to notice the same pattern.

This is AI Testing in Production: use real operational evidence to discover failure modes nobody thought to encode, confirm healthy invariants, and improve the next AI Checks and AI Tests. The artifacts already exist. Point the AI at them.

Keep the evidence inside its declared boundary

More context is not automatic permission. For every high-value dataset, establish the system of truth; legal, privacy, retention, and data-residency boundaries; the approved execution environment; representative but safe synthetic fixtures or masked extracts; state transitions; reconciliation queries; drift or anomaly signals; and a way to trace a customer-visible outcome back to inputs and transformations.

The Harness should minimize and redact the evidence it sends, use approved private or local model execution where the data boundary requires it, and preserve what was inspected without retaining unnecessary payloads. It can add a guardrail AI Check before any external model call to detect likely personal or sensitive data and block or scrub it. That guardrail is not perfect, but ignoring the boundary altogether is far harder to defend. Record what was examined, where it was processed, what was withheld, and which conclusions remain NOT ASSESSED because the necessary evidence could not be safely used.

Try it with CARBON: /carbon-data — Look for inconsistent, missing, duplicate, malformed, or unreconciled data.

Faults expose the system that the happy path hides

Finding a failure in existing evidence is useful. Fault injection goes further: deliberately create a controlled failure condition, observe the system’s behavior, and judge whether it kept its promise. It is one of the most powerful ways to discover whether a product can survive the situation nobody wanted to happen.

Definition

FAULT INJECTION
Fault injection is the deliberate, bounded introduction or emulation of a failure - for example a timeout, full disk, lost permission, malformed response, delayed event, partial write, or unavailable dependency - so an AI Test can observe recovery, containment, truthfulness, and final system state. The fault is not the test result. The result is whether the product kept its stated business and technical invariants while the fault was present and after it cleared.

Historically, this was unusually expensive and rare. Someone had to understand the source and its dependencies well enough to find an injection point; add or operate a proxy, stub, debugger, device control, service emulator, feature flag, or environment manipulation; predict what should happen; and then interpret a noisy, distributed aftermath. The work was sophisticated enough that many teams skipped it except for high-profile outages and dedicated chaos programs.

An AI coding agent changes the economics. Given source, contracts, traces, and a declared safety boundary, it can map likely failure points; identify an adapter or test seam; generate a reversible fault switch; create the business oracle; execute in an isolated environment; correlate screen, API, log, trace, queue, and database evidence; and explain the next most valuable fault. It can emulate browser and device conditions such as offline mode, latency, storage quota, bad responses, permission denial, locale, or viewport changes. Where granted an approved local or test environment, it can also exercise operating-system and service conditions such as full disk, read-only storage, missing files, expired credentials, unavailable DNS, clock skew, process interruption, queue delay, or a dependency that returns a semantically wrong success.

Prompt

Here is an isolated HTML page and its JavaScript. Map the user-visible promises, state transitions, external dependencies, and recovery paths. Add reversible fault-injection seams or test adapters only in this test copy. Inject a small, prioritized set of failures - network timeout, malformed or delayed response, storage full, permission denial, duplicate delivery, and retry after partial success - and run the resulting AI Tests. For each fault, preserve the before-and-after state, user-visible outcome, console and network evidence, invariant checked, blast radius, cleanup, and whether the result is observed, blocked, or not assessed. Do not target production systems or real customer data.

A safe, small example: A disk fills after the charge succeeds

The failure below is tiny but realistic. The payment gateway accepts one charge; immediately afterward, local persistence fails with ENOSPC (no space left on device). The screen tells the person to retry. Forget whether an error message appeared. Did the retry charge the customer twice?

Before fault injection exposes the missing contract. The original checkout code creates a new idempotency key on every attempt. It looks harmless on the happy path and makes the retry dangerous.

async function checkoutBefore({ gateway, storage, orderId }) {
  try {
    const receipt = await gateway.charge({
      idempotencyKey: `${orderId}-${Math.random()}`
    });
    await storage.write(receipt); // injected ENOSPC here
    return { screen: "success" };
  } catch (error) {
    return { screen: "retry", error: error.code };
  }
}

After the AI Test identifies the risk, the durable business key is explicit. A retry can now replay the same order safely. The fix is not “ignore the disk error.” It is “preserve the one-charge invariant across the error.”

async function checkoutAfter({ gateway, storage, orderId }) {
  try {
    const receipt = await gateway.charge({
      idempotencyKey: `order-${orderId}`
    });
    await storage.write(receipt); // injected ENOSPC here
    return { screen: "success" };
  } catch (error) {
    return { screen: "retry", error: error.code };
  }
}

Recorded AI response

Result: the original implementation violates the one-charge invariant. After the emulated post-charge ENOSPC failure, retrying creates a second charge. The repaired implementation reuses the order-level idempotency key and keeps the charge count at one.

Safety boundary. This lab uses an in-memory gateway and storage emulator. It does not make a network request, write a real disk, or charge a processor.

The preserved synthetic-lab output shows the two attempts and final charge counts:

{
  "label": "before: disk-full after charge",
  "first": {
    "screen": "retry",
    "error": "ENOSPC"
  },
  "second": {"screen": "success"},
  "charges": 2,
  "duplicateCharge": true
}
{
  "label": "after: disk-full after charge",
  "first": {
    "screen": "retry",
    "error": "ENOSPC"
  },
  "second": {"screen": "success"},
  "charges": 1,
  "duplicateCharge": false
}

The apparent UI behavior is the same in both versions: the person sees a retry screen, retries, and then sees success. Fault injection exposes the system-level difference that a happy-path UI test would miss. This is why the agent needs source-aware risk analysis, cross-system evidence, and a business oracle - here, one order must create at most one authorized charge.

Fault family Examples an AI Test can emulate or inject in an approved environment What the oracle should ask
Transport and dependency Offline browser, DNS failure, timeout, reset connection, slow response, HTTP 429/500, malformed or semantically wrong response Did the user see a truthful state? Did the request retry safely, stop, fall back, or amplify the outage?
State and delivery Duplicate event, delayed event, out-of-order event, partial write, stale cache, lost update, replay after timeout Did the system converge, preserve ordering/idempotency, and avoid duplicate or lost business effects?
Resource and operating system Full disk, read-only directory, missing file, exhausted storage quota, memory pressure, process restart, bad clock Did it protect data, report the constraint, clean up, and recover without corruption?
Identity and authorization Expired token, revoked permission, changed role, missing secret, invalid certificate, wrong tenant Did it fail closed where needed, avoid data disclosure, and offer a safe recovery path?
Input and contract Malformed payload, missing required field, incompatible schema version, corrupt fixture, unusual Unicode, oversized request Did validation identify the problem accurately and keep adjacent data and services safe?
Experience and device Keyboard interruption, focus loss, canceled upload, browser storage unavailable, permission denied, app backgrounded Did the UI preserve intent, avoid lying about completion, and make resumption understandable?
Choose faults for confidence, not theatrics

A good AI Test Harness does not randomly destroy parts of a system just because it can. After basic functionality and evidence are covered, it estimates which fault candidates have the highest expected confidence value: high-consequence dependencies, recently changed state transitions, weak recovery evidence, historical incidents, unusual coupling, and conditions that can be exercised safely. It should record the proposed fault, expected invariant, estimated cost and blast radius, authority, cleanup, and the evidence that would materially change AI Confidence.

AI can generate useful fault candidates from dependencies and prior traces: duplicate delivery, partial write, timeout, stale cache, revoked permission, bad clock, malformed callback, exhausted quota, expired credential, or a dependent service returning a semantically wrong success. The Harness must impose blast-radius limits, cleanup, abort conditions, and explicit authority. An imaginative model is not permission to inject chaos into production.

Pair every fault with a business and technical oracle. “The request returned eventually” is insufficient. Did the user receive a truthful status? Did the system avoid duplicate effects? Did it preserve recoverable state? Did it surface the condition to the people who need to act? Did it converge after the dependency recovered? A fault that did not change an observable invariant can still be useful coverage, but it should not be inflated into proof of broad resilience.

Try it with CARBON: /failure — Inject approved faults into an isolated copy and investigate recovery without changing the original.

The complete-system rule applies here too

AI coding agents are very good at isolating a problem. Often their first move is to mock a dependency, synthesize a response, emulate an unavailable service, replace a device boundary, or stub an expensive call so they can understand one part of the system quickly. That is useful engineering. It is also a trap. The agent can make the local loop beautifully green while the product is proving only that it works with the agent’s own invented world.

The common failure is not that a mock exists; it is that the mock becomes invisible. An agent introduces a fake identity response, local payment success, deterministic clock, permissive feature flag, or canned API payload to unblock a task. The code is repaired, the targeted test passes, and the agent moves on without restoring the real boundary or adding an explicit record that the result was simulated. A Harness should treat every introduced substitute as state: identify it, record why it was used, constrain its scope, verify that it is removed or disabled when the task ends, and make simulated evidence impossible to confuse with complete-system evidence.

Mocks, stubs, contract tests, and service virtualization remain useful and fast. They give controlled evidence and make difficult failures reproducible. They cannot prove that the deployed configuration, real authentication, versioning, network behavior, routing, data, permissions, rate limits, and third-party dependencies work together. A real integration can fail because the OAuth scope differs, a certificate chain has changed, a queue redelivers, a phone has an old client, a server clock drifts, a payment gateway times out after accepting the charge, or an ostensibly harmless configuration changes the route entirely. None of those facts are established by a perfect mock.

Run the whole system in a safe production-like environment, then deliberately rewire approved boundaries and inject bounded faults to see how it behaves in the noisy, unfriendly world it will actually meet. Exercise real credentials created for the test, real versions, representative network conditions, real persistence, recovery after interruption, and the cross-service effects that occur after the happy response. Use canaries and production invariants where permitted. The point is not to eliminate isolation; it is to graduate from isolation to evidence that the integrated system survives its actual operating conditions.

An AI Test Harness can enforce that graduation. It can compare a run’s dependency map with its live configuration, flag a substituted service that remains enabled, schedule the smallest credible end-to-end rerun after a mock-based fix, select high-value fault injections from the changed boundaries, and report which claims are simulated, observed, blocked, or NOT ASSESSED. Release confidence comes from that distinction—not from a growing number of green tests in a controlled miniature of the product.


Chapter 7 — Record the Test’s Meaning: Portable Intent Across Tools

This chapter is the home for portable intent, its interchange format, recording/playback, and reuse. Chapter 3 introduced only the execution contract needed to get a first test running.

Jason story

JASON STORY — WHAT IF AMAZON AND EBAY COULD SHARE A TEST?

I think people are still missing the real scale of this opportunity. Testing has not just been slow because writing tests takes time. We keep writing tests that belong to one particular version of one particular application.

Then the application changes. That is why we have engineering teams. If we never wanted anything to change, we could leave the code alone and run the same thing forever. But the interface changes, the workflow changes, and the test’s hard-coded assumptions break. Somebody has to go back and update them.

That is only the first level of the problem.

Search for Beanie Babies on eBay. Now search for Beanie Babies on Amazon. From a user’s perspective, those are very similar tasks. From a testing perspective, they share a great deal of intent: enter the query, get relevant results, and be able to inspect what was found. But the traditional automation has to be implemented again for each application. Different selectors. Different page objects. Different scripts. The intent travels; the implementation does not.

What if those applications could share the test instead?

Look across the internet. Search boxes, shopping carts, sign-up flows, forms, and account pages repeat everywhere. They have to be familiar. People are not going to read a new manual every time they visit a website. Teams change the branding, tweak the layout, and add their own business rules, but much of what the user is trying to do remains the same. APIs and other software have recurring patterns too.

Developers reuse libraries, frameworks, and widgets all the time. Testing has reusable tools and techniques, but so much of the actual executable testing knowledge still gets rebuilt for each product. It can feel like a blacksmith hand-forging every sword from scratch. We have already learned how to test a search box. Why are we encoding that knowledge again?

I have built small versions of what I call an app index a couple of times. At test.ai, we did work for Google testing Android apps running on Chromebooks. We tested thousands of Android apps every day—not every feature in every app, but the recurring basics: launch, login, search, and similar common functionality.

This was early AI, before LLMs. Even then, we could recognize enough of the shared application patterns to operate across thousands of apps without handcrafting a complete script for each one.

The purpose mattered. Google was not primarily trying to find every bug in those Android apps. It needed to know whether the platform worked. Could those applications run and behave properly on a Chromebook? Most individual product teams do not need to test thousands of other applications. A platform team does.

That experience showed me how much testing knowledge we could reuse. But not if the test was stuck to one application’s selectors. Save what you want to verify, give the AI the product’s rules and context, and let it figure out how to do it.

Now take that beyond one platform project. Reusable intent tests can travel across similar applications. The resulting evidence can support comparisons: how well does this search work relative to other search experiences? How reliable is this checkout? Where does this product fall behind the ordinary expectations of its category?

That is the opportunity people are missing. Not just maintaining one company’s scripts more cheaply. Reusing what we know about testing across all these applications, and eventually comparing how well they work. That is a very different scale of testing.

Chapter 3 used a small intent to drive TestBucks. Now turn that successful investigation into reusable testing knowledge: what stays invariant, what context travels with it, and what the next executor is free to rediscover.

From Ask to System

Prompt

Write a reusable test for checkout.

  • The Test Brief: “Define an executor-neutral test for a returning customer placing one synthetic order. Record business intent, scope, priority and rationale, setup, inputs, success criteria, forbidden outcomes, failure impact, required evidence, and safety limits. Avoid selectors unless they are genuine contracts.”
  • The Harness: Normalize manual, generated, recorded, and procedural sources into a versioned portable intent contract; preserve provenance and implementation contracts; score missing information; select adapters; execute a bounded bake-in; and retain lifecycle plus observed execution history without promoting unproven candidates.

The portable record and its execution context

One promise, three representations

Consider this promise: retrying a purchase must not create a second charge for the same order. Here is the difference between preserving its execution instructions and preserving its meaning. This is an illustrative payment-sandbox example, not a completed run.

Manual procedure. Start with a fresh unpaid order and an approved sandbox payment method. Allow payment acceptance but drop the response. Submit payment, observe the retry state, inspect the original accepted charge, retry the same order, and compare the final order and payment records. Verify that the purchase completes with exactly one charge. The procedure must explain the fault controls, observation window, and evidence access to the person executing it.

Procedural automation. A script encodes the same sequence against today’s controls and helpers:

test('retry preserves one charge', async ({ page }) => {
  // Illustrative helpers: setup and fault controls are product-specific.
  const orderId = await createSandboxOrder();
  await dropNextResponseAfterAcceptance(orderId);
  await openCheckout(page, orderId);
  await page.getByRole('button', { name: 'Pay now' }).click();
  await page.getByRole('button', { name: 'Retry payment' }).click();
  await waitForPaymentReconciliation(orderId);
  expect(await countAcceptedCharges(orderId)).toBe(1);
});

AI-first saved intent. “Retrying a purchase must not create a second charge for the same order.”

The intent is the reusable promise. The execution context supplies the sandbox boundary, permissions, test data, and evidence requirements. The agent discovers the current controls and payment integration instead of requiring those details to remain frozen in the definition. It can also investigate concurrent retries or changed provider behavior without changing the underlying promise.

Saving implementation-specific test code creates dependencies to maintain, even when AI wrote it. Retain executable checks when their speed and repeatability justify that cost; do not mistake their current implementation for the permanent definition of quality. Chapter 21 follows this intent into an evolving confidence investigation.

Everything is a level of abstraction

AI is the next layer of abstraction. Higher-level languages let us stop writing every machine instruction. Frameworks let us stop implementing every browser interaction. AI lets us state the intent and have the agent work out which lower-level operations are needed. The machinery underneath does not disappear; we no longer have to manage all of it by hand.

The product intent is simple: reject a payment when the amount exceeds its limit, without creating a charge. Intent, test cases, tickets, dashboards, browser frameworks, programming languages, assembly, and machine instructions are all levels of abstraction. Each exposes something useful while hiding other details. A dashboard summarizes evidence; a test case describes expected behavior; Playwright or Selenium hides browser-control mechanics; source languages and instruction sets provide different ways to express execution.

Read the diagram upward for more meaning and downward for more implementation detail. Python, Java, and C are alternative language examples, not successive steps every program passes through. The diagram is a conceptual ladder, not a literal compilation chain. AI can work across those layers: preserve the intent, generate the mechanics, observe execution, and translate the evidence back into a result people can understand.

Figure 7.1. Keep the intent. Adapt the implementation across layers of abstraction.

The point is not that every AI agent should write machine code. AI can read, reason about, and write at any of these layers—from binary and assembly through C, Python, Java, and whatever abstraction comes next. The point is that the lower-level capability remains available while the reusable abstraction moves up—from implementation syntax to declared product intent, evidence, and authority. That is the same transition now beginning in testing.

Start with a sentence. Add structure when it helps.

You can save an AI-first test as a prompt, a sentence, or a paragraph. You do not need to learn JSON before you can test software with AI. For example, save this prompt:

Prompt

In the approved TestBucks payment sandbox, check that retrying a purchase never charges the customer twice. Use a synthetic order. Simulate a lost response after the first payment is accepted, retry the same order, and compare the final order and payment records. A success screen alone is not enough: show evidence of exactly one accepted charge. Do not use a real card or production checkout.

That is already a useful test definition. A little structure helps when you want to store many tests, compare them, hand them to different agents, or separate the goal from the action and the evidence. The structure organizes the intent; it does not make a vague intent correct.

The durable input to Clicky—or to any other executor—is an AI-First Test Case: a compact, portable definition of the product promise to verify. It can start as plain language rather than a page object or selector library. The surrounding execution context supplies the conditions, evidence requirements, and consequences that make the promise meaningful. The executor remains free to decide whether the right mechanism is a browser, device, API, database probe, service trace, or another approved adapter.

The OpenTest.ai Test-Case Schema: canonical reference

This is the book’s canonical reference for the test definition supplied to an AI executor. It belongs here, where an ad hoc request becomes a saved, reusable intent. Chapters 3, 9, and 13 use this contract without introducing smaller competing versions. A test case describes what to verify; a bug record describes a candidate failure already observed. For the latter, see Chapter 1, “The OpenTest.ai AI Issue Schema: canonical bug reference.”

What the record preserves

This book uses the OpenTest.ai otai/testcase · v1 contract as its concrete portable interchange example. Its minimum valid test is deliberately tiny: a title. Add a goal and steps only when they help the next human, model, or runner. That is the right boundary for interchange. A Harness can retain stable identity, setup, safety, evidence, provenance, priority, run history, and confidence in its own durable envelope without forcing every executor to consume that state.

The contract can preserve scenario-level intent and useful ordering without freezing page objects, coordinates, arbitrary waits, or framework bindings. A target may use visible text, an accessible name, or a selector, but visible product language is usually the more portable address. The mechanics may be regenerated when the interface changes; the title, goal, reasoning, and expected state explain what must survive.

Read the box as a test, not a program. The example below uses every field in the published step-based format. title names the promise, goal defines success, and steps is a list of objects. Each step separates what to do, why it matters, and what must be true afterward. thinking is a concise tester rationale, not a demand for a model’s hidden chain of thought. This is OpenTest.ai’s interchange format, not an OpenAI API format. The box is a populated test case; the tables afterward are its schema reference.

{
  "title": "Retrying a purchase preserves exactly one charge",
  "goal": "After an accepted sandbox payment loses its response, retrying the same order completes the purchase with exactly one accepted charge.",
  "steps": [
    {
      "description": "Open a fresh unpaid order in the approved payment sandbox.",
      "thinking": "Use a unique synthetic order and sandbox payment method so charges can be reconciled.",
      "action": "navigate",
      "target": "Sandbox checkout",
      "value": "/sandbox/checkout",
      "expected": "The unpaid order is ready and has no accepted charges."
    },
    {
      "description": "Arm the approved fault control to drop the response after acceptance, then submit payment.",
      "thinking": "Exercise an ambiguous response without blocking the original charge from being accepted.",
      "action": "click",
      "target": "Pay now",
      "expected": "The sandbox records one accepted charge while the client offers recovery."
    },
    {
      "description": "Retry payment for the same order and wait for reconciliation.",
      "thinking": "A retry must preserve the order identity rather than create a second charge.",
      "action": "click",
      "target": "Retry payment",
      "expected": "The purchase completes for the original order."
    },
    {
      "description": "Compare the final order and payment records after the agreed observation window.",
      "thinking": "A success screen alone cannot rule out a duplicate charge.",
      "action": "assert",
      "target": "Sandbox order and accepted-charge records",
      "expected": "The order is complete with exactly one accepted charge and no duplicate order."
    }
  ]
}

One test case is one portable object. A planner can place many of them in an array to generate, rank, deduplicate, vary, and dispatch a portfolio rather than treating every candidate as a permanent row in a human-maintained tree. The individual object stays small enough for a model to reason over directly, while the Harness attaches run history, evidence links, provenance, environment, lifecycle, and confidence analysis outside the portable core.

The OpenTest.ai AI-First Test Case fields, field by field

The public, open-source format and examples are available at OpenTest.ai and in its example repository. The top-level value is an object. title and goal are strings; steps is an array of step objects. Every step field below is a string. Only title is required for the minimal intent form. The published step-based guidance calls for an expected result on every retained step so the runner knows what to verify. Omit irrelevant optional fields rather than inventing values. A missing value is not an empty-string instruction.

Field What it records Why it is valuable in an AI-first system
title Short imperative test title. It is the only required field. A minimal intent such as “User can complete checkout with a saved card” already travels better than framework code. Add fields only when they change execution or judgment.
goal What success means for the user or system. Gives an AI runner a durable destination when the current UI, route, or mechanics change. It is the scenario-level promise rather than a list of clicks.
steps[] Optional ordered interaction and assertion records. Preserves meaningful sequence when order matters without requiring a particular automation framework.
steps[].description What the user or tester does. Makes the action legible to a person, an AI runner, or an adapter that needs to regenerate mechanics.
steps[].thinking Why a tester performs the step. Keeps intent beside action. If the old target disappears, the next agent can recover the purpose instead of blindly repairing a selector.
steps[].action One of navigate, click, fill, select, press, wait, or assert. A deliberately small action vocabulary is portable across Playwright, Selenium, an agent-native browser, a vision model, or a person.
steps[].target Visible text, accessible identity, or a selector when necessary. Visible product language usually survives implementation churn better than generated CSS. A selector remains available when it is a genuine contract.
steps[].value Input for navigation, filling, selection, or key presses. Carries the value needed to act without inventing a framework-specific call. Omit it when the action does not need one.
steps[].expected Observable truth after the step. Stops a runner from confusing motion with verification. Every retained action should establish something or move toward an explicit oracle.
Every action value

action has seven published choices. The other step strings are open text, not hidden lists of allowed words. The runner must define how it resolves targets, waits, timeouts, and evidence on its supported surface; the string alone does not grant permission to act.

Action Meaning Example target and value
navigate Open an approved location. Target: Sandbox checkout; value: /sandbox/checkout.
click Activate a control. Target: Pay now; no value needed.
fill Enter text into an input. Target: Delivery note; value: Leave at reception.
select Choose an available option. Target: Milk; value: Oat.
press Send a key or key combination. Target: Search field; value: Enter.
wait Wait for a stated condition under a runner-defined deadline. Target: Order status; expected: Paid. Do not invent a timing unit for value.
assert Compare evidence with the expected state. Target: Accepted-charge records; expected: Exactly one charge.
Every declarative check type

The published format also offers these nine small, alternative objects. They are standalone checks, not extra values of steps[].action. A runner must implement a type before it can execute it. They do not replace the richer, evidence-correlating AI Checks in Part I.

type Additional field What it asks the runner to check
console-clean None No console errors in the observed scope.
no-broken-link None No checked links return 4xx or 5xx responses.
network-clean None No failed XHR requests in the observed scope.
selector-exists selector: string The specified element exists.
selector-missing selector: string The specified element is absent.
text-contains text: string The specified text is present.
text-missing text: string The specified text is absent.
alt-text None Images have alternative-text attributes; this alone does not establish meaningful descriptions or accessibility.
contrast-min min: number Tested contrast meets the supplied ratio, such as 4.5. This alone does not establish WCAG conformance.

For example, {"type":"text-contains","text":"Order confirmed"} asks for one visible-state check. It does not prove that a payment settled. Neither these type names nor the step-based record supplies sandbox credentials, an observation window, or a complete oracle: retain those in the execution context.

Stable IDs, priority and rationale, setup, synthetic-data rules, forbidden outcomes, safety, required evidence, routing, run provenance, lifecycle, and release impact still matter. They belong in the AI Test Harness envelope described below. Keeping that enrichment outside the portable OpenTest.ai core prevents the book from pretending one interchange record must also be the entire quality system.

Read the example from intent to evidence

The title preserves the promise: one purchase, one charge. The goal names the difficult condition: payment was accepted but its response was lost. The ordered steps preserve that causal sequence; their rationale explains why a normal happy-path purchase is not an equivalent test. The final expected result demands order and charge evidence rather than accepting a success screen as proof.

The sample location and fault control are illustrative. A real runner needs a resolved sandbox address, credentials, an authorized fault mechanism, an observation deadline, and access to the reconciliation evidence. If one is missing, report the prerequisite as blocked rather than silently replacing this test with an easier one. The executor can adapt the controls it uses, not the promise it is supposed to verify.

Save the definition, not an invented result
  • Validate the chosen form. Parse the JSON and check field types. For a step-based case, use the documented actions and explicit expected results. For a declarative check, use its documented type and associated fields rather than mixing it into the action vocabulary.
  • Keep unknowns visible. Omit irrelevant optional fields. Resolve missing product rules or execution prerequisites before acting; never make them up to produce a complete-looking payload.
  • Keep state outside the definition. A run result, evidence link, retry history, approval, or stable internal identifier belongs in the Harness envelope, not in an improvised second version of the portable schema.
  • Keep the oracle stable. If the interface changes, regenerate mechanics against the same goal and expected behavior. A real product change may require a reviewed new test version; a failure alone is not permission to rewrite the expectation.

The small core is deliberate. Traditional manual test cases often become pages of procedural prose; test-management trees add taxonomy; Selenium, Appium, or Playwright code adds a second implementation; and page-object or product-object models add another abstraction layer to keep that implementation tolerable for people. Every layer can be useful as a generated adapter or compatibility surface. None needs to be the canonical definition when an AI can reason from intent, inspect the current product, and generate the mechanics at execution time.

The best portable intent is often less defined than legacy teams expect. Its title and goal preserve the promise; the surrounding Harness record is precise about constraints, required evidence, safety, and forbidden outcomes. Neither needs to decide in advance which DOM node to click, how many milliseconds to sleep, or which incidental screen route the current implementation happens to use. That freedom lets an executor adapt when implementation details change while still preserving the first-failure signal, testing meaningful recovery, and reporting a real product break instead of silently editing a test script.

AI-First Test Cases are therefore easier to vary intelligently. A harness can generate boundary, role, locale, state, network, accessibility, recovery, and data permutations from one durable intent, then select only the variations that improve confidence for the current change and risk profile. The record has enough semantic room for an agent to create a discriminating new case at runtime, rather than forcing a human to pre-enumerate every path in a library of scripts.

Chapter 9 develops conversion from legacy scripts and manual cases. Here the point is the portable record: the promise survives even when its execution machinery changes.

Try it with CARBON: /carbon-tests create an intent test for TestBucks checkout; preserve forbidden outcomes and required evidence — Save a reusable candidate, then earn trust through execution.

From recording to intent—and back to adaptive playback

Pause and practice

Record once, replay intelligently. Use two prompts: perform a browsing journey and save its OpenTest.ai intent, then replay that intent against the current interface.

Try this exercise.

Recording remains useful, but the recording should be treated as evidence from which intent can be recovered, not as the permanent test itself. For each observed action, retain:

  • The user goal and natural-language action;
  • The URL, route, and meaningful starting state;
  • The element’s role, accessible name, visible label, semantic identity, and stable test hooks where they are genuine contracts;
  • The input category or synthetic-data rule rather than a captured password, token, personal record, or one-off value;
  • The expected state transition, explicit assertion, forbidden outcome, and evidence reference;
  • Which details came from observation, which were inferred, and which still need an oracle.

During playback, the agent re-inspects after navigation and re-rendering, prefers semantic references over fragile coordinates or generated selectors, waits for observable state rather than arbitrary sleep, and captures the outcome of every step. It preserves the original failed action and evidence before adapting or retrying. A successful retry does not erase a potentially real race, stale-state, or resilience failure.

This creates a useful bridge in both directions:

human or agent demonstration → recorded evidence → recovered intent → portable test → adaptive execution

TestBucks example: The route changes, the latte does not

The original shop puts size, milk, and extras in one dialog. The companion’s adaptive variant introduces an optional holiday promotion, renames the starting control, and moves milk selection to a separate step. Run the same latte intent against both.

Three captured states from the adaptive teaching variant: promotion → revised customization → the intended cart. Captured from the isolated adaptive teaching variant. Adapt the interaction; do not silently change the requested drink.

Figure 7.2a. A changed route. The same intent.
Figure 7.2b. A changed route. The same intent.
Figure 7.2c. A changed route. The same intent.
Figure 7.2d. A changed route. The same intent.

The prompt does not need a special instruction for every promotional dialog. It needs a clear goal and boundaries: one medium oat latte with an extra shot, no extra products, and the expected total. The agent can dismiss an unrelated offer and find the new control. It cannot substitute regular milk just because that route is easier.

Prompt

Execute the saved latte intent against the revised TestBucks interface. Keep the requested options and verify the cart and total. Record any adaptation and any product defect separately.

Build comparison is a test, not a screenshot slider

Run the same declared intent, population, identity, data, environment, viewport, seed, and oracle against the baseline and candidate builds. Compare visible output, accessibility semantics, network behavior, state transitions, persisted data, performance distributions, errors, and downstream effects. Distinguish:

  • Intended change;
  • Harmless implementation variation;
  • Visual or semantic regression;
  • Behavior that cannot be compared because the environment or evidence contract changed;
  • Non-deterministic disagreement requiring repetition or a stronger oracle.

AI can summarize large differentials and explain which changes matter, but it must not declare every pixel difference a bug or excuse a changed outcome merely because the new build looks plausible. Preserve the raw before/after evidence, comparison method, model and prompt, exclusions, and human-approved product changes. Promote a differential into a regression only after the expected invariant or intended change is explicit.

Try it with CARBON: /carbon-map compare the baseline and candidate builds; focus on checkout — Explore the visual map and build differences, then investigate which changes affect the promise.

A durable AI-first intent contract

The Harness wraps the portable test case in a larger durable record; this envelope is not an additional requirement of the OpenTest.ai interchange schema. It is the persistent working memory of a quality claim: what promise matters, where it applies, what makes the result credible, what the system has actually observed, and what remains unknown. The record is designed to travel across agents, adapters, runs, and revisions without turning a useful intent into a brittle procedural script.

At its center are a stable identity, human-readable title, and tester-authored intent. Around that center, the record names the scope, setup, input data, expected and forbidden outcomes, and the oracle that decides whether the promise held. It specifies the evidence that a run must preserve—such as a screenshot, trace, API response, database observation, console log, or accessibility tree—rather than allowing an agent to say “passed” with no way to inspect why. It also carries the practical constraints that change what a safe run means: approved adapter, priority, tags, safety boundaries, test data, cleanup, and whether the case is draft, active, or archived.

The contract also retains provenance. A case can point back to the source file, legacy framework, requirement, incident, generated candidate, or human feedback that produced it, along with a content hash and revision timestamps. That makes later reasoning possible: a Harness can recognize that an implementation, requirement, or source case changed; explain why it selected an adapter; avoid presenting a stale result as current; and compare this run with an earlier one without pretending that they exercised the same product state.

Most importantly, the record distinguishes a candidate from an observed result, a repeatable result, and a trusted regression. A generated or imported intent begins as a candidate. A safe execution with preserved evidence may make it observed. Repetition across the relevant state, environment, and evidence contract may make it repeatable. Only then should a team—or a broader AI Test Harness policy—treat it as a regression signal worth relying on. The record can retain bake-in attempts, repairs, run history, artifacts, and classifications along that path, including blocked, inconclusive, flaky, or invalidated outcomes.

Readiness is therefore not a decorative percent beside a test name. The contract records the readiness assessment and its missing information: perhaps an oracle is vague, test data is unsafe, a required environment is unavailable, the target adapter has not been verified, or the case lacks independent evidence. That gives the AI Test Harness something precise to improve instead of silently filling gaps with assumptions.

Activation is not trust. Only execution evidence advances the lifecycle, and even an observed pass is not automatically a trusted regression. The value of a durable contract is not that it stores more fields. It is that it gives every agent a shared, inspectable basis for deciding what to run, what happened, what changed, and what must happen next.

Cross-platform by intent

Selectors, waits, and code can be generated per adapter. Business intent, setup, forbidden outcomes, and evidence requirements travel across Selenium, Playwright, Clicky, agent-native browsers, APIs, and future tools. Preserve exact selectors, status codes, payloads, timings, and wire formats only when they are genuinely the contract.

One latte intent across desktop, mobile, and tablet

The desktop TestBucks catalog has a coffee photo with a small plus control. The phone starts with a compact menu and uses quick checkout. The tablet keeps customization and the order summary beside each other. These are different routes, not just three sizes of the same screenshot.

Device portability: desktop and phone course screens, plus a tablet teaching extension. The iPhone frame is illustrative, not evidence of an on-device test. These interfaces illustrate different routes to the same outcome. Course screen captures / tablet teaching extension. Verify the same drink, quantity, options and saved order. Adapt the route, not the promise.

Figure 7.3a. One intent. Three device experiences.
Figure 7.3b. Compact menu and quick checkout.
Figure 7.3c. One intent. Three device experiences.
Figure 7.3d. One intent. Three device experiences.

Prompt

Buy one medium vanilla latte with whole milk for pickup in the TestBucks practice environment. Run the intent on desktop, mobile, and tablet. Discover the controls in each interface. Verify one drink, the requested options, the applicable price, and a saved order. Use simulated payment only. Preserve separate evidence for each device.

An AI executor can recognize the product card on desktop, the menu entry on the phone, and the split-view configurator on the tablet without three hand-written click scripts. The test still has work to do on every device. A phone pass does not prove that the tablet’s confirmation control is reachable or that its order is saved.

The same intent across different companies

Now change the shop, not just the device. TestBucks starts with a product catalog. Testin’ Donut asks for a pickup store before it lets you build the drink. Tim Testons starts with search and opens a customization sheet. A person can understand all three. An AI testing agent can carry the same intent between them too.

Three fictional shops from the course: different navigation, purchase flows, and prices; one reusable latte intent. Captured fictional interfaces from the course. Reuse the test intent. Bind each shop’s menu, pricing and pickup rules separately.

Figure 7.4a. One intent. Three different coffee shops.
Figure 7.4b. One intent. Three different coffee shops.
Figure 7.4c. One intent. Three different coffee shops.
Figure 7.4d. One intent. Three different coffee shops.
Figure 7.4e. One intent. Three different coffee shops.
Figure 7.4f. One intent. Three different coffee shops.

The reusable part is “buy one vanilla latte and verify the resulting order.” The local part is the shop’s contract: available sizes, ingredients, taxes, price, and pickup rules. The course examples show $4.50, $4.25, and $4.75. Those differences are not bugs. Charging a different amount from that shop’s accepted quote would be.

This is where reuse gets interesting. Keep one intent, supply each application’s context, and let the agent discover the route. Compare whether each product delivered its own promise—not whether all three have the same button or charge the same price. If a shop cannot provide the requested drink, report that limitation rather than quietly ordering something else.

Chapter 8 — Triage, Team Context, and Fix-Ready Handoff

Finding a possible bug is the easy part now. The interesting question is what happens next. Is it real? Does anybody care? Is it the same problem we already know about? Who can fix it? What experiment would prove us wrong? Chapter 1, “The OpenTest.ai AI Issue Schema: canonical bug reference,” is the complete field and value reference for the record that carries those answers. This chapter puts that record to work.

Triage turns a finding into an AI Issue candidate

Consider an illustrative TestBucks staff-dashboard extension with an unsafe pickup-note renderer. Triage must establish the defect from evidence, not an instructor’s answer key. It receives the saved synthetic input, staff Orders DOM, observable event-handler result, screenshot, console, and vulnerable source line. That evidence can support a high-confidence security issue. By contrast, the unrelated missing favicon remains a low-value content or packaging issue, and the mobile overflow needs product context before its milestone priority is known. One application produces three very different triage decisions.

A separate illustrative TestBucks diagnostics bundle, introduced in Chapter 1, contains two observed occurrences of ReferenceError: pickupEstimate is not defined and an application message saying “Pickup estimate unavailable.” It also contains a homepage screenshot with no confirmed visible layout defect, a semantic DOM with a named drink-search input, and a bounded redacted network sample. That is enough to create an AI Issue candidate; it is not enough to file a confirmed public TestBucks bug.

Prompt

Using the supplied TestBucks screenshot, semantic DOM, console excerpt, and redacted network summary, create one OpenTest.ai-style AI Issue candidate only if the evidence supports a meaningful concern. For each candidate, state the evidence for it, the evidence against it, confidence that it is a real bug, priority, routing recommendation, the smallest falsifying experiment, and a fix prompt that tells a coding agent to reproduce before editing. Do not claim user impact or root cause that the artifacts do not establish.

Illustrative AI response

Candidate title. Homepage console emits an unclassified pickupEstimate reference error during observed load.

Bug confidence: 4/10. Priority: 3/10. The runtime error was observed twice, but the screenshot shows no affected user flow; the network sample does not identify the responsible code; and clean-session reproduction, source mapping, and user impact are unavailable.

For the issue. Repeated runtime ReferenceError evidence. Against the issue. It may be benign, sampled, environment-specific, or unrelated to user-visible behavior.

Route and next experiment. Send first to the web-platform or homepage owner for reproduction and source mapping. Reproduce in a fresh isolated load, preserve the original console and visible state, and check whether search or homepage behavior changes before proposing a repair.

Triage is a skeptical evaluation loop

Triage is a structured argument, not queue sorting: Is the finding real? What does it mean now? What could disprove it? Who should act? Is the action worth the time? The first judge can be the same model that found the candidate—but it must receive an explicitly skeptical prompt and be required to read the evidence again.

Prompt

Triage this AI Issue using the attached evidence and the team’s triage policy. Do not assume the finding is real because another model reported it. State: (1) the evidence that supports the issue, (2) the evidence or plausible explanation that could make it a false positive or false negative, (3) confidence from 1–10 that it is a real defect, (4) priority from 1–10 for this milestone, (5) affected users and consequence if known, (6) the best routing target, (7) the smallest next experiment that could change the conclusion, and (8) a reproduction-first prompt for the AI coding agent. Mark every unsupported field as unknown.

With a team policy that treats a console-only public-homepage signal as advisory until user impact is demonstrated, the skeptical judge can answer in a compact, operational form:

Illustrative AI response

1. Supporting evidence. Two captured occurrences of ReferenceError: pickupEstimate is not defined during homepage load.

2. Counterargument and error risk. No confirmed visible defect; no responsible source in the bounded network sample; the signal may be benign, sampled, environment-specific, or unrelated to a user journey. An uncaptured role, locale, device, or retry state could also hide a false negative.

3. Defect confidence: 4/10. Repeatable candidate signal, not a confirmed product failure.

4. Milestone priority: 3/10. Advisory under this policy until a public-search or homepage behavior fails.

5. Affected users and consequence: UNKNOWN. Not established by the evidence.

6. Route. Web-platform or homepage owner for reproduction and source mapping.

7. Smallest next experiment. Fresh isolated load with source mapping; preserve console, network, screenshot, and primary-search behavior; determine whether the error recurs and changes a visible or functional result.

8. Reproduction-first prompt. Reproduce before editing. Identify the reference and its scope, preserve the original evidence, make only the supported repair, retest homepage load and primary search, and report whether the signal and any demonstrated impact disappear.

The result does not become “TestBucks has a bug” merely because it has a title, score, and route. It remains a candidate whose actionability depends on the team’s policy and the next evidence.

The triage result should preserve both the finding and its uncertainty. A great harness asks the judge to consider whether the evidence is stale, correlated, incomplete, generated by the test infrastructure, explained by a declared design choice, or contradicted by a different artifact. It should also ask what evidence would reveal a false negative: perhaps an uncaptured mobile state, a role the test did not use, a failing network retry, a locale, or an inaccessible path that the original run never reached.

Human perspective

HUMAN FRICTION — TEN FALSE POSITIVES CAN HIDE SEVENTY MISSED BUGS
What the reviewer sees
Early testing experiments produced a recurring adoption reaction. On a representative page, an AI might surface roughly 100 candidate issues in minutes: perhaps 70 looked plainly valid, useful, and interesting; another 20 sparked legitimate disagreement among the project team and outside reviewers about whether they were bugs at all; and perhaps 10 were obvious false positives. The reviewer sees those ten and thinks, “Now I have to clean up this robot’s mess.” That work is real.

What that reaction can hide
The seventy accepted issues often survived the existing human test process and were escapes that AI found after people had already spent the labor, time, and money to test the page. Testers are not a perfect oracle—different people and even the same person on another day can disagree—yet conventional review rarely measures that variance. The profession is trained to look for breaks, so it can underweight the large set of correct discoveries and over-weight the visible errors.

Keep the claim honest
In early comparisons with both a large crowdsourced testing organization and dedicated vendor teams, one bounded AI pass appeared to perform work that would otherwise have taken more than a month and a half in roughly ten minutes. That is a directional, scope-dependent observation—not a public benchmark. Even if only a fraction of the rough 100x speed and cost advantage holds, it changes when teams can find issues: before release, on every change or build, and across far more of the product than a monthly human-only cycle can reach.

Make triage team-specific, not generic-model generic

Beauty is in the eye of the beholder; one team’s bug is another team’s deliberate feature or acceptable tradeoff. A generic model does not know your current milestone, customer promises, risk tolerance, legal obligations, supported platforms, or definition of a release blocker. Put those decisions in a versioned Team Triage Context that travels with every AI prompt that finds, judges, deduplicates, routes, or triages a bug candidate.

Do not wait until the final queue review to supply it. Include the Team Triage Context in the initial AI Check or AI Test prompt that looks for issues, as well as in the later skeptical-triage and LLM-as-judge prompts. That lets the finder distinguish a release-relevant defect from an accepted tradeoff or out-of-scope observation before it creates an avoidable candidate, while the later judge can apply the same rubric consistently.

A useful policy states:

  • What counts as a defect, advisory, accepted risk, duplicate, expected behavior, or out-of-scope observation;
  • The team’s priority scale, severe-failure vetoes, and which consequences matter most;
  • Current milestone goals, explicitly de-prioritized areas, supported users, environments, and platforms;
  • Routing ownership, escalation paths, evidence thresholds, and required approval boundaries;
  • Examples of previously accepted, rejected, downgraded, and escalated issues, with the reasoning that made each decision.

The policy turns “priority 8” from a generic-model flourish into a project decision. Its version belongs in the issue record so a later reviewer can understand why two similar findings were treated differently.

Example team triage context (illustrative). This is the kind of small, versioned record a Harness can attach to each triage prompt:

Team triage context

TEAM TRIAGE CONTEXT v2026.08 / Checkout release

Milestone: saved-card purchase has no duplicate charge, cart loss, or unclear recovery.

Blockers: duplicate money movement; cross-account disclosure; inaccessible or unrecoverable checkout.

De-prioritized: cosmetic marketing differences; non-blocking analytics console noise.

Priority: money, account access, and irreversible writes > visual polish; mobile > desktop convenience.

Routing: Payments = charge/idempotency; Checkout = cart/recovery; Web platform = client errors.

Accepted: two payment submits after one action, no idempotency guarantee = High; Payments.

Rejected: isolated analytics reference error, no visible change = Needs Reproduction.

Exception: gateway timeout accepted only if retry is visible, safe, and documented.

Pass it with every relevant bug-finding and triage prompt. Ask the AI to name the closest precedent, explain any departure, or flag a missing policy decision rather than invent one.

Use other models as judges when the decision earns it

An independent model, a smaller model, a different provider, or a specialist judge can challenge the original triage. That can reduce shared blind spots, but it is not a magic vote-counting machine. Different models can share training patterns, misread the same weak artifact, or confidently disagree for no useful reason.

Choose the judge strategy by consequence, time, budget, and measured calibration. Routine, low-risk classification may use a fast economical model. A high-consequence security, privacy, safety, or release-blocking issue may justify a different model family, an independent prompt, additional execution, or all three. Track agreement, disagreement, false-positive rate, false-negative discoveries, latency, and cost against later confirmed outcomes; routing should improve from measurement, not provider mythology.

For the TestBucks console candidate, a second judge should receive the same redacted artifacts and team policy, not merely the first model’s conclusion. Agreement that the finding remains a low-confidence triage candidate adds some corroboration; disagreement should trigger a request for the discriminating evidence, not a majority vote that pretends ambiguity disappeared.

Human perspective

HUMAN FRICTION — YOUR TRIAGE JUDGMENT IS NOT THE ORACLE
Judgment varies more than people admit
Whether the judge is another LLM, a developer, a product manager, a QA tester, or a user, triage is not a measurement instrument that produces the same answer every time. Ask the same people to assess the same issue on different days and their confidence, priority, route, and even definition of “bug” can change. Timing matters: whether the team is exhausted, close to a release, protecting a milestone, reacting to a recent incident, or simply looking at a different evidence bundle. Historical issue systems often contain the residue of that variance, but few teams replay decisions systematically enough to measure it.

The reviewer is not the ground truth
Human QA testers, engineers, and product people can mistake the fact that they were asked to decide for proof that their decision is the truth. It is not. One person happened to see a job posting, get through an interview, remain on the project, and be present in the meeting. That is a noisy selection process, not evidence that this person is the best possible triager among billions of people and the available AI agents. Job title, experience, and accountability can make a reviewer valuable; none makes the reviewer an oracle.

Use the wider evidence base
An LLM can bring far more public code, bug reports, product patterns, standards, and prior examples to a question than any individual reviewer can hold in memory. That does not make its answer automatically correct. It does make the reflexive human response—“the AI disagrees with me, therefore the AI is wrong”—an especially weak form of triage. Compare the independent judgments, inspect the evidence and counterarguments, and run the smallest experiment that would distinguish them. The point of additional judges is not to crown a new authority. It is to reveal that authority was uncertain in the first place.

Optional human review becomes durable training context

This chapter covers issue-level triage. Chapter 28 expands the workflow to independent human exploration, shared review, product clarification, repair, and retesting. Keep those activities distinct: reviewing an AI finding is not the same as discovering a problem independently.

An optional reviewer can accept, reject, defer, reprioritize, recategorize, or mark an issue irrelevant, using a fast thumbs up, thumbs down, and a short comment. The review screen should show the proposed issue, evidence, counterargument, confidence, priority, route, and fix prompt—not just a generated title. This remains useful today, especially when lived experience, business consequence, or an approval boundary matters; it is a selectable step in the loop, not a claim that every finding must wait for a person.

Figure 8.1. Reviewing an AI Issue: accept, reject, and comment.

The comment is crucial. A thumbs-down might mean false positive, duplicate, already known, bad priority, unsupported evidence, or simply irrelevant to this milestone. Save feedback as append-only and scope it to the project and policy version.

Then pass a curated list of previous triage decisions into the next triage prompt as transparent, team-specific context—not merely as a score hidden in a database. Each example can include the proposed issue, evidence summary, final decision, priority or route, reviewer comment, milestone context, and the reason it was accepted, rejected, deferred, merged, or reprioritized. A prompt can say: “Here are representative issues this team accepted and rejected, and why. Apply the same decision principles to the new candidate; name the closest precedents and explain any reason to depart from them.” The AI can then factor actual team precedent into future triage without silently converting preferences into facts. Preserve an override and reset path, and never let a history of rejected findings suppress a new severe risk.

The fix prompt closes the agent-to-agent loop

The testing agent usually knows more than the symptom: it has the page state, logs, request evidence, source code, recent diff, business intent, and a likely repair location. The issue can therefore include a copyable prompt containing:

  • The observed problem and exact evidence;
  • The expected behavior and source of truth;
  • Likely relevant files or components, labeled as hypotheses;
  • Constraints, safety boundaries, and behavior that must not change;
  • A request to reproduce before editing;
  • Targeted validation plus broader regression and skeptical review after the fix.

When the harness and coding agent share a repository, the handoff can happen directly. When they do not, the prompt becomes a portable agent-to-agent protocol. Either way, do not let the fix prompt overwrite the issue record, skip reproduction, or claim the proposed repair was executed.

TestBucks example: Make the search failure fix-ready

With the practice app’s search fault enabled, searching for “vanilla” hides a drink that is present in the catalog. With the fault disabled, the same query returns it. Those two captured observations give the developer a narrow reproduction and a concrete regression target.

Fault enabled → normal behavior. This is a controlled comparison, not a claim that disabling the fault constitutes a source-code repair. Actual search-fault toggle and normal-build comparison. This comparison supplies a regression target; switching off a fault is not itself a code repair.

Figure 8.2a. Reproduce first. Then verify the repair.
Figure 8.2b. Reproduce first. Then verify the repair.
Figure 8.2c. Reproduce first. Then verify the repair.
Figure 8.2d. Reproduce first. Then verify the repair.

Create an AI Issue containing the build and fault setting, exact query, expected catalog match, empty result, and both screenshots. Challenge it: was a category filter responsible? Was the item unavailable? After those explanations are eliminated, ask an authorized coding agent to repair the isolated faulty implementation. Rerun “vanilla,” an unrelated drink query, and a genuinely empty query. Close the issue only when the original failure is gone and those neighboring behaviors still make sense.

From symptom to cause without guessing

An AI that can read every layer can also construct a beautifully plausible wrong story. Require a causal debugging loop before a material repair:

  1. reproduce the symptom from a declared starting state and preserve the earliest failing evidence;
  2. list competing hypotheses across product code, test definition, data, identity, environment, dependency, timing, and observer error;
  3. design the smallest discriminating experiment that would make one explanation more or less likely;
  4. run it, update the hypothesis ledger, and repeat until the evidence supports a cause or the result remains explicitly unknown;
  5. propose the smallest reversible fix tied to the supported mechanism;
  6. rerun the original reproduction, a counterfactual or negative control where useful, targeted adjacent checks, and broader risk-based regression;
  7. preserve what the repair established, what it did not establish, and whether rollback restores the old behavior.

The issue and fix prompt should carry candidate causes as hypotheses, including evidence for and against each. “This line is near the stack trace” is not root cause. Reproduction before edit protects against fixing a transient environment, test bug, or merely correlated symptom.

Investigate a failed regression before filing a bug

A red regression can consume more time than running the entire suite. Somebody opens the logs, hunts down an old incident, asks whether the environment changed, compares commits, and tries to remember the last time this happened. AI can take on much of that investigation. It does not need to wait for a neatly packaged bug report.

Bring it the failed execution and a comparable passing execution, timestamped logs and traces, screenshots, requirements, relevant knowledge-base articles, previous failures, recent code changes, test changes, and environment configuration. Include build IDs, correlation IDs, and the versions of the documents. Scrub secrets and personal data before sending artifacts to a model. Retrieved logs and KB content are evidence, not instructions to execute.

The goal is not “summarize these logs.” The goal is to distinguish explanations that would lead to different actions: repair the product, repair the test, restore the environment, clarify the requirement, or collect more evidence.

Prompt

Investigate this failed cancellation regression. Use the failed and last passing runs, logs, KB articles, previous incidents, requirements, and recent changes. What probably happened, what evidence argues against that explanation, and what is the smallest safe experiment to tell? You may rerun tests with synthetic orders in QA. Don’t modify code or production. Separate product failures from test and environment failures.

Example: A timeout that was also a product failure

Consider a TestBucks coffee order; Chapter 13 later develops the source-aware analysis behind this example. The following artifact excerpts and results are illustrative. Suppose Product has clarified the contract: cancellation must be visible within two seconds, and an email confirmation must be sent within sixty seconds.

Evidence supplied What it says
Approved ORDER-17 revision 3 Cancelled status within 2 seconds; confirmation email within 60 seconds
Failed run R204, build c43 UI cancellation passed; email assertion timed out after 5 seconds
Trace for synthetic order T204 Cancellation committed; event queued; worker rejected its payload as unsupported
Last passing run R198, build c42 Worker accepted the event; email arrived after 3 seconds
KB-12 and incident INC-88 Queue backlog previously delayed email; increasing the wait helped that incident
Current diff and environment inventory Producer emits event schema v2; deployed worker accepts only v1

There are two tempting shortcuts. Blame the product because the test is red. Or recognize the old timeout, lengthen the wait, and move on. Neither explains the current evidence. The five-second assertion is stricter than the sixty-second requirement, but the unsupported-payload error suggests that this message will not merely arrive a little later.

Illustrative AI response

Current assessment. There is a test-oracle mismatch and a likely producer/worker compatibility failure. The test stops after 5 seconds although ORDER-17 allows 60. Separately, the worker rejects this order’s event schema.

Why the old incident may not apply. INC-88 involved accepted messages waiting in a backlog. This trace shows rejection, not delayed processing. The KB workaround is a hypothesis to check, not a fix to copy.

Smallest next experiment. Without changing code, observe a fresh synthetic cancellation for the full 60-second allowance. Correlate its event with worker logs and the email sink. If it is rejected again and no confirmation arrives, queue delay alone does not explain the failure.

Possible follow-up result. The fresh event was rejected as schema v2; no email appeared within 60 seconds. That reproduces a contract failure in this QA build. Cancellation itself remained visible within 2 seconds.

Route and next step. Send the event, deployment versions, and trace to the orders/messaging owners. Ask whether the supported release should have included a v2-capable worker. Separately correct the regression’s timeout to match the approved contract. Neither repair has been performed. Passing the cancellation UI check does not clear the email failure.

The follow-up result above is what the report could say after that experiment actually runs. Before execution it belongs in the plan, not the results. The harness should preserve that transition instead of filling in a convincing ending.

Even a reproduced mismatch does not settle who made the mistake. The product may have an unsafe compatibility assumption, or the QA environment may be missing a required deployment. Compare the release manifest and supported rollout sequence before deciding. If the environment is incomplete, record the blocker and rerun in the intended configuration. If that mixed-version state is permitted during a rollout, it is a product risk worth testing. Do not silently relabel either case to make the dashboard green.

Keep the original failure, competing explanations, experiments, result, and remaining uncertainty together. After an authorized repair, rerun the original case and adjacent risks, including replaying a queued event without sending duplicate confirmations. Feed the resolved incident back into the team’s investigation context with its applicability conditions. “We have seen this before” should speed up the next investigation, not predetermine its conclusion.

This is the less glamorous part of testing that eats people’s afternoons. A capable harness can gather the context, challenge the obvious explanation, and return a much narrower problem to the right person. Chapters 9 and 11 apply the same discipline to regression conversion and framework failures. Chapter 21 uses the resulting evidence to decide what to investigate next—not merely which test to rerun until it passes.

JIRA is an export target, not the thinking surface

An issue tracker may still be required for ownership, audit, governance, or collaboration. The AI-native record should remain richer than the ticket, and the harness should synchronize a bounded human view rather than force agents to communicate through fields designed for manual triage.

Chapter 9 — Upgrade Legacy Automation, Then Convert What Matters

Do not start the AI transition by holding a funeral for every Selenium test. Get value first. Add AI Checks where the old assertions are blind, let the Harness keep the scripts alive, and convert the tests whose intent is worth preserving. The legacy suite becomes input, not your future architecture.

From Ask to System

Prompt

Upgrade these Playwright or Selenium tests for AI testing.

  • The Test Brief: “Keep deterministic assertions authoritative. Add sparse AI Checks only at stable evidence gaps, protect sensitive artifacts, and report model judgment separately. Then extract durable intent, setup, data, business oracles, negative and boundary conditions, forbidden outcomes, safety, and evidence from the best conversion candidates; preserve provenance and keep incomplete cases as drafts.”
  • The Harness: Inventory and hash the source suite; identify augmentation opportunities and conversion readiness; modernize brittle framework code where useful; normalize selected cases into portable intent; ask ranked questions; execute a small bake-in through safe adapters; classify failures; and activate only evidence-backed passes.

Two paths: augment first, convert deliberately

There are two useful moves. Augmentation keeps the procedural test and its deterministic assertions, then adds AI Checks that see far more than an assert can express. Conversion recovers the user and business intent buried inside the procedure, then burns in an adaptive AI-First Test Case until it earns trust. Use both. An all-or-nothing migration debate is mostly a great way to avoid starting.

Path one: add AI Checks to legacy automation

Traditional Selenium or Playwright tests usually ask narrow, deterministic questions: did this string appear, did this URL change, did the API return 200, did this control become enabled? Keep those assertions. They are useful when they express a clear product truth. The gap is that they normally do not inspect the state surrounding the assertion: whether the screen is confusing or visibly broken, a console error correlates with a UI change, network activity exposes private data, a page is inaccessible after a reflow, or a recovery experience looks unsafe even though the final expect() passes.

Here is a deliberately small Playwright-style example before augmentation:

await page.goto(`${baseUrl}/checkout`);
await page.getByRole('button', { name: 'Add mocha to cart' }).click();
await page.getByRole('link', { name: 'Cart' }).click();
await expect(page.getByText('Mocha')).toBeVisible();
await expect(page.getByTestId('cart-count')).toHaveText('1');

After augmentation, the original assertions remain authoritative, while a single ai_check() captures the state that is worth judging:

await page.goto(`${baseUrl}/checkout`);
await page.getByRole('button', { name: 'Add mocha to cart' }).click();
await page.getByRole('link', { name: 'Cart' }).click();
await expect(page.getByText('Mocha')).toBeVisible();
await expect(page.getByTestId('cart-count')).toHaveText('1');

await ai_check({
  name: 'cart-visible-state',
  screenshot: await page.screenshot({ fullPage: true }),
  consoleLog: capturedConsoleLog(),
  networkActivity: capturedNetworkSummary(),
  dom: await page.content(),
  focus: ['visual-ui', 'usability', 'accessibility', 'privacy', 'security'],
});

ai_check() is not a replacement for expect(). It is a structured invocation of the AI Check families from Part I. Depending on its declared focus and supplied artifacts, it can look for visual UI and UX friction, WCAG reflow or semantic problems, privacy leakage in console or network data, risky trust boundaries, content or localization defects, performance and reliability signals, form mistakes, cart confusion, and other quality concerns that the legacy assertion never attempted to name. The Harness preserves the evidence bundle and the model’s conclusion separately from the deterministic result, so a provider failure, refusal, or incomplete artifact is blocked or unknown—never a synthetic pass.

Put AI Checks at stable, decision-relevant moments: a completed checkout review, a search-results page, an error state, a consent decision, an account boundary, a report, or a recovery screen. Do not place an expensive model call after every click just because it is technically possible. One cross-artifact AI Check after the cart is visible can have more information value than ten model calls through intermediate loading states. Default qualitative findings to triage candidates or warnings; use a calibrated hard failure only where a policy defines the evidence, severity, and response.

This is the low-risk on-ramp. It gives a legacy suite much broader coverage without discarding the investment that already works.

Path two: convert procedures into AI-First Test Cases

Pause and practice

Turn legacy scripts into intents. Copy a sample Playwright or Selenium test and convert it to the OpenTest.ai intent format. Check that the original assertions survive.

Try this exercise.

Conversion is not translating Java Selenium into TypeScript Playwright line by line. It is recovering why the test exists, what must remain true, what must never happen, and how a future agent can prove the result safely. The output is an AI-First Test Case: portable intent, context, evidence requirements, and allowed authority—not a more elegant selector library.

The most reliable conversion is a three-phase process.

Phase 1: recover the hidden contract before guessing

An AI Test Harness first reads the test definition, nearby helpers, fixtures, page objects, environment configuration, and source context. It separates procedure—click this selector, wait 500 milliseconds, call this helper—from concept—an eligible customer can add one item and see the correct cart state without exposing account information or creating a duplicate action. Then it looks for the invisible assumptions that code often fails to state.

Ask the former test owner or a current domain expert short, ranked questions when the answer changes the meaning of the test. Is a password or token stored outside the repository? Is a seeded account required? Does the environment require a particular network route, feature flag, browser permission, locale, clock, mock, payment sandbox, or data reset? Is an old assertion documenting an actual requirement or merely compensating for a historical defect? The AI can infer many useful questions from the repository, but it should preserve unanswered assumptions as missing context rather than invent them.

Phase 2: observe the old test and reconstruct intent

Run the legacy test in an approved environment while the Harness records its interactions, visible states, API or network I/O, data transitions, deterministic assertions, screenshots, logs, and final outcome. Compare what the test does with what the source says it does. This is where the Harness drafts the portable intent record: actor and preconditions; goal; key state transitions; expected and forbidden outcomes; evidence requirements; safe data; cleanup; authority; and the decisions the result could change.

The record should be intentionally less procedural than the original script. “A signed-in customer can add an eligible item and see exactly one correct line item in the cart” will survive a selector rename, redesigned cart, or changed navigation flow far better than “click #add-123, then a.cart, then assert .count equals 1.” Fuzzy does not mean vague: preserve the product promise, boundaries, evidence, and forbidden outcomes; discard incidental mechanics that only existed to drive yesterday’s UI.

Phase 3: bake in the adaptive execution

Generate an adaptive execution from the recovered intent and run it repeatedly through an approved AI-native executor. The executor can choose fresh selectors, paths, waits, and recovery behavior, but it must preserve the declared evidence and explain the action it took. Compare its results with the legacy test over a bounded bake-in period. Repair the intent when the concept was incomplete, repair infrastructure when the environment was wrong, and preserve product defects as product defects rather than quietly teaching the new test to ignore them.

Only promote the converted case after repeated observed evidence supports it across the relevant states and environments. The lifecycle remains candidate -> observed -> repeatable -> trusted regression. If the AI Test cannot explain its goal, its evidence, a failed interaction, or the condition that would make it unsafe to retry, it stays a draft. Conversion is not validation.

Try it with CARBON: /carbon-tests convert the selected legacy checkout tests and bake them in on staging — Recover intent, retain provenance, and use repeated execution to separate candidates from dependable regressions.

Failure classification during bake-in

  • Test definition: clarify intent/setup/oracle and rerun within the repair budget.
  • Infrastructure: preserve runner, environment, auth, data, or availability blocker.
  • Product defect: preserve evidence; changing product code is a separate decision.
  • Unknown: keep uncertainty and leave the test in draft.

Choose conversion candidates by information value

Do not begin with the longest suite or the newest framework. Begin with a few tests that reveal the shape of the problem: one stable, business-critical flow; one brittle UI journey with a clear user intent; and one test whose setup or data contract crosses system boundaries. Those cases expose the things a conversion has to preserve—identity, state, timing, authorization, consequence, and proof—without creating a year-long migration program.

The conversion output should be more than prose. Keep a link to the original source, the recovered intent record, preconditions, controlled data, the actions the executor may take, required and forbidden outcomes, evidence requirements, the original deterministic assertions, the answers to the hidden-context questions, and a lifecycle status. A converted test stays a draft until an allowed executor has run it against the intended environment and the evidence has been reviewed. Translation is not validation.

Preserve useful deterministic code

Legacy code does not become worthless because an agent can drive a browser. A precise API assertion, a database invariant, a fixture builder, or a reliable payment sandbox is valuable infrastructure. The anti-pattern is forcing every test through an LLM or trying to preserve every selector forever. Keep the deterministic things that express truth well; wrap them in a harness that can supply better context, collect richer artifacts, and select them when their evidence is valuable.

Adopt AI without discarding the approved evidence

A team working under strict change control cannot replace its approved regression suite merely because a new agent produces a convincing report. That does not mean the team has to wait to use AI. Start alongside the existing process, with explicit authority and a reversible pilot.

Consider an illustrative payment application with Java/Selenium UI tests, batch reconciliation jobs, database checks, and a controlled release-signoff process. The harness can invoke those existing tools through approved adapters. It does not need to rewrite them first. Give it read-only access to approved specifications, sanitized results, and source where permitted. Let it explain failures and propose missing coverage before authorizing new execution or edits.

Pilot step Harness work Evidence and control retained
Inventory Map requirements to existing tests, dependencies, and gaps Baseline suite, versions, owners, and approved expectations
Shadow analysis Explain results and propose additional tests AI conclusions kept separate from approved verdicts
Bounded execution Run approved candidates in an isolated environment Accounts, data manifest, actions, traces, and cleanup
Parallel comparison Compare legacy and AI-first evidence on the same scenarios Disagreements, missed defects, false alarms, and review decisions
Controlled adoption Propose which cases to keep, augment, or replace Required review, change approval, rollback, and record retention

Prompt

Plan a read-only AI pilot around our approved Selenium and batch tests. Map the requirements, execution dependencies, and evidence we must retain. Propose one isolated parallel run. Do not edit tests, change expected results, send artifacts to unapproved services, or replace release gates. List the approvals and missing information first.

Suppose Selenium reports that a transfer completed, but the harness spots a mismatch in the reconciliation output. Preserve both observations. Investigate the ledger and transaction identity instead of allowing either the legacy pass or the AI suspicion to become the final verdict automatically. Conversely, if an agent changes an assertion just to make the run pass, that is a change requiring review, not maintenance to hide in a retry.

Keep traceability from requirement to test definition, execution, evidence, finding, repair, and approval. Version the model, prompt, adapter, and rubric used for consequential judgments. Record observations and decision rationale; private model reasoning is neither necessary nor a substitute for auditable evidence. Ask the responsible quality and compliance owners which records, retention, approvals, and tool-validation activities apply. This example is an adoption pattern, not a claim that an AI harness or its reports establish regulatory compliance. Chapters 18 and 24 describe the data and execution boundaries supporting it.

A conversion should be reversible

Store the source test and conversion rationale side by side. Let teams run the old and converted version in parallel for a bounded period, compare the behaviors each detects, and decide deliberately whether to retire, keep, or revise the legacy case. If the AI version cannot explain why it chose an action or what would count as a failure, it has not yet earned replacement authority.

Chapter 10 — The Shape of an AI-First Test Framework

An AI-first framework receives intent and figures out the mechanics. That sounds like a small change until you compare it with thousands of handcrafted instructions telling a browser exactly where to click. The framework is no longer the brain. It is an execution specialist working for the Harness.

But the executor is only one part of the story. Somebody still has to decide what to test, prepare the data, assign the work, notice when a worker stops, collect the evidence, challenge the findings, and decide whether there is enough information to stop. That is the harness. This chapter follows that work from beginning to end, then looks inside the execution layer. Chapter 17 goes deeper into the harness’s testing knowledge and system of record.

A prompt is a request. A workflow finishes the work.

“Test checkout” is a useful prompt. “Now look at accessibility” is another useful prompt. If I keep supplying the next instruction, remembering what happened, and deciding what comes next, I am still the workflow engine. The chatbot is helping, but it has not taken responsibility for the process.

A longer prompt does not automatically change that. It might describe twenty excellent steps. The agent might perform twelve, encounter a tool error, summarize its progress, and stop. Or it might lose the original success condition after several context handoffs. A convincing final paragraph does not tell us which steps actually ran.

A prompt can start a real workflow. The difference is what surrounds it: explicit work items, dependencies, an active runner, saved progress, evidence requirements, recovery rules, and a completion check. The harness must know what is finished, what is still waiting, and why. It should not need me to reconstruct the plan from a chat transcript.

One request at a time A managed testing workflow
The person remembers the next step The saved plan identifies eligible next steps
A tool error can end the conversation The error becomes a recorded retry, blocker, or escalation
A summary describes what the agent thinks it did Each result points to the evidence and work item behind it
A new session may repeat the investigation A continuation reads the checkpoint and validates its context
“Done” can mean the agent stopped talking Completion is checked against the declared scope and stop rules

That last distinction matters. A completed investigation can report a failed test or a blocked release. Conversely, an agent can produce a beautiful report while half the investigation remains unfinished. Workflow completion and product quality are different judgments.

The core workflow: understand, test, challenge, continue

The everyday harness workflow is not exotic. It resembles what a good test lead does, except that the coordination and much of the execution can now happen inside the coding agent.

Figure 10.1. The core harness workflow. The return path gathers more evidence; it does not quietly weaken the test until it passes.

First, establish the target, change, customer goal, permissions, and budget. Then choose the risks worth investigating and the evidence that would answer each question. Prepare the necessary environment and synthetic data. Run suitable tests through appropriate executors and specialists. Review the results, challenge important claims, and decide what to do next.

The next action may be another experiment, a question for a person, an approved repair followed by a retest, or a report saying the remaining uncertainty is outside the available budget. Every route retains the earlier evidence. The harness is not trying to maximize the number of green boxes. It is trying to finish a useful investigation without losing the truth along the way.

For TestBucks, “check the new checkout” should expand into concrete questions. Did the oat-milk selection survive into the order? Did a timeout create an uncertain payment state? Can a keyboard user complete the purchase? Did a receipt expose another customer’s information? Each question implies different observations. A screenshot of the final receipt cannot answer all four.

Sequences, parallel work, and the point where results meet

Some tasks depend on other tasks. You cannot meaningfully verify a refund before the test order exists. You cannot compare a repaired build with the failing build if the failing evidence has been discarded. Other tasks can run at the same time, provided they do not fight over the same account, cart, device, or environment.

Figure 10.2. An illustrative TestBucks workflow: shared setup first, isolated branches in parallel, then an evidence review that accounts for every branch.

In this example, the harness first pins the build and prepares synthetic accounts, payment fixtures, and an approved scope. It then starts three branches: checkout and order-state verification; accessibility and customer-journey checks; and privacy checks across the receipt, network, and storage evidence. Each branch has its own workspace or isolated state where needed.

The arrows mean dependencies, not decoration. A branch becomes eligible only when its prerequisites are satisfied. The join means the harness accounts for every required branch before making the combined recommendation. If privacy testing is blocked by missing access, the join must not silently turn two completed branches into “checkout passed.” It records the missing evidence and applies the release rule for that risk.

Parallel does not mean independent. Two specialists looking at the same incomplete evidence can share the same blind spot. Two browser workers using the same cart can corrupt each other’s experiment. The harness needs resource ownership as well as task order: separate accounts or fixtures, locks around shared resources, and serialized steps when isolation is unavailable.

Nor does every test need a model. Totals, schema validation, and order-count assertions may be ordinary code. An accessibility rule engine can supply deterministic observations. An AI specialist can investigate the context and gaps. The workflow joins those results without pretending that one kind of tool replaces all the others.

Hours or days require a runner, not a heroic prompt

Long-running work exposes a problem that a short demo can hide: agents stop. A tool times out. A session ends. The machine sleeps. Credentials expire. A provider rate limit arrives. The agent decides its partial answer is enough. None of these events means that the requested investigation was completed.

A durable harness makes the work recoverable. Its checkpoint records the plan, build and environment, completed and pending work, evidence locations, attempts, budget consumed, and the next safe action. The active runner drives that state forward. If the work must survive a host restart, the deployment also needs a process supervisor or job runner capable of restarting it and reconnecting it to the saved record. Saving a file is necessary; it does not keep a process alive.

Figure 10.3. Interruption is not completion. A checkpoint lets an authorized runner resume unfinished work after checking that the target and permissions still match.

CARBON’s documented continuing workflows include durable checkpoints and stop controls, but the host agent must remain active; the report viewer is not an autonomous worker. Treat an hours- or days-long investigation as an operating arrangement, not a promise made by a slash command. It needs an available runner, sufficient model and tool access, approved time and spending limits, and a clear owner. When those conditions are absent, report paused or blocked work honestly. The CARBON command reference describes the continuing workflows and their execution boundaries.

Here is what I want to see in that long-running record:

  • Work state: Planned, running, waiting, blocked, completed, or canceled, with a reason and timestamp. Keep this separate from a test’s pass, fail, or unknown result.
  • A completion contract: Which required steps and evidence must exist, which gaps may be deferred, and who can accept that deferral.
  • Progress and liveness: A heartbeat or lease shows whether a worker still exists; completed work and new evidence show whether it is making useful progress. A busy loop is not progress.
  • Bounded recovery: Retry counts, backoff, timeouts, and escalation rules. Preserve the original error and every consequential attempt.
  • Safe resumption: Check the build, fixtures, credentials, and authority before continuing. Invalidate stale evidence when the system changed.
  • Side-effect protection: Before retrying a purchase or refund, reconcile what already happened. Use operation IDs and idempotency controls where supported; do not assume a lost response means nothing occurred.
  • Budget and stop controls: A person can pause or cancel. A hard limit or revoked permission stops new work. Cleanup and reporting explain anything left behind.

Suppose an overnight TestBucks run loses its browser after submitting a sandbox order. On resumption, “click Pay again” is not a recovery strategy. The runner checks the order and payment records using the saved operation identity. It either continues from the observed state or records that the outcome cannot be established. Only then does it decide whether another submission is safe.

The same discipline applies when a sub-agent quits. Its assigned work returns to a visible unfinished state; it does not become a pass. A replacement receives a bounded brief and the existing evidence, not just “keep going.” This is how a harness can support extended work without treating persistence as permission to act forever.

A team of specialist sub-agents, not one giant prompt

Jay is CARBON’s AI test manager. The specialist roles below are the same CARBON roles used elsewhere in this book. They provide focused instructions, tools, and evidence needs. They are software roles, not human reviewers, and the grid is a capability map rather than proof that every specialist ran.

Figure 10.4. CARBON specialist roles for access, interaction, performance, content, and data. Assign the roles that answer the current risk questions.
Figure 10.5. CARBON specialist roles for discovery, commerce, privacy, policy, and AI behavior. Their findings return to the same evidence record.

A useful assignment says: here is the risk, here is the target and permitted data, here is what you may do, here is the evidence you must return, and here is when to stop. “Be a security expert” is not enough. The privacy specialist may need a consent-state trace and requests. The accessibility specialist may need keyboard interaction and the accessibility tree. The performance specialist needs measurements, not an opinion about how fast a screenshot looks.

The manager then reconciles the findings. A checkout specialist may report that the order completed while the privacy specialist reports that the receipt contained another account’s address. Both observations can be true. The privacy failure is not outvoted by successful checkout, attractive layout, and fast response time.

Use concurrency where the host supports it and the work is isolated. Otherwise, run the same focused briefs sequentially. Giving twenty-four roles the same model does not create twenty-four independent sources of truth. For consequential findings, use different evidence, deterministic checks, a separate challenge pass, or human review where it adds value.

The harness contains workflows, not just checks

The core loop is one workflow. The same machinery supports several others. The following are workflow patterns, with CARBON entry points where applicable; they are not a claim that every edition includes every capability.

Workflow What happens after the initial request
Risk-based assessment Inspect the change, rank risks, select checks, execute, challenge findings, and report gaps. Start with /carbon.
Focused investigation Reproduce one behavior, vary relevant conditions, and gather decisive evidence. Start with /carbon-test.
Stateful bug discovery Explore meaningful multi-step journeys, preserve candidate failures, and confirm supported findings. Start with /carbon-issues.
Continue the investigation Resume the next useful deferred checks using the saved record. Use /carbon-more where available.
Authorized test-fix-retest Establish the failure, propose or make permitted changes, rerun the original case, and check adjacent behavior. Use /carbon-auto where available.
Extended discovery Keep looking for new risks and evidence until stopped or limited. /carbon-forever requires explicit confirmations and is not automatic permission to fix source.
Persona exploration Generate relevant goals and constraints, try approved journeys, and separate observed friction from simulated preferences. Use /carbon-personas.
Test creation and migration Recover intent, generate candidates, review them, exercise them, and promote only evidence-backed tests. Use /carbon-generate and /carbon-tests.
Confidence and release review Identify consequential uncertainty, request missing evidence, challenge conclusions, and recommend a next decision. Use the confidence and release workflows.

These routes should share the same evidence and safety machinery. Otherwise, a “privacy run” and a “checkout run” become separate islands that cannot tell whether they observed the same product state. Appendix G supplies the fuller command reference; the Testers.ai homepage and CARBON documentation identify the current product offerings. Names, editions, and host capabilities change. The architectural distinction does not: requesting a workflow is different from manually driving each of its steps.

What else belongs in the harness?

The orchestration layer needs practical tools. Here is the capability inventory I would expect a team to evaluate, rather than assuming that a browser connection is the whole product. CARBON provides a concrete reference for much of this work; actual execution still depends on the installed edition, approved adapters, available environment, and permissions.

Persona generation and journey design. Create customers with relevant goals, constraints, languages, abilities, and levels of familiarity. Use those perspectives to select real journeys. Synthetic personas help find questions; they do not replace evidence from actual people.

Test-data generation and fixtures. Produce valid, invalid, boundary, conflicting, and stateful data; construct accounts and relationships; seed repeatable starting conditions; and clean up afterward. For TestBucks, this can include carts, modifiers, expired promotions, duplicate requests, and synthetic customer records. Keep data provenance and expected outcomes attached. Do not invent a production customer’s identity to make a demo more convincing.

Interactive browser and device control. Click, type, scroll, navigate, inspect focus, and wait for observable state through approved tools. On mobile, distinguish a narrow browser viewport from an emulator, simulator, or physical device. Native permissions, keyboards, app lifecycle, and device sensors need a suitable adapter. An unavailable device is a coverage gap, not an invitation to label a desktop screenshot “mobile tested.”

Instrumentation and observation. Capture console logs, requests and responses, DOM and accessibility state, screenshots, traces, timings, application events, and relevant backend records. Correlate them by run and operation. Redact secrets and personal data before passing artifacts onward. Instrumentation is how the harness connects “the button looked fine” with “the saved order was wrong.”

Reusable testing knowledge. Apply widget recipes, boundary cases, common workflows, risk patterns, standards, and product-specific rules. Version the knowledge and its scope. A known checkout failure should influence tomorrow’s tests without turning one product’s workaround into a universal rule.

Oracles and challenge. Combine assertions, business rules, reference data, model-assisted judgments, and human decisions. Ask a separate review pass to look for unsupported claims or missing evidence. Self-checking is useful, but shared context and shared models can still produce shared mistakes.

Failure experiments and recovery. In isolated, authorized environments, introduce timeouts, unavailable dependencies, malformed data, and partial failures. Verify cleanup and recovery as well as the visible error. Source changes, fault injection, traffic generation, and remote execution each need their own authority boundary.

Evidence, feedback, and retained learning. Preserve test definitions, attempts, failures, accepted and rejected findings, review decisions, and verified repairs. Generate human-readable reports and structured records from that history. An accepted finding is not a verified fix, and an exported report is not a new test run.

Integration and economics. Connect existing frameworks, APIs, issue systems, CI jobs, and approved cloud workers. Record time, tokens, execution cost, and useful outcomes. Integration should preserve external ownership and approval rules rather than silently writing into another team’s system.

Together, these capabilities turn a model’s suggestions into an operating testing process. A collection of prompts can describe every item in the list. The harness has to make the supported items happen, retain the evidence, and expose the unsupported ones.

Read the completion record before the congratulations

Imagine the TestBucks workflow reached the end of its time budget. Checkout was verified in the payment sandbox. Keyboard operation failed and has a reproducible trace. Privacy testing could not inspect the required backend record. A load experiment was explicitly outside scope.

The useful conclusion is not “mostly passed.” It is: checkout evidence is available; the accessibility failure remains open; privacy is blocked; load behavior is untested; here is the next action and owner for each. The report can be complete as a bounded investigation while the release remains blocked. If the contract required every branch to finish, the workflow itself remains incomplete until those conditions are met or an authorized person changes its scope.

That is what separates a harness from a cheerful assistant. It remembers the unfinished work even when we would rather hear that everything is fine.

Walk through the basic execution loop

  1. Receive intent, setup, oracle, evidence, and safety—not a hard-coded click list.
  2. Resolve the current page and choose the next action from visible state.
  3. Click, type, scroll, navigate, or wait within limits.
  4. Observe screenshots and structured browser state.
  5. Recover from harmless UI drift without silently changing the product promise.
  6. Stop at success, failure, blocker, uncertainty, or resource limit.
  7. Return reproducible evidence to the harness.

Compare executor types

Executor class Strength Trade-Off Evidence needed before claiming superiority
Clicky-style specialized executor Focused, low-overhead intent execution Narrower context or capability surface Same tasks, environments, retries, and oracles
Playwright/Selenium generated by agent Mature deterministic control and ecosystem Generated glue and maintenance Observed runtime, flake rate, repair rate
browser-use-style agent Flexible visual/semantic navigation More model calls and variable behavior Tokens, latency, completion, false actions
Coding-agent native browser Project context, source-aware diagnosis, direct repair loop May be slower/costlier for rote steps Full-loop time and cost, not clicks alone
Browser-native agent interface Potentially low-friction page control Evolving capability and portability Versioned compatibility matrix

Specialization wins a lot of rote execution. I have watched the difference become large enough—an order-of-magnitude kind of difference in cost, speed, or reliability—to change what testing is practical at all. The exact number moves with the target, executor, model, environment, retry behavior, and evidence requirements. The direction does not.

The Testers.ai reference executor is built for testing work

The Clicky-style execution layer built in the Testers.ai reference implementation exists because test execution is not the same job as a general coding agent trying to operate a browser. In our testing scenarios, this specialized executor has been far more reliable for the specific work of carrying out declared test intents, collecting the right evidence, classifying execution trouble, and returning a test result. It has also used substantially fewer tokens and completed the work faster than the coding-agent browser paths available through built-in tools or MCP-style integrations.

That is an implementation observation, not a universal benchmark. The exact comparison depends on the task, target, model, tool version, retry policy, parallelism, evidence requirements, and what counts as success. A team should run the same test intent through the available executors, under the same conditions, and measure completion, false actions, evidence quality, recovery behavior, latency, token use, and total cost. The Harness should be able to switch executors when that evidence says another choice is better.

Still, the direction is obvious. Early computer-use agents frequently placed a great deal of their execution planning inside model tokens: inspect the page, reason about the next click, inspect again, reason again, and repeat. That made some of them brutally slow and expensive for rote testing work, even when their general intelligence was impressive. A test-focused executor moves stable mechanics into code and uses model reasoning where it changes the outcome: interpreting intent, choosing a path through meaningful drift, diagnosing a failure, preserving the evidence, and deciding what deserves another experiment. General coding-agent control remains exceptionally valuable for source-aware diagnosis and repair. For repeated test execution, a purpose-built testing executor is usually the better fit.

A retry is not a result

A competent executor treats every action as an experiment. It captures the starting state, chooses a safe action, observes the visible and system consequence, decides whether the evidence is sufficient, and records why it stopped. That makes it different from a macro recorder with a model bolted onto the front.

Executor contracts make tool choice honest

Every executor should declare its capabilities before the planner assigns work: supported platforms, authentication and session model, network visibility, file and device access, viewport control, parallelism, cost, destructive-action policy, evidence it can capture, and known blind spots. Selenium, Playwright, a browser-use agent, a mobile driver, and an accessibility API can all be useful adapters. None should claim capabilities it does not have.

The plan then chooses the cheapest safe executor that can obtain the needed evidence. A deterministic browser framework may own login and checkout assertions while a visual agent judges reflow. A device cloud may verify physical behavior that a desktop browser cannot. A source-aware agent may diagnose a selector failure, but a separate runtime executor must still prove the repaired behavior. Adapter choice is engineering, not tribal identity.

Retry with a hypothesis

Blind retries launder uncertainty into pass rates. A retry needs a stated hypothesis: transient service failure, known eventual consistency, expected animation, isolated environment reset, or a suspected product race. Preserve every attempt and classify stability separately from functional correctness. Repeated success after a flaky failure is evidence about reliability; it is not proof that the first failure did not matter.

AI adaptation can reduce failures caused by harmless UI drift, but it can also hide genuine intermittency by trying a different path until something works. Treat reproducibility as evidence:

  • Capture random seed, clock, timezone, locale, order, worker, model/version, prompt, executor, build, configuration, feature flags, identity, data snapshot, network conditions, and dependency versions;
  • Distinguish product intermittency, test-definition instability, executor/model variance, environment noise, shared-state contamination, and oracle/judge disagreement;
  • Replay the same contract in the same conditions, then vary one suspected factor at a time;
  • Preserve every attempt and first-failure evidence instead of replacing the run with the final successful retry;
  • Permit bounded retries only to classify instability, never to turn red into green silently;
  • Quarantine only with an owner, reason, evidence, scope, expiry, and continued visibility in confidence;
  • Promote a case to trusted regression status only after it demonstrates acceptable repeatability across its declared operating envelope.

Report a distribution or stability band where behavior is probabilistic. For deterministic software, repeated disagreement is itself a defect or evidence-system problem. The harness should say “passed once after two incompatible failures,” not “passed.”

Self-recovery must preserve execution truth

The valuable form of AI recovery is not “try random alternatives until the dashboard turns green.” It is an observed, bounded diagnosis. Imagine an agent sending a cross-device message to an iOS client. The send action fires before the first character has registered. The agent sees the incomplete input, records the failed attempt, forms a timing hypothesis, slows the interaction, sends the message again, and verifies the outcome on both clients. It may retain a platform-specific pacing constraint for later runs, with a scope and expiry rather than pretending it learned a universal law.

That is more than selector repair. The system has recognized an end-to-end execution failure, changed a mechanical tactic without changing the test’s intent, and made the result explainable. A human should be able to see the original evidence, the hypothesis, the adjusted action, the final outcome, and the reason the learned constraint will be reused.

Post-processing must make a second, separate judgment: did the executor have trouble, and did the product fail the promised behavior? A timing event may be real execution evidence while both Android and iOS clients still receive the same message. For a narrowly scoped message-delivery test, the product outcome may be correct even though the execution environment warrants a reliability note. Preserve both facts. Do not file a user-facing defect merely because the executor stumbled, and do not erase the stumble because a later attempt succeeded. This distinction is how AI reduces flaky-test triage without laundering uncertainty into a pass.

Chapter 11 — Self-Healing Is Backwards: Fix the Testability Boundary

Traditional self-healing tries to preserve the old script by guessing a replacement selector. AI-native testing preserves intent, re-observes the current product, and chooses a valid action. Healing must never relax the oracle, skip a security check, invent missing data, convert a blocker into a pass, or conceal a behavioral change.

The better unit of maintenance is the testing system: update the risk map, intent, evidence requirements, adapters, and regression set together.

The source-aware harness can improve the product’s testability

When the harness lives in the coding agent, it can see why an interaction is unstable. It can:

  • Prefer a real role, label, accessible name, API contract, or domain identifier;
  • Add an approved stable data-testid where no user-facing semantic contract is sufficient;
  • Expose state through observable, non-sensitive status and error contracts;
  • Factor a tangled component or dependency seam into something testable;
  • Add deterministic clocks, seeds, fixtures, health signals, and safe fault controls;
  • Update affected tests and documentation beside the code.

This is deeper than generated test cleanup. It improves the testability boundary of the product itself. Product-source changes remain code changes: reproduce first, keep the diff minimal, preserve accessibility and behavior, review the new contract, and run targeted plus broader regression checks.

Jason story

JASON STORY — A SELENIUM SELECTOR BECAME A TESTABILITY UPGRADE

I was trying the Harness with good old Java and Selenium. I told it to test a product and run the resulting tests repeatedly. It wrote the tests, ran them, and hit a familiar problem: a selector was wrong. Great. Normally, somebody digs back into the DOM, fixes the selector, and hopes the next UI change doesn’t break it again.

But the Harness noticed something else. The important controls didn’t have stable data IDs. It could patch the selector, or it could make the app easier to test by adding those IDs to the buttons and widgets. It only had read access, so it asked me first. I told it to go ahead.

Then it added the IDs, updated the affected Selenium tests, and ran them again. It also kept checking that the page still worked. This is the sort of thing we always say teams should do. But usually it means interrupting a developer and asking them to squeeze in one more task. I have felt guilty asking for exactly this. David—he will know who he is—had more valuable work waiting. This time, the Harness could make the change itself once I gave it permission.

The whole sequence took a couple of minutes. That was another shocking moment for me. It had not just patched a selector. It had asked permission, made the app easier to test, updated the tests, and run them again. The next test could use those same IDs. That is work I used to feel guilty asking a developer to stop and do.

Jason story

JASON STORY — VIBIUM CHANGED, THE HARNESS KEPT TESTING

I gave the AI Test Harness I was building a simple request: use Vibium to do a quick test pass on a test website. It looked at the site, planned the work, and installed Vibium through npm/npx. About six tests started in parallel. Two passed. The rest didn’t give us a useful answer. Some didn’t finish; others tried to call functions that weren’t there.

My first thought was: great, now I have to figure out which function names changed. Is the framework broken, or is the product broken? Before I had worked through that, the Harness had looked up the current Vibium API and read the installed source. The API had changed. I don’t know whether the old calls came from stale documentation or something the model remembered. But it found the mismatch, fixed the calls, reran the tests, and saved what it had learned. It didn’t file a product bug for its own mistake.

One timeout was more interesting. Run the test alone and it worked. Run it with the others and it failed again. The Harness kept trying it both ways and looked at the product code, the test, and how the tests were running. It pointed to resource contention during parallel execution. I don’t remember which layer ultimately owned the timeout. What mattered was that it showed the difference between the two runs and treated the timeout as a likely execution problem, not a confirmed product bug.

That was the magic moment. It fixed how it was using the framework. It tried the troublesome test alone and then alongside the others. It told me what it knew and what it still could not pin down. All in a few minutes and, for that run, pennies of model cost. This was far beyond selector healing. It was doing what I would want a very good test automation engineer to do, without turning every timeout into a bogus product bug.

TestBucks example: Make the failure explain itself

“Something went wrong” leaves both a person and an agent guessing. The diagnostics teaching variant lets you switch from that vague message to a controlled timeout fixture with an error code, correlation ID, order count, and charge count.

Before → after: two captured diagnostic states from the isolated teaching variant. Captured from the isolated diagnostics teaching variant. Expose enough to diagnose and verify recovery without leaking private data.

Figure 11.1a. Turn a vague failure into a useful observation.
Figure 11.1b. Turn a vague failure into a useful observation.
Figure 11.1c. Turn a vague failure into a useful observation.

Prompt

In an isolated TestBucks copy, add stable data-test IDs to checkout controls, accessible names, a controllable timeout fixture, and diagnostics that correlate the request with order and payment state. Keep private data out of the user-facing error. Show how a test can verify recovery.

The useful change is not merely another selector. Now a test can distinguish rejection before acceptance from a response lost after acceptance. The visible diagnostic panel is for the lab; production may expose that evidence through protected logs or a test-only interface instead.

A testability change needs its own review

Pause and practice

Make the app more testable. Copy the TestBucks HTML and ask for stable data IDs, useful diagnostics, and controllable synthetic test data. Review the changes.

Try this exercise.

The useful record should outlive the successful rerun. Preserve the original false alarm, the evidence that separated a selector problem from a product problem, the approved testability change, and the repeated results. That history explains why later confidence is stronger. It also helps the next agent avoid rediscovering the same failure mode. A fixed selector is useful; a better testing contract with a remembered explanation is much more useful.

An agent that can edit source code has crossed a meaningful authority boundary. Its proposed change should state the failed interaction, the selected contract, why an existing semantic locator is insufficient, the smallest source diff, and the tests that will prove the application behavior did not change. Test IDs must not leak sensitive state or become a back door for privileged actions. Debug endpoints, fault switches, and test-only data need tighter controls still.

The durable rule is simple: improve observability and control without creating a second product. A user-facing accessible name is generally better than a private selector because it serves both people and automation. A stable domain identifier is better than a DOM path because it survives layout work. A test-only hook is appropriate when the product has no reliable public contract, but it should be named, documented, reviewed, and removed only with its dependent tests updated.

Try it with CARBON: /carbon-tests repair the failing checkout test without weakening its assertions; ask before changing product code — Repair the execution contract while preserving the original failure and the test’s meaning.

Repair intent, not appearances

Illustrative TestBucks repair. Repairing an unsafe pickup-note renderer in a staff-dashboard extension means replacing string-built HTML with safe DOM construction or equivalent output encoding, then rerunning the exact synthetic pickup note and adjacent ordinary pickup notes. Repairing the drink-card accessibility issue means giving the control native interactive semantics or complete keyboard behavior, then rerunning the preserved focus journey. Repairing the mobile layout means changing the responsive contract and checking more than the single 390-pixel screenshot. In every case, the source edit is only the middle of the story; before-and-after runtime evidence closes it.

When a click starts landing on a different control, an old self-healing system may celebrate because the script kept moving. An AI-native harness has to ask whether the intended goal and the resulting product state are still the same. The repair record should show the old evidence, new evidence, action rationale, source diff if any, and oracle result. If any of those are missing, classify the result as blocked or uncertain—not healed.

Chapter 12 — Test the Failures We Avoid: Mocks, Faults, Load, and Legacy Layers

Jason story

JASON STORY — THE RETRIES WERE THERE. THAT WAS THE PROBLEM.

One of the things I loved about the engineering approach at Google was the ambition to run a useful version of the whole stack on one machine. The idea was that you should be able to work on something like search on a laptop, offline, on an airplane. You did not bring the entire internet index onto the plane. You brought a small slice of data and substituted controlled versions of the things the system depended on. Mocks made the enormous system small enough to work with.

That was powerful. It was also a lot of work. Somebody had to build and maintain all those mocks. Most teams never get around to it. They are busy shipping features, and setting up a miniature version of the whole system doesn’t make it to the top of the list. So they keep testing against the live system or some complicated shared environment.

Then they cannot safely break anything. And the failures they cannot arrange in testing are waiting for them in production.

I have seen serious outages caused by what sounded like tiny details in retry behavior. I will leave the employers out of this. In one case, the system had retries but not the exponential backoff it needed. Another version of the problem was more interesting: the retries backed off, but they did it together.

Imagine a data center full of services trying to start. They all make requests. The dependencies become overloaded, calls time out, and the callers wait before trying again. So far, somebody can point at the code and say, “Look, we have backoff.”

But the callers are following the same timing pattern. They wait together. They retry together. They overwhelm the dependency together. Then they wait longer and do it all again.

You get an expensive collection of machines sitting mostly quiet between synchronized bursts of requests. The gaps get longer, but the system never gets a useful chance to recover and finish starting. Backoff without enough independent jitter can turn the recovery mechanism into the thing that keeps the outage going.

These are horrible failures to diagnose under production pressure. The retry code exists. Each piece can look reasonable on its own. The failure is in how the pieces behave together when something goes wrong. Controlled faults and models of that interaction let you investigate it before customers are waiting on a broken system.

This is one of the breakthroughs I find most exciting about AI testing: the agent can code. Not just test code. It can build the tools, create a mock dependency, add an interception point, or modify an isolated copy of the product so we can provoke the failure we need to understand.

Most testing tools were built with resources nowhere near those invested in frontier models and coding agents. Now we can apply that coding capability to the testing work we used to avoid. The agent brings both testing knowledge and the ability to construct the experiment.

Take an LLM dependency. In a disposable copy of the repository, ask the agent to inject network timeouts, delayed responses, rate limits, or interrupted streams. It can implement the fault in the copy or a mock service, drive the application into the affected path, collect what happened, and investigate whether recovery worked. Ask it to compare synchronized retries with independently jittered retries. Now you are testing the failure behavior, not merely checking whether a retry function exists.

Fault injection is not new. James Whittaker was exploring powerful ways to expose software failures long before this generation of AI. What is new is how little machinery the tester may have to build by hand. The same agent can understand the implementation, construct the controlled failure, run the experiment, and analyze the result.

Those bugs were always there. We just couldn’t afford to build all the machinery to go looking for them. Now we can ask the AI to build it and run the experiment. That is pretty amazing.

The expensive failures are usually the tests everybody agreed were important and nobody had time to build. A dependency slows instead of failing cleanly. A retry duplicates a charge. The clock crosses midnight. A partial write leaves two systems disagreeing. The disk fills up. The quota expires. The queue backs up. Then all of this arrives under real traffic while an exhausted on-call team debugs the system in public.

Most test teams know this work matters. They often do not have the time, budget, environments, instrumentation, code access, distributed-systems experience, or operational authority to build and interpret it. Fault injection, service virtualization, network interception, clock control, corrupted-data experiments, quota exhaustion, permission changes, and partial-write analysis have traditionally been specialist work. It is easy to defer them until the incident that proves they were not optional. Then the organization pays in real-time production debugging, customer harm, interrupted launches, long recovery calls, and emergency patches made under pressure.

AI changes that equation. A Harness can read the architecture, traces, logs, mocks, failure history, and source; invent the right failures; build the bounded experiment; generate setup and cleanup; run the safe cases; correlate the mess; and explain which result matters. It can do in minutes work that used to require scarce specialists and a small infrastructure project. You still define authority, blast radius, synthetic data, abort conditions, and evidence. You lose the old excuse: “we do not have enough people or time to test this.”

TestBucks lab. Select the simulated timeout at checkout. Verify that the cart remains, no order is created, and the page offers a retry. Then select success and verify one practice order. A service-backed extension can inject delayed acknowledgments and reconcile an idempotency key against a synthetic ledger; the browser-only app cannot prove real-provider behavior.

The Harness should cover mocks, stubs, service virtualization, network interception, clock control, corrupted fixtures, quota exhaustion, permission changes, and partial writes. It must also test the mock itself and distinguish simulated evidence from production behavior. A passing mock proves only that the modeled world behaved as modeled; it does not prove that the complete system will behave that way outside the lab.

What changed: useful methods we can finally afford

AI did not invent fault injection, model-based testing, or simulation. Some approaches disappointed because their models were wrong. Others worked beautifully but required a specialist, a custom environment, and months of maintenance. Those are different problems. Cheaper execution helps the second one; it does not automatically solve the first.

The opportunity is to revisit the work we stopped doing. Ask what made it impractical, whether an agent can now remove that obstacle, and what evidence would show that the method actually helps.

Method What made it difficult What AI changes What still has to be proved
Model-based exploration Building and maintaining a useful state model Drafts the model from source and observed journeys; proposes missing transitions The model reflects the product rather than repeating its assumptions
Fault injection Wiring faults, cleanup, and cross-service diagnosis Builds bounded experiments and correlates their effects The fault is realistic, safely isolated, and actually activated
Metamorphic testing Finding meaningful relationships without a single expected output Proposes transformations and checks what should remain true The relationship is a valid product obligation
Persona and journey simulation Authoring varied goals, histories, and interactions Generates and exercises many conditional journeys Synthetic behavior does not establish real-user prevalence
Testing the tests Creating defects and investigating missed detections Seeds representative failures and challenges the observer and verdict The seed set is useful, not a collection of easy wins

For the coffee-ordering app, an old timeout test might simply stop the payment service and expect an error. A more revealing experiment allows the payment to commit, then drops the response. Does the customer retry? Does that create another charge? An agent can inspect the integration, find an appropriate interception point, create synthetic orders, record the sequence, and restore the environment. Chapter 6 shows the fault-injection mechanics; Chapter 21 follows the confidence question.

Prompt

What important testing have we avoided because it was too expensive or hard to set up? Use this project’s architecture and incident history. Pick one experiment we can now run safely in a disposable environment. Explain the old obstacle, how you will remove it, what result would matter, and how you will verify the experiment itself worked. Propose the plan before running it.

Keep the before-and-after comparison concrete: setup effort, maintenance, useful findings, false alarms, and evidence quality. Generating a thousand scenarios is not the achievement if none can distinguish a working product from a broken one. Chapter 14 develops persona exploration, Chapter 25 tests the harness itself, and Chapter 32 extends these ideas into simulations that must be checked against reality.

Try it with CARBON: /failure — Explore failure and recovery safely in a disposable copy.

TestBucks example: The payment succeeded, but the response vanished

The normal practice app has a timeout that creates no order. The isolated recovery variant exercises the harder case: its mock ledger accepts the order and simulated charge, then loses the response. The customer sees uncertainty, not permission to charge again.

Lost response → safe retry. The captured teaching fixture returns the existing order and retains exactly one simulated charge. Captured from the isolated mock-ledger teaching variant. The oracle is the ledger, not the number of clicks or the absence of an error message.

Figure 12.1a. Timeout does not mean nothing happened.
Figure 12.1b. Timeout does not mean nothing happened.
Figure 12.1c. Timeout does not mean nothing happened.

Prompt

Use the isolated recovery variant. Submit the latte order, inspect the mock ledger after the timeout, and retry with the same request key. Verify exactly one order and one charge for $6.60. Do not use a live payment service.

The result depends on reusing the identity of the operation. Retrying a new purchase would be a different test. For a production implementation, extend this small case to simultaneous retries, process restarts, and delayed callbacks; an in-memory teaching ledger does not establish those properties.

Load and time are product behavior

Pause and practice

Inject a payment timeout. Use an isolated practice replica and mock payments. Inject a fault, trigger it through the UI, and check recovery without duplicate simulated charges.

Try this exercise.

AI is useful for deriving workload models from architecture, traces, business events, and limits; generating coordinated scenarios; correlating cross-service evidence; and explaining anomalous tails. It does not make an unrepresentative benchmark representative.

Experiment Question it answers Evidence to preserve
Baseline and load Does the system meet declared throughput and latency under a representative mix? Workload distribution, warmup, environment, p50/p95/p99, errors, saturation, business outcomes
Spike and burst What happens when demand or event volume changes abruptly? Queue depth, shedding, autoscaling, timeout propagation, recovery time
Soak What degrades with time? Memory, handles, storage, cache behavior, drift, error accumulation, resource slope
Concurrency and race Which interleavings violate invariants? Seeds, schedules, locks, duplicates, lost updates, final state, replay data
Backpressure and queueing Does overload remain bounded and visible? Producer/consumer rates, backlog age, retry storms, dead letters, admission control
Eventual consistency Does the system converge within the promised window? State timeline across replicas/services and explicit convergence oracle
Dependency degradation Does partial slowness cascade? Distributed traces, circuit state, fallback correctness, resource use, recovery
Failover and recovery Does service return without corruption or duplicate effects? Trigger, leadership/state transitions, RTO/RPO evidence, reconciliation and rollback

Define the population, traffic mix, data shape, topology, warmup, duration, comparison design, and practical service-level threshold before the run. Compare paired builds where possible, report uncertainty, and treat statistically significant but operationally irrelevant changes differently from small tail regressions that violate a customer promise. Never use average latency to hide p99 pain.

Fault injection and chaos work require blast-radius controls, observability, abort conditions, steady-state hypotheses, cleanup, and explicit authority. A model-generated chaos idea is a candidate, not permission to execute it against production.


Try it with CARBON: /carbon-load — Plan and run an explicitly approved, bounded workload with declared safety limits.

The Legacy Testing Stack Is Now a Compatibility Layer

Be deliberately assertive. If a team is still designing its quality workflow around hand-authored Selenium or Playwright code, JIRA handoffs, selector maintenance, fixed dashboards, and manual test-selection meetings, it is spending most of its energy translating intent into machinery that AI can now generate, operate, adapt, and explain.

The legacy assets are not worthless. Treat them as compatibility layers:

  • Run reliable deterministic suites where they already provide fast evidence;
  • Add AI Checks at high-value evidence gaps;
  • Recover intent from procedural cases and convert incrementally;
  • Use JIRA, Xray, and TestRail for required ownership, governance, or external synchronization—not as the harness’s brain;
  • Generate framework code when a consumer still requires it, but preserve the portable intent above it;
  • Stop investing in custom selector-healing, rigid result dashboards, and glue that the coding agent can regenerate from durable contracts.

This is frequently an order-of-magnitude workflow difference. That is not false precision; it is the useful rough measure of a change whose exact value necessarily varies by product, company, talent, risk tolerance, environment, and evidence standard. The point is not that every activity is exactly “10x faster.” The point is that AI-first quality work can move work from a monthly human cycle to every build, from a narrow sample to broad coverage, or from an incident response to a preventative run. Corroborate the claim with representative comparisons that include equivalent scope, evidence quality, retries, maintenance, triage, and review. Do not let a desire for a single universal multiplier hide the scale of the transformation.

Anti-pattern checklist

  • Asking AI to write more brittle test code without changing the operating model;
  • Putting an LLM call inside an old framework and calling it AI-native;
  • Sending selectors and step-by-step remote-control instructions across the network;
  • Copying every finding into JIRA before reproduction or dedupe;
  • Treating framework pass counts as release confidence;
  • Building another fixed dashboard instead of generating views from durable evidence;
  • Using “self-healing” to conceal a changed product contract;
  • Selecting a tiny regression subset from file proximity alone and pretending distant coupling does not exist.

Part III - Improve Test Thinking

Use source code, business context, risk, boundaries, personas, and judges to ask better questions. Decide what deserves testing and what the resulting evidence actually supports.

Chapter 13 — The White-Box Tester We Always Wanted: Risk, Boundaries, and Black-Box Proof

Source-informed testing icon

Source-informed testing

Carbon’s AI-generated-code icon marks the code-review lens: inspect assumptions and dependencies, then test the behavior against the intended requirement.

I have wanted this tester for most of my career: one that can read the whole codebase, remember it, find the exact boundary, question why that boundary exists, and then ignore the implementation long enough to prove the behavior from the outside. Human teams rarely had the time or shared memory to do all of that. An AI Test Harness does.

Definition

WHITE-BOX TESTING

White-box testing designs or selects tests with knowledge of the system’s internals: source code, branches, validators, schemas, data stores, configuration, feature flags, dependencies, and implementation-specific boundaries. It is useful for finding what the system actually does and where its hidden risks are. It does not make the implementation its own authority for what the product should do.

Definition

BLACK-BOX TESTING

Black-box testing evaluates software from its observable interface and stated promises, without relying on its internal implementation. It supplies inputs, performs user or client actions, observes outputs and side effects, and judges behavior against requirements, policy, or an explicit oracle. It is how this chapter turns white-box insight into evidence that the product works from the outside.

From Ask to System

Prompt

What should I test in this change?

  • The Test Brief: “Read the diff, adjacent code, requirements, incidents, and tests. Identify changed behavior, hidden dependencies, exact boundaries, authorization transitions, persistence effects, and likely regressions. Rank plausible failures by user harm, business impact, likelihood, detectability, blast radius, reversibility, and uncertainty; then design the smallest black-box evidence set that most reduces release risk.”
  • The Harness: Build a system map, change map, risk register, boundary inventory, coverage ledger, and broad candidate pool from white-box evidence and reusable testing knowledge; select a bounded plan from business criticality and available executors; preserve deferred candidates; and require observed black-box behavior before accepting a user-facing claim.

Why source awareness changes test design

Pause and practice

Find risks in source code. Copy the synthetic checkout service and requirements. Find missing validation, unsafe retries, and risky dependencies, then rank the next tests.

Try this exercise.

The agent can inspect branches, validators, database constraints, feature flags, API contracts, callers, migrations, configuration, and existing coverage. It can derive a candidate boundary from the system that actually runs instead of guessing at generic “edge cases.” Given sufficient repository context, it can connect more of those details at once than a reviewer who must reconstruct them manually from scattered code and documents.

Consider a simple name field. A black-box tester sees a text box and reasonably asks, “What is the longest name a person can enter?” They may ask a product manager for the answer. The product manager may not know; the visible design may not say; an older test may use a convenient but arbitrary value. The tester chooses a number, tries it, reports a failure if the application rejects it, and sends it into an expensive human debate about whether the failure was a bug. That is not bad testing. It is the best available approach when the system’s real limits are hidden. But the authority for the expectation is uncertain from the beginning.

A source-aware AI Test can discover that the client validator, API schema, and database column all currently cap the value at 23 characters. It can immediately produce the useful basic ladder: 22 accepted, 23 accepted, and 24 rejected with a clear explanation. It can also trace whether 23 means Unicode code points, UTF-8 bytes, database characters, or visible grapheme clusters; whether the client and service disagree; and whether a pasted, accented, or emoji-containing name changes the real limit. That is a far sharper test than “try a long string.”

Testing posture What it knows at first Useful result Main failure mode
Black-box guess Visible control, stated requirements, and observed behavior Discovers that the user promise may be unclear or violated Arbitrary values and expensive triage can substitute for a real rubric
Source-aware test Validators, schema, storage, callers, and configuration Targets the actual implementation boundary and its cross-layer disagreement Can mistake the current hard-coded value for the correct product decision
Skeptical source-aware test Implementation evidence plus requirements, standards, historical data, comparable systems, and business context Tests the current boundary and challenges whether the boundary is justified Still needs honest evidence labels when no authoritative policy exists

The important move is to use source as evidence, not as the verdict. The agent can ask: Why is the maximum 23? Is it inherited from a legacy database column? Is it consistent with a governing form, industry norm, contractual requirement, identity provider, localization need, or migration plan? Does a maximum-name policy exist at all? If 28 is the required maximum for a particular government form, for example, then the current 23-character implementation is not the oracle. It is the defect hypothesis. The test should collect the reasoning and supporting evidence that turns that hypothesis into a credible issue.

Prompt

Investigate this name field’s 23-character limit. Test 22, 23, and 24 characters. Is 23 the right product limit? Use the source, requirements, and relevant context. Show your evidence and label anything unknown.

Illustrative AI response

Observed implementation. The UI validator, API schema, and database column each enforce a maximum of 23 characters. In the observed character unit, 22 and 23 are accepted; 24 is rejected before storage. The API and UI agree in this run.

Boundary tests to retain. Repeat 22/23/24 with pasted input, composed and decomposed accented names, CJK text, and an emoji/ZWJ grapheme. Confirm the value after reload, export, and downstream use—not only the first validation message.

Why 23 might be right. It may be a documented legacy limit or a constraint shared with an identity or downstream system.

Why 23 might be wrong. No requirement, policy, or interoperability constraint was found that establishes 23 as a user-appropriate maximum. It may be an inherited implementation convenience.

Policy verdict: NOT ASSESSED. The current limit is observed; its correctness is not established. Locate the governing requirement or ask the product owner before filing a definite defect. If an authoritative higher limit exists, file the 23-character constraint as an evidence-backed issue.

Try it with CARBON: /carbon-issues — Investigate source-aware boundaries and challenge whether the implemented behavior is the right behavior.

Why “perfect white-box tester” stays in quotation marks

Source context can create confirmation bias. The model may mirror the implementation, inherit the author’s assumptions, or confuse intended behavior with correct behavior. This is the legitimate concern behind keeping some testing black-box: if the implementation says 23, an obedient test generator may simply write three tests that prove the implementation does exactly what it says.

The answer is not to blind the AI to the source. Blinding it throws away the most precise map of risk, state, boundaries, and hidden coupling that the system has. The answer is to give it distinct roles and prompts: one agent extracts what the implementation does; another challenges whether that behavior satisfies the user promise; a third plans observations that can falsify either position. A Harness can use the same model in separate contexts or independent models and judges where the risk justifies the extra cost. It should retain the source-derived claim, the external rationale, the counterargument, and the black-box result rather than collapsing them into a cheerful pass.

This is where an AI coding-agent environment changes the economics. The testing agent can read the changed code, understand likely boundary values and affected callers, inspect the test and incident history, and then run the product as a user would. It can generate a precise targeted test in minutes, but it can also investigate the policy question that a conventional test run would never have time, access, or context to ask. Source awareness becomes a way to make black-box proof more intelligent, not an excuse to stop proving behavior from the outside.

What was requested versus what arrived in QA

Some of the best testing work happens before anyone executes a test. A feature arrives in QA with a ticket marked complete, a few acceptance criteria, and a build. Those three things do not necessarily describe the same product. AI can help work out where they disagree.

Give the agent the approved requirement, its revisions, acceptance criteria, designs, release notes, relevant changes, and the identity and configuration of the delivered build. Ask it to compare promises, not just matching words. A button named “Cancel” does not establish that cancellation works. A cancellation handler in the repository does not establish that it was deployed or enabled for this customer.

Consider an illustrative coffee-ordering app. Requirement ORDER-17 says a customer can cancel an order before preparation begins, see its cancellation status, and receive confirmation. The delivered build contains a cancel button and an API handler. That looks encouraging. The meaningful questions are what the handler permits, what the UI tells the customer, and what happens after the request.

Prompt

Compare ORDER-17 and its acceptance criteria with the build delivered to QA. Use the design, release notes, code changes, and build configuration. What is missing, inconsistent, or ambiguous? Show the evidence for each gap and suggest the smallest tests or product questions that would resolve it. Don’t change the product.

Example: A promise-to-delivery comparison

This is an illustrative evidence bundle and possible response, not a recorded execution. The supplied build manifest identifies commit c42 and its active configuration; references below are example artifact names.

Product promise Delivered evidence Next action
Cancel only before preparation ORDER-17 specifies the restriction; cancelOrder() at c42 has no order-state guard Probe a preparing order through the API, not only the button
See cancellation status The handler persists cancelled; the UI maps unrecognized states to “Order received” Cancel an eligible order, then reload and compare UI with stored state
Receive confirmation The design shows a confirmation screen; the requirement does not specify screen, email, or both Ask Product what confirmation means before reporting missing email

Illustrative AI response

Two implementation gaps to investigate. The cancellation handler lacks the required preparation-state check, and the UI has no explicit display for the cancelled state. These are source-supported candidates, not confirmed runtime failures.

One requirement question. Does “confirmation” mean an on-screen receipt, email, or both? The available documents do not settle that. I would not file “missing email” as a confirmed defect.

First tests. With synthetic orders in the QA environment, cancel one eligible order and one already preparing. Verify the API response, stored state, and UI after reload. Preserve the build identifier and configuration with the results.

Handoff. Route the state guard to the orders team, the status display to the UI team, and the confirmation question to Product. No code was changed and no runtime tests have run yet.

That is useful work even before test execution. The agent has turned “the ticket says done” into a short list of concrete uncertainties. It has also avoided creating a bug out of an unclear requirement.

Do not let the largest or newest document silently win. Record which requirement is approved, which build was delivered, and which configuration applies. An old support article may describe a workaround rather than intended behavior. A feature flag may explain an absent capability, but it does not excuse the absence if the release promised that capability. When sources conflict, show the disagreement and ask the person authorized to resolve it.

Retain the comparison with the test plan: promise, authority, delivered evidence, gap, question, owner, and next observation. Revisit it when the requirement or build changes. Chapter 18 describes how to assemble this context; Chapter 8 takes the next step when an execution actually fails. AI is not just doing the tests. It is helping determine whether the team is testing the right thing in the first place.

Try it with CARBON: /carbon-review — Compare requirements, implementation, and available evidence to identify unsupported or missing promises.

How AI generates test cases

Do not reduce generation to “ask the model for a list.” A capable agent builds candidates by transforming product evidence into test intent:

  1. Extract user and business promises, actors, roles, surfaces, states, transitions, data, dependencies, constraints, irreversible commits, and recovery paths from requirements, source, schemas, existing tests, incidents, support evidence, and observed behavior;
  2. Map each promise to plausible failures and their consequences, including positive, negative, boundary, security, privacy, accessibility, performance, reliability, compatibility, interruption, recovery, and forbidden-outcome families;
  3. Partition inputs and state rather than enumerate everything, while preserving exact implementation boundaries and high-consequence combinations;
  4. Vary role, tenant, history, environment, platform, dependency behavior, timing, order, concurrency, and persona where those dimensions can change the outcome;
  5. Attach setup, safe data, authority, oracle, required evidence, cleanup, provenance, priority, and the decision the result could change;
  6. Cluster exact or semantically overlapping candidates, retain the reasons they were generated, select a risk- and budget-appropriate execution set, and preserve valuable deferred candidates;
  7. Treat every output as a candidate until it runs and produces evidence; generation alone establishes neither coverage nor correctness.

An AI Test Harness can make this discipline compulsory. Instead of hoping one prompt or one agent remembers every dimension, it runs a workflow of specialized agents, prompts, evidence gates, and review steps that explicitly require the promise map, failure families, boundaries, roles, state, authority, oracle, required evidence, cleanup, provenance, prioritization, and candidate status to be considered. The Harness can reject or defer a thin candidate, ask a skeptical agent to identify missing dimensions, and preserve the reason a candidate was selected or left unexecuted. It turns a good tester’s mental checklist into a repeatable quality workflow.

The best generation is partly deductive and partly creative. Source and contracts reveal real branches, constraints, and boundaries. Reusable testing knowledge supplies cases the project may never have documented. Incidents and production behavior expose historically weak assumptions. Personas, adversarial review, and stronger reasoning models propose unfamiliar journeys and failure combinations. The harness then turns that broad pool into an explainable plan rather than confusing the size of the list with quality.

Try it with CARBON: /carbon-generate — Generate prioritized test candidates from the project and its evidence; candidates still need execution.

A complete TestBucks test-generation pipeline

The seven steps above are useful, but a list of principles can make generation sound cleaner than it is. A real Harness begins with mixed evidence, creates too many candidates, challenges its own work, removes some candidates, retains apparently overlapping cases for specific reasons, and executes only a bounded subset. The product of generation is not a beautiful list. It is a traceable funnel from product knowledge to observed evidence.

TestBucks makes that funnel concrete. The following pipeline is illustrative; its service and staff-dashboard features are design extensions, not existing starter-app capabilities. For this worked example, the generation agent receives an extended coffee-shop source tree, the application description, the public routes, the synthetic starting state, the baseline desktop and mobile screenshots, the semantic DOM, the keyboard trace, console and network summaries, the example run manifest, and the declared safety boundary. It does not receive the instructor’s seeded-defect key. The key can evaluate the generator later; it must not supply the answers.

Prompt

Generate risk-ranked AI Test candidates for TestBucks from the supplied requirements, source, routes, existing evidence, and run history. First map product promises, state transitions, implementation boundaries, roles, failure consequences, and missing evidence. Generate positive, negative, boundary, accessibility, security, data-integrity, interruption, recovery, concurrency, and responsive cases where they can change a quality or release decision. Return candidates, not claimed coverage. For every candidate, include its source, risk, oracle, required evidence, safety limits, priority, and reason. Cluster semantic duplicates, explain which overlapping cases should remain, select the smallest useful first execution set, and preserve deferred candidates. Do not read the seeded-defect key.

Illustrative AI response

Generation summary. I mapped six product promises and risk boundaries, generated 16 source-informed candidates, clustered the overlapping route, transition, and accessibility cases, and selected nine intents for the first bounded run.

Highest-information selections. Core create-and-reload persistence; empty and repeated submission; keyboard access to drink cards; edit-and-reload; rejected-save recovery; safe rendering of user-authored pickup notes; escaped unknown-route recovery; malformed-state recovery; and narrow-viewport operation.

Deferred, not discarded. Statistics reconciliation, settings persistence, two-tab conflicts, larger collections, direct-route refresh, repeated transitions, enlarged text, and broader interaction-mode comparisons remain in the coverage ledger with reasons and triggers.

Evidence boundary. These are generated candidates, not passing tests and not measured coverage. I did not read the seeded-defect key.

The first output is a product-and-risk map, not test cases:

Product promise or risk Evidence that suggested it What could falsify it
A person can create and retain an order Add-to-cart controls, store module, local persistence, prior edit-persistence observation Empty or repeated submission, lost state after reload, incompatible stored shape
A person can open and change an existing cart item Clickable drink cards, drink-detail route, asynchronous save Keyboard exclusion, rejected save, misleading status, stale state after reload
Menu state remains understandable across viewports Desktop and 390-pixel screenshots, responsive CSS Horizontal overflow, unreadable cards, hidden controls, broken focus order
User-authored text is rendered as data Customer names and pickup notes flow into cart, receipt, and staff dashboard views Stored or route-derived markup executes instead of displaying as text
Statistics describe the actual order history Order history route and aggregation code Counts, pickup notes, or status totals disagree with persisted orders
Local state fails safely Versioned local-storage key and direct parsing Malformed, incomplete, or stale state breaks the whole application

From that map, the agent generated the following source-informed candidate pool. This is an illustrative candidate pool for the fictional shop, not an executed model run. Account, service, and staff-dashboard examples extend the browser-only starter.

ID Generated candidate intent Why it exists Initial disposition
TG-01 Create a non-empty vanilla-latte cart item and verify it remains after reload. Core creation and persistence promise. Select.
TG-02 Submit an empty customer name, whitespace-only name, and repeated Enter; create no phantom or duplicate order. Input boundary and duplicate-action risk. Select one partition; defer equivalent variants.
TG-03 Open every drink card using Tab, Enter, and Space without a mouse. Cards appear clickable; keyboard semantics require evidence. Select.
TG-04 Add oat milk and an extra shot, change quantity, reload, and verify the same cart state. Cross-view edit and persistence promise. Select.
TG-05 Save an order while persistence is delayed and then rejected; verify truthful status, safe retry, and final state. Asynchronous save creates interruption and recovery risk. Select; requires reversible fault authority.
TG-06 Render a pickup note containing inert HTML-like text and verify every view treats it as text. User-authored pickup notes reach aggregate rendering. Select with synthetic input.
TG-07 Open a malformed unknown route and verify safe escaped recovery. Route text reaches the not-found view. Select in isolated origin.
TG-08 Load syntactically valid but incomplete saved state and verify migration or safe reset. Persisted state is a compatibility boundary. Select in isolated profile.
TG-09 Use the menu at 390 pixels, 200% text size, and keyboard-only input without horizontal loss. Responsive and accessibility risks overlap but use different evidence. Select the 390-pixel case; retain text-resize variation.
TG-10 Compare Order history totals and item counts with the underlying saved orders after edits and moves. Aggregate views can be internally consistent-looking but wrong. Defer until core persistence is stable.
TG-11 Change settings, reload, and verify the preference and its visible effect agree. Settings are another persistence surface. Defer: lower current consequence.
TG-12 Edit the same order in two tabs and characterize lost-update or conflict behavior. Concurrent state can silently overwrite recent work. Defer: valuable but outside first budget.
TG-13 Exercise zero, one, typical, and large order collections across menu and Order history. Empty-state and bounded volume behavior are unobserved. Defer bounded volume run.
TG-14 Refresh directly on every hash route and recover from an unknown route without losing state. Navigation and reload are durable product promises. Cluster with TG-07; keep direct-route variant.
TG-15 Move an order repeatedly through order states and verify exactly one final location and correct totals. Repeated state transition can duplicate or desynchronize records. Cluster with TG-04; retain repeated-transition variation.
TG-16 Compare mouse, keyboard, narrow-viewport, and enlarged-text operation of drink cards. The same user promise crosses distinct interaction and presentation assumptions. Keep as a coverage family; dispatch bounded variants.
Reject thin candidates before they become a test library

Generation quality is partly visible in what the Harness refuses to keep. “Test the menu,” “make sure orders work,” and “try edge cases” are not portable AI Tests. They do not identify a promise, state, oracle, consequence, evidence requirement, or safety boundary. “Click the first card with .drink-card:nth-child(1)” is executable but preserves incidental choreography rather than product meaning. “Verify the UI looks good” may support exploratory review, but it is too unconstrained to become a trusted regression.

The Harness either enriches those candidates from available context or rejects them with a reason. A rejected candidate is still useful generator evidence: repeated vague output can reveal that the generator lacks context, a usable schema, or a prompt that forces consequences and oracles.

Dedupe semantics, not wording

TG-04 and TG-15 both change an order, but they are not exact duplicates. The first verifies ordinary edit persistence; the second challenges repeated transitions and aggregate consistency. TG-07 and TG-14 share unknown-route recovery, so their setup can be clustered, while direct refresh remains a distinct navigation assumption. TG-03, TG-09, and TG-16 overlap around drink-card access, but keyboard semantics, responsive geometry, and enlarged text can fail independently and require different evidence.

The first bounded execution set therefore selects nine canonical intents: core create/persist, empty and repeated submission, keyboard card access, edit-and-reload, rejected-save recovery, safe pickup-note rendering, safe unknown-route recovery, malformed-state recovery, and the narrow-viewport slice of responsive use. The remaining candidates stay in the coverage ledger with their reason, priority, prerequisite, and trigger for reconsideration. Deferral is a decision, not deletion.

Serialize selected candidates as AI-First Test Cases

Use the contract in Chapter 7, “The OpenTest.ai Test-Case Schema: canonical reference,” to serialize the selected candidates. That section owns the full JSON example and field reference. Here the important question is what each generated candidate must preserve, not another version of the format.

Selected candidate Promise and observable outcome Sequence the executor must preserve
Open every drink without a mouse A keyboard user can reach, identify, open, and leave every drink card with visible focus. Traverse with Tab and Shift+Tab; activate with Enter or Space; return and continue without a pointer.
Rejected save recovers truthfully One rejected save is reported honestly; one retry converges to exactly one durable edit. Inject the approved rejection; preserve the first failure; retry once, reload, and reconcile visible and durable state.

The Harness envelope retains stable IDs, priority and rationale, authorized fault setup, synthetic data, required evidence, routing, provenance, and lifecycle. Those are execution context, not a new portable test schema. The generator should preserve both the intent and the context without confusing generated work with completed work.

Suppose a first run of the extended TestBucks sandbox does not execute every selected intent. In this illustrative outcome it reproduces the keyboard-card failure, the narrow-viewport overflow, and unsafe stored pickup-note rendering; it also observes ordinary cart-edit persistence. Rejected-save recovery, malformed-state recovery, unknown-route safety, several creation boundaries, cross-browser behavior, and concurrency remain NOT ASSESSED. That result matters: the generator created useful next work, but generated candidates did not become passed tests merely because they looked plausible.

Let execution teach the next generation

Execution changes the generator’s context. The keyboard failure promotes drink_card_keyboard_open from candidate to observed failure and later, after repair and repetition, to a trusted regression. The responsive failure expands the viewport and enlarged-text family rather than spawning dozens of unconnected screenshots. The stored pickup-note failure raises the priority of every user-authored rendering sink, including the unknown-route and aggregate-view candidates. A blocked fault-injection case remains visible with its missing authority rather than silently disappearing.

Accepted issues, false-positive explanations, duplicate decisions, repairs, escaped defects, and reviewer feedback all become scoped examples for later generation. The next run should not produce the same candidate pool from scratch. It should know which promises now have fresh evidence, which cases are trusted, which risks remain weak, which prior candidates were rejected and why, and what changed since the last run.

Score the generator, not merely its output count

A generator that produces a thousand cases is not necessarily better than one that produces twenty. Evaluate whether its candidates can change a decision:

Generator measure What to inspect Failure signal
Risk-family recall Which known, seeded, escaped, or independently identified risk families appeared in the candidate pool? Important security, recovery, role, state, or integration risks never appear.
Semantic diversity Do retained candidates challenge meaningfully different assumptions? Many paraphrases exercise the same state, data, path, and oracle.
Boundary quality Are exact implementation and product boundaries traced across layers and units? Generic “long string” cases replace real limits and downstream behavior.
Oracle quality Can the executor determine success from observable evidence? The expected result merely repeats “works correctly” or mirrors implementation.
Executability Are setup, data, environment, authority, cleanup, and evidence available? Attractive candidates cannot be run safely or judged.
Evidence completeness Does each selected test request the artifacts needed for its claim? A final screenshot is used to infer storage, network, authorization, or recovery.
Redundancy quality Are exact duplicates removed while decision-relevant overlap remains? Cheap but useful variation is erased, or correlated repetitions inflate confidence.
Defect yield Which executed candidates produce reproducible, relevant findings or stronger supported claims? High activity creates little decision-changing evidence.
Escaped-risk learning Do incidents and later discoveries change future generation? The same class of production failure remains absent from the candidate model.
Regression promotion Which candidates become repeatable, trusted evidence after repair? The library accumulates generated intentions that were never observed or maintained.

Use seeded defects, mutation testing, historical incidents, independent generation, and representative human review to evaluate those measures. Keep the denominator and scope visible. A generator can have strong recall against a small set of seeded TestBucks defects and still know almost nothing about large-scale collaboration, authentication, remote persistence, or production operations that TestBucks does not implement.

Boundaries follow the data through the system

Pause and practice

Challenge the implementation. Try the last-name form and generate boundary tests from its source. Separate the implemented limit from the rule the product needs.

Try this exercise.

“Try some edge cases” is not boundary analysis. The white-box advantage is that the agent can trace one value through every layer that may impose a different constraint: visible control, client validator, serializer, URL or request body, proxy/CDN/load balancer, framework parser, service schema, database type or index, downstream provider, notification, export, analytics, and later display.

For each relevant constraint, test just below, exactly at, and just above the real boundary. When the boundary is unknown, use bounded powers-of-two probes to find a discontinuity and then narrow it. Count the unit the layer actually uses: characters, Unicode code points, grapheme clusters, bytes after encoding, rows, items, nesting depth, decimal scale, duration, or time-zone transition. An accepted value that is silently clipped, normalized, rounded, reordered, or corrupted downstream is a failure even if the first request returns success.

Use a reusable boundary ladder:

  • Absent, null where supported, empty, whitespace-only, and one-unit values;
  • Minimum minus one, minimum, and minimum plus one;
  • Typical values and declared maximum minus one, maximum, and maximum plus one;
  • Zero, negative, fractional, huge, NaN/infinity through non-UI paths, numeric-string, and wrong-type cases where relevant;
  • Composed/decomposed accents, right-to-left text, bidirectional isolates, CJK, emoji/ZWJ graphemes, invisible characters, line-ending variants, paste, autofill, IME composition, and speech input;
  • Leap days, month/year boundaries, midnight, daylight-saving gaps and repetitions, expiry at the exact boundary, unusual UTC offsets, and client/server clock disagreement;
  • Zero-byte and oversized files, misleading extensions/MIME types, filename encoding, interrupted multipart transfer, duplicate names, retry, and cleanup;
  • Collection sizes of zero, one, typical, page-minus-one/page/page-plus-one, followed by bounded progressive stress where authorized.

Transport changes the test. A long query can be clipped by a browser, intermediary, router, application, or log; JSON distinguishes missing, null, empty, wrong type, duplicate keys, and excessive nesting; multipart adds framing, filename, MIME, part-count, and transfer behavior. Trace accepted input through storage, reload, search, sorting, calculation, notification, audit, export, and downstream APIs.

AI is useful because it can derive the likely boundaries from source and contracts, generate the smallest discriminating set, and correlate failures across layers. It must still run the probes, obey safety and load limits, preserve exact units and encodings, and avoid treating the implementation’s current constraint as proof of the product requirement.

Try it with CARBON: /carbon-functionality — Focus on form validation, boundary values, error states, and submitted data.

Coverage is a map, not a percentage

Map behavior, state transitions, data partitions, boundaries, roles, platforms, integrations, failure modes, and business promises. Code coverage is one signal; it does not say whether the important risks were challenged. A useful AI harness maintains a coverage ledger beside the test inventory:

Coverage dimension What the ledger records
Claim and risk The promise being tested, consequence of failure, owner, and release relevance.
Behavior and state Journeys, decisions, transitions, invariants, cancellation, recovery, and forbidden outcomes.
Data and boundaries Valid/invalid partitions, exact boundaries, volume, history, nullability, encoding, and migration state.
Identity and authority Roles, tenants, ownership, privilege transitions, authentication state, and policy source.
Platforms and environments Browsers, devices, operating systems, versions, flags, locales, topology, and production differences.
Integrations and failures Real and simulated dependencies, protocols, timeouts, retries, duplication, partial failure, and recovery.
Evidence quality Last observed build, environment, freshness, reproducibility, provenance, contradictions, and known gaps.

The ledger distinguishes planned, generated, executed, observed, repeatable, trusted, stale, blocked, and not assessed. A case does not cover a risk merely because its title resembles it, and yesterday’s pass does not cover today’s incompatible schema or configuration.

Test the coverage model itself

Coverage quality needs evidence too. The cases are not the only thing that can be wrong. The risk map can omit an integration, the generator can repeatedly propose the same happy path, the deduper can collapse two meaningfully different cases, the judge can accept weak evidence, and the confidence calculation can count correlated passes as independent proof. A green dashboard is a claim produced by a model of the product. Test that model.

Mutation testing asks whether the suite detects deliberately changed behavior. Seeded defects measure whether the full planning, execution, judging, and reporting loop notices known failures without drowning them in false positives. Escaped incidents reveal missing risks and weak oracles. Cross-model or human challenge can expose blind spots shared by the planner and executor. A strong Harness also changes the evidence conditions deliberately: remove a required artifact, make a dependency stale, change a configuration that should invalidate a claim, hide a known issue from one source, or introduce a controlled boundary defect. It should reduce confidence, surface the affected promise, and explain why. If it continues to report the same reassuring score, the coverage model has learned to look complete rather than to be skeptical.

Use line, branch, condition, data-flow, API-contract, state, requirement, risk, persona, and production-signal coverage as complementary views. Never average them into one impressive percentage without explaining the denominator, weighting, exclusions, correlation, and evidence freshness. Test whether a change to the risk weighting actually changes selection; whether a blocked high-risk integration remains visible; whether a deliberately duplicated run inflates confidence; and whether the system invalidates evidence when relevant code, contracts, data, configuration, dependencies, environments, or test definitions change.

Historically, this kind of meta-testing was rarely done because it required people to design mutations, seed realistic failures, rerun broad suites, interpret noisy results, and maintain a separate evaluation system for the evaluation system. AI makes that practical: it can generate candidate faults, assemble controlled scenarios, inspect the planner’s decisions and evidence trail, compare coverage claims with observed outcomes, and repeat the exercise across a large cloud matrix at a cost and speed that human-only process could not sustain. And yes, the testing of the coverage model can also be tested.

Mutate the product, then measure what the Harness catches

A bug-finding leaderboard measures one capability. I also want to know whether the whole quality system notices when the product breaks. Does the Harness collect the right evidence, recognize the defect, and change its recommendation? A green dashboard is not an answer to that question.

Use a disposable TestBucks environment with synthetic orders and simulated payments. Establish a clean baseline, then freeze the Harness configuration, requirements, budget, and release policy. Introduce one fault at a time in source code or runtime behavior. Restore the baseline between trials. Keep the fault key outside the testing agent’s context; otherwise you are measuring its ability to follow an answer key.

For example, make a retry create two simulated charges instead of one. The customer-facing page can still say “Order placed.” The Harness must inspect the payment records, show the duplicate, and recommend holding the release. A screenshot check alone can miss the defect even while every visible check passes. Repeat with an incorrect refund amount, a lost order after reload, and an unauthorized order read, where the fixture implements those behaviors. These are proposed experiments, not measured results.

Predeclare a small allowlist of mutation operators and verify their effects independently. A delete or swap might introduce a real product fault; a rename or ID change might leave behavior intact. Include those harmless changes as negative controls. If a selector breaks after a harmless rename, record automation fragility, not a successfully detected product defect. Rotate the affected cases so one familiar checkout path does not become the entire benchmark.

Score each valid fault as caught, silently missed, or inconclusive. “Caught” requires a supported finding and the policy-appropriate verdict, not merely a failed tool call. A blocked environment is inconclusive; a release recommendation that overlooks the fault is a silent miss. Report counts by consequence tier, including inconclusive runs, invalid mutations, false alarms on clean controls, review effort, and detection time. For stochastic runs, repeat the frozen experiment and report variation rather than selecting the best run.

An illustrative gate is zero silent misses and no unresolved trials for the selected critical faults; lower tiers can use explicitly agreed tolerances. That is an acceptance rule for this experiment, not proof of zero remaining critical bugs. Report caught faults over all valid injected faults, with inconclusive outcomes visible in the denominator. The score estimates sensitivity to this fault set, not the size of every unknown blind spot. Recalibrate when tools, prompts, models, budgets, or evidence sources change. Chapter 30’s cost-per-credible-finding measure should include this calibration work too.

Business value belongs in planning

A password-reset flow and a subtle animation should not receive equal effort. That sounds obvious, but most testing systems do not actually plan from business value. They rank by a severity field, a test-suite folder, the order someone wrote a ticket, or what a single tester happens to understand. Risk-based testing makes the optimization function visible rather than pretending that test count equals confidence.

AI lets a team put the material that explains the business beside the source that implements it. In a project folder or configured context store, include approved specifications, product requirements, architecture decisions, user research, support and incident history, test artifacts, launch plans, service-level commitments, regulatory obligations, and the current milestone. For a public company, an approved public filing or shareholder letter can be useful additional context: it often states the company mission, near-term priorities, material risks, and the measures leadership says matter. The point is not to turn a CEO document into an oracle. It is to let the planning agent see context that conventional test selection almost never reaches.

A capable AI Test Harness should not merely absorb a large folder and declare that it understands the business. It inventories the supplied sources, records their provenance and freshness, identifies authorities and oracles, detects conflicting requirements, and asks for clarification when the policy that would change a decision is missing. It can then apply that context to test selection, issue triage, regression priority, and release confidence. A public strategy statement may be relevant evidence; a signed product requirement, legal obligation, or explicit release rule may carry greater authority. The Harness should preserve that difference rather than allowing a persuasive document to quietly overrule the product contract.

Consider an illustrative Starbucks-style decision. Suppose the company’s public strategy says that, this quarter, reducing mobile ordering friction and time in line is a primary goal. The release window is short. The Harness observes a gift-card issue in both the web experience and the mobile application. Without the broader context, both defects may receive the same generic label. With it, the mobile failure may become the higher-priority investigation because it touches the stated business objective, customer wait time, and the quarter’s delivery risk. Conversely, a risky web change might be deferred if it cannot materially advance that objective before the deadline. The decision is not “mobile always wins.” It is an explicit, evidence-backed connection among product strategy, user harm, opportunity cost, release timing, and the test plan.

Jason story

JASON STORY — WALKING THE STARBUCKS QA HALLS

I have walked the halls at Starbucks, talking with QA and engineering people about this idea. What if the AI could read the company’s public filings, look at the source code, and use what the business cared about to decide which bugs mattered most? I got some strange looks. It sounded pretty futuristic.

I get that reaction. How often does a tester have time to read the company’s public filings while investigating a bug? Now the agent can read the business priorities alongside the code and connect them to what it found. That is the exciting part. I still want it to show me where the connection came from. A convincing explanation without evidence is still a guess.

The manual version is simple: place the approved context with the project and ask an AI coding agent to explain which risks, defects, and tests matter most in light of it. The Harness version makes the same discipline durable. It refreshes the registered context, carries it across runs, records how it influenced a recommendation, and allows a team to steer it: focus on mobile checkout this release, treat privacy as a stop condition, or de-emphasize a completed accessibility objective without erasing the evidence. This is the difference between a one-off smart prompt and a quality system that remembers what the organization is trying to accomplish.

Present the feedback generously and precisely. If testers judged, for example, 25% of a generated pool to be duplicates, do not silently convert that opinion into an objective defect rate. Recover the actual evaluation population, instructions, rubric, number of testers, agreement level, and examples before publishing a number. Their classifications remain useful product evidence even when reasonable testers disagree about equivalence.

The conversation changed when business leaders considered the unit economics. If AI execution is roughly ten times faster and one-hundredth the cost, even a pool with 25% genuinely redundant cases can still produce approximately 7.5 times the distinct-test throughput and about 75 times the distinct-test output per dollar, assuming equivalent evidence and no added downstream cost. That is a useful order-of-magnitude illustration, not a promise of a fixed ratio. The actual result varies with the product, company, talent mix, environment, test type, review model, and evidence standard. Use the rough measure to understand the scale of the opportunity; disclose scope, setup, execution, triage, maintenance, false positives, and evidence quality whenever making a named comparison.

The larger insight is that an optimization inherited from expensive human execution can become locally irrational when generation and execution costs collapse. The question is no longer, “Did the AI produce the smallest elegant suite?” It is, “Did the system produce decision-changing evidence faster and at lower total cost without creating unacceptable risk, noise, or delay?” Technical reviewers should assess semantic diversity, oracles, evidence, and risk coverage. Product and business leaders must evaluate time to value, cost to confidence, opportunity cost, and total business value; test-suite neatness alone cannot decide the transformation’s worth.

Do not use cheap execution as an excuse for careless duplication. Teach five different cases:

Apparent duplication Editorial treatment Execution treatment
Exact same intent, state, data, oracle, and environment True duplicate Normally suppress before execution
Paraphrased intent with no meaningful evidence difference Semantic duplicate Cluster; execute only when it tests parser or model stability
Same promise through different data, path, persona, role, platform, dependency, or failure state Overlapping coverage, often not a duplicate Retain when the variation can falsify a different assumption
Repeated stochastic trial or independent corroboration Intentional repetition Retain, but report correlation and do not pretend repetitions are independent users
Destructive, paid, rate-limited, privacy-sensitive, or externally visible repetition Potentially harmful waste Deduplicate or gate regardless of low model cost

Execute broadly, count skeptically

Separate three operations throughout the book: deduplicating candidate tests to control execution, deduplicating findings so teams see one canonical issue with all affected surfaces, and assessing evidence independence so repeated or correlated passes do not inflate confidence. An AI Test Harness should rationally execute overlapping cheap tests while still grouping their findings and refusing to count them as independent proof.

Cheap overlap is not automatically waste. Two tests can share a promise while exercising different data, role, device, timing, recovery path, or execution agent. They may expose a real divergence, measure the stability of a stochastic executor, or corroborate a high-consequence claim with a genuinely independent signal. The Harness should preserve why it kept the overlap and what distinct assumption it was intended to challenge.

But broad execution must not become confidence theater. The report should show both the number of runs and the smaller set of independent claims and evidence sources they support. It should group one root-cause issue across many pages, name correlated passes as correlated, and make a cheap repeated run easy to audit without letting it masquerade as ten different reasons to ship.

Chapter 14 — Personas That Actually Test the Product

Jason story

JASON STORY — VERY, VERY RED, AND A DOG ON EVERY TRIP

Early on, someone reached out to me about AI testing. I pinged them back and asked what they found most interesting. Personas, they said.

I was a little surprised. Not because I disagreed—I thought personas were exciting too—but because there were so many other things to get excited about. AI could emulate a user and give feedback, including qualitative feedback. Not just “the button works,” but “this is confusing,” or “I would not trust this,” or “why is everything red?”

That last one comes from one of my favorite examples of user feedback. I remember hearing it from user-testing folks, although I cannot remember whether it was in a conversation or a video. BMW was testing a page for a new car. I think it was an M4. The car was a very cherry red, against a red background, with more red surrounding it in the page design. The feedback, as I remember it, was: “It’s red. Very, very red.”

That might be the best example of qualitative feedback ever. No assertion failed. No one needed to count the red pixels. A person looked at the whole experience and said what it felt like.

That is the kind of feedback services like UserTesting.com can give you. But you have to find the people, wait for them, and pay for their time. With AI, I could try another persona right away. And another. I didn’t have to organize a whole new round of user sessions every time I had a question.

Then a great tester at a travel site told me about one of their most useful personas: an elderly woman who takes her little dog everywhere she travels.

Think about that trip. It is not enough for the flight search to work. Can the dog come on the plane? Can she carry it with her? Does the hotel accept it? What about the rest of the trip? The dog is not an optional detail you can forget after the first screen. The entire planning experience has to account for it.

That is a wonderfully difficult testing scenario. The dog has to make it through the whole trip, not just the first booking screen. A travel site can look perfectly fine until you ask it to handle something like that.

Now we can create deliberately demanding personas like that and ask AI to explore the experience through their eyes. Not just the generic customer who wants the default option and has no questions. The customer whose needs expose all the assumptions we quietly built into the product.

Those assumptions can be blocking business without anyone filing a bug. The person cannot make the trip work, so they leave. You never hear from them.

Personas are super powerful.

Representing the user is not exclusively human territory. LLMs were trained on human language and behavior, and they are unusually good at adopting goals, constraints, confusion, impatience, distrust, and different points of view. That does not turn a synthetic persona into customer research. It does make one tester capable of exploring a product through ten or a hundred useful lenses before lunch.

From Ask to System

Prompt

Test this product with several realistic personas.

  • The Test Brief: “From the supplied product and research context, create risk-relevant personas varying product knowledge, device, accessibility need, trust posture, time pressure, permissions, and goal. Let each attempt a concrete journey with safe data, record expectation and evidence at every step, treat reactions as qualitative hypotheses, and verify factual failures independently.”
  • The Harness: Select or generate personas from product risk and observed populations; bind each to provenance, goal, identity, data, device, permissions, success and stop conditions; execute isolated adaptive journeys; cluster friction without erasing minority perspectives; and promote only corroborated behavior with a stable oracle into regressions.

What a useful persona contains

  • Role, knowledge, goal, and motivation;
  • Accessibility needs, language/device context, and permissions;
  • Relevant stress, trust, privacy, or time constraints;
  • A specific task and a reason it matters;
  • Boundaries that prevent caricature or invented demographics.

Keep persona-generation and execution prompts versioned alongside the project. The reusable foundation is the schema, provenance, and evidence discipline, not one frozen prompt sequence.

Example persona record — OpenTest.ai open standard

This illustrative profile follows the OpenTest.ai open standard for persona descriptions. Its companion feedback schema carries the perspective’s ratings, comments, friction, praise, unknowns, and evidence references. Together, they explain the synthetic perspective and what it observed. Chapter 1 defines the user_persona_feedback[] pattern; a Harness adds durable journey evidence for interactive AI Tests.

{
  "id": "ai-persona-cautious-buyer",
  "display_name": "Maya",
  "label": "AI persona",
  "role": "First-time, privacy-sensitive buyer",
  "context": "Mobile browser, limited time, unfamiliar with the brand",
  "goal": "Understand the total price and complete checkout without creating an account",
  "concerns": ["unexpected fees", "marketing consent", "unclear returns"],
  "success": ["total cost is understood", "consent choices are respected", "order is confirmed once"],
  "evidence": ["step screenshots", "network consent state", "confirmation text"]
}

How to use persona data

  1. Single-state check: Give the persona the screenshot and page bundle. Ask for ratings, comments, specific friction, and specific praise across usability, content, trust, accessibility, and visual design. Treat the output as a hypothesis queue.
  2. Scenario generation: Use the persona’s goal, concerns, device, permissions, and success conditions to generate relevant test candidates and data variations.
  3. Interactive journey: Give the persona to a browser agent. At every step, record what the persona expected, what it tried, what happened, what felt difficult, what worked, whether its goal advanced, and what evidence was captured.

Feed the resulting data into risk prioritization, test generation, triage, design review, and reporting. Aggregate common friction without erasing meaningful minority perspectives. A repeated persona complaint can increase investigation priority; it cannot become a deterministic failure until the underlying behavior or declared product promise supports one.

TestBucks example: Turn a persona into actions

Use a mocha journey with three different needs. The first-time customer examines milk options and the final price before committing. The rushed commuter tries to repeat a familiar order and checks whether pickup timing is clear. The keyboard-only customer must discover, customize, and add the drink without a pointer.

Actual mocha customization and keyboard-focus captures from a staged exercise. The persona tasks are not feedback from recruited customers. Real app captures / persona tasks are exercise instructions. Rushed commuter: repeat a saved preference and check pickup timing. Each persona needs observable checks.

Figure 14.1a. First-time customer: options, price, and saved order.
Figure 14.1b. Keyboard focus and the selected milk value.

In this staged keyboard attempt, the operator moves through the milk choices, returns to Regular, then tabs to the extra-shot box and checks it. The orange focus outline is on that box, while Milk still reads Regular instead of the intended Oat. This deliberately mismatched state illustrates an execution mistake, not a demonstrated application defect. Focus shows where keyboard input will go; it does not prove that an earlier selection succeeded. A strong persona test checks the selected value and the saved cart before deciding whether the barrier came from the application or the executor.

Prompt

Explore the mocha journey as a first-time customer, a rushed commuter, and a keyboard-only customer. Give each a concrete goal. Record actions and observed obstacles before offering qualitative feedback. Verify the final drink options for every completed journey.

Persona-guided AI exploratory testing

Pause and practice

One homepage, three perspectives. Review a coffee-shop homepage as a rushed commuter, keyboard-only user, and first-time customer. Compare qualitative feedback and ratings.

Try this exercise.

Use the persona record as executable context, not decorative biography. Bind it to one goal and safe data; snapshot available actions and evidence before and after every step; let the agent adapt; record friction and praise; and stop on success, blocker, safety boundary, or budget. Convert consequential discoveries into repeatable intent tests only when a stable oracle and corroborating evidence exist.

Prompt

Using Maya’s persona record, explore the checkout as a first-time, privacy-sensitive mobile buyer. Try to understand the total cost and complete a sandbox purchase without creating an account. At every meaningful state, record what Maya expects, what the product shows, the evidence captured, and any trust or recovery friction. Do not submit a real payment.

Illustrative AI response

Outcome: BLOCKED before payment. I reached the review step but could not establish the final total without opening a separate shipping-information panel. The interface also selected marketing consent by default. I stopped before submitting payment, as required.

Persona reaction. “I expected the total to be visible before sharing more information. A preselected marketing choice makes me less willing to continue.” This is qualitative persona evidence, not a measured customer opinion.

Observed product evidence. Mobile screenshots of the collapsed cost panel and selected consent control; DOM state for the checkbox; no payment request in the network trace.

Next work. Create an AI Test for total-price visibility before irreversible commitment and a Privacy AI Check comparing the consent UI with observed network behavior. Route the trust reaction into product review rather than calling it a deterministic failure by itself.

Exploratory work differs from a scripted flow because the next action depends on what the agent learns. Useful modes include feature, error, data, consistency, happy, negative, boundary, scenario, monkey, adversarial, and bounded destructive tours. Exploration finds hypotheses and unexpected behavior; regression requires a stable oracle and reproducible evidence.

Personas expand perspective and exploration. They do not turn an LLM’s preference into a product fact, represent a real population automatically, or replace research with actual users.

Try it with CARBON: /carbon-personas — Generate evidence-qualified persona feedback; use /carbon-test for a scoped executable journey.

Chapter 15 — Skepticism, Oracles, and Models Judging Models

This chapter’s job is to judge a particular result: define an oracle, calibrate a judge, and resolve disagreement with evidence. Chapter 25 evaluates the testing system as a whole; Chapter 26 compares human and agent workflows; Chapter 29 selects model configurations. Those are related questions, but they need different experiments.

Jason story

JASON STORY — WE USED TO CLAP FOR THE SHOPPING CART

Early in my work on AI testing, I spent a lot of time telling people to lower their expectations. Investors, customers, people at conferences: everybody could imagine the AI solving the whole problem. Meanwhile, we were happy that a custom-trained neural network could recognize a shopping-cart icon after hundreds of hours of labeling data.

Whoa, whoa, whoa. We are only about eighty percent sure that is a shopping cart. Let’s start there.

Then LLMs arrived, the capabilities improved enormously, and the reaction seemed to reverse. When AI could do very little, people imagined it doing everything. When it became much faster, cheaper, and more capable, people became skeptical.

It felt like an uncanny valley for testing. Recognize a shopping cart and everybody claps. Come back with a substantial test pass and results after an hour, without someone handcrafting every step, and suddenly the scrutiny gets intense.

I get it. Something that appears to do your job is going to get a different reaction. But testers have spent years telling developers they are too close to their own work to judge it fairly. Now look at us. Have we actually tested our testing against the AI? Or are we assuming ours is better because it is ours?

I recently received an email that captured this for me. I had suggested that an AI Test Harness might be useful. The reply was essentially: thanks, but I already have eighty-eight clearly defined agentic test flows, handcrafted over the last nine months. I am good.

Agentic—whatever that word means this week.

My reaction was: wouldn’t you want another four hundred by tonight? I put a smiley on it. I was not saying the eighty-eight were worthless. I was asking why they should define the limit of what we investigate.

At a conference, I borrowed the military saying, “Quantity has a quality of its own.” Would you rather have ten beautiful tests you know inside out, or a thousand that explore much more of the product, even if twenty or thirty results need sorting out? I am not talking about a thousand copies of the same check. I mean a thousand useful investigations that go places your beautiful ten never reach.

We can’t personally review everything at that scale. We have to sample, check the serious findings, and measure how well the system is doing. That includes looking for what it missed, not just grading the bugs it handed us. Otherwise, we cap the testing at whatever one person has time to read.

That means getting comfortable with statistics and sampling. If you want to dig into confidence intervals and that sort of thing, I wrote another book, Testing AI. But start with the practical question: what did each approach find, what did it miss, how long did it take, and what did it cost?

The developers and engineering leaders I talk to are not necessarily waiting for that argument to end. They are already asking coding agents to do testing. I expect more of them to run a broader investigation over a weekend rather than wait months for another carefully curated set of flows.

If we insist that the only valuable testing is the testing we personally handcrafted, we risk making our contribution an optional supplement to the evidence the development team already has. They may look at it if it is available. They may stop waiting for it.

Keep the skepticism. Apply it to the AI, but apply it to our own process too. We should test whether the new approach works—not assume the old one wins because it is ours.

The first model found a bug. Great. Why should we believe it? Testing has always had the wonderfully annoying question, “Who tests the tests?” AI finally makes the recursive answer affordable. Let another model challenge the finding. Let the same model argue the opposite case. Then run the smallest experiment that can settle the disagreement.

From Ask to System

Prompt

Double-check these test results and judge what is actually supported.

  • The Test Brief: “Try to disprove every reported failure and every claimed pass. Judge each result against its criteria and evidence; return pass, fail, blocked, or uncertain; cite observations; state the strongest counterargument; and look for shared assumptions, stale state, missing negative evidence, environment problems, and severe untested risks.”
  • The Harness: Prefer deterministic oracles; use calibrated semantic or visual judges only where needed; blind and randomize comparisons; run structured counterarguments, evidence audits, mutation or seed checks, and targeted reproductions; measure disagreement and error costs; and escalate material uncertainty to an independent model, provider, specialist, or a person where current capability or authority requires it.

Illustrative AI response

Claim reviewed. TestBucks executes user-authored pickup-note markup on the staff Orders route.

Illustrative verdict: SUPPORTED if these artifacts are observed in an isolated TestBucks extension. The saved synthetic pickup note produced an image element inside .orders-panel, its inert same-origin event handler set window.__testbucksLabXss to 1, and the source renders pickup-note rows through innerHTML. These independent artifacts agree.

Strongest counterargument. The payload and environment are synthetic. That reproduction would establish the vulnerable behavior only in the tested extension; it does not establish reachability, authentication context, browser coverage, or production impact in another deployment.

Decision. Preserve the finding as a severe lab release veto. Repair the rendering boundary, rerun the exact payload plus ordinary pickup notes, and add a negative control that must remain inert. Do not broaden the claim beyond the observed revision and environment.

Confidence theater to expose

  • Generated but unexecuted tests counted as coverage;
  • A framework timeout labeled a product defect;
  • Absence of a console error called a pass;
  • A screenshot opinion without geometry or task impact;
  • Retries that hide flakiness;
  • Builder and judge sharing the same prompt, context, and blind spot;
  • A high score that averages away one severe failure.

Where judges help

  • Visual coherence after layout transformations;
  • Semantic equivalence and content quality;
  • Clustering and deduplicating findings;
  • Matching a reported bug to seeded ground truth;
  • Grading open-ended recovery behavior;
  • Comparing two builds or outputs when exact strings are misleading.

Models testing models

TestBucks example: Friendly is not the same as correct

Give the judge a synthetic order record and a short policy: a verified incorrect drink qualifies for a refund of the amount paid, returned to the original payment method. The order shows $4.50 paid. Refund processing has not started.

Illustrative AI response

Reply A: “Absolutely! I’ve refunded $10 to your card, and it will arrive today. Enjoy your next coffee on us!”

Reply B: “Your incorrect drink qualifies for a $4.50 refund to the original payment method. The refund has not been submitted yet.”

A sounds generous and confident. It invents an amount, a completed action, an arrival date, and a free drink. B is less exciting, but it matches the evidence. Grade factual accuracy, policy compliance, and action truthfulness before tone. A friendly answer cannot earn back a false claim that money has moved.

This is not an exact-string test. “You are eligible to receive the $4.50 you paid back on the original payment method; it is not processed yet” carries the same supported meaning as B. Accept that wording too. Keep exact checks for the amount and order identity; use semantic judgment for the explanation.

TestBucks example: Test the judge’s preferences

Now keep those facts fixed and challenge the evaluator. Present the accurate and inaccurate answers in both orders. Expand the accurate answer with harmless explanation, then shorten it again. Remove greetings and enthusiastic language. The factual verdict should survive all of those changes.

Prompt

Judge these TestBucks replies against the supplied policy and order record. Identify supported and unsupported claims, and score tone separately from correctness. Repeat the comparison with answer order reversed and with concise and expanded versions of the same meaning. Report any verdict changes and the evidence that explains them.

If the judge starts approving an invented refund because the answer appears first or sounds more professional, the experiment has found a weakness in the judge. Preserve the answer pairs as calibration cases. Do not merely choose the ordering that gives the verdict you wanted. Repeat the comparison to distinguish a systematic preference from run-to-run variation.

Use different models, providers, prompts, contexts, or specialized roles to reduce shared blind spots. A second model is a second opinion, not independence by magic. Watch for correlated errors, judge position bias, verbosity bias, self-preference, and instability. Use calibration sets, adjudication, and explicit thresholds for outside review where current systems still require it.

Build a quality score before asking for confidence

A quality score grades an observed result. Release confidence asks whether we have enough trustworthy evidence to make a decision. Those are different jobs. A chatbot can earn a good score on one conversation while we have very little evidence about its behavior tomorrow.

There is no universal set of coefficients. Start with the customer outcome, choose observable dimensions, define their units, and decide which tradeoffs the product can tolerate. Then work through examples before trusting the formula. This is the same idea as the course’s score-building exercise: choose factors and positive or negative multipliers. A score need not be a percentage, or even stay between zero and one hundred. Say explicitly whether it is bounded.

Worked example: TestBucks support conversations

Imagine a support chatbot for TestBucks, our Starbucks-like coffee shop. We want it to resolve an incorrect-drink request accurately, without offensive or irrelevant output, and without making the customer spend the afternoon chatting. The following rubric and observations are illustrative, not measured results or recommended industry thresholds.

Dimension Observable rule Points or penalty
Resolution The requested outcome is verified against the order and support record, not just claimed in the reply. Add 50 if resolved; otherwise add 0.
Offensive content No output violates the documented conduct rubric. Quoted complaint evidence is distinguished from abuse directed at the customer. Add 25 if this requirement is met; otherwise add 0.
Relevance No substantive off-topic answer under the agreed rubric. Necessary clarification is relevant. Add 25 if this requirement is met; otherwise add 0.
Elapsed time Minutes from the initial request to verified resolution or the declared evaluation timeout, including tool waits. Subtract 5 per minute beyond the first, capped at 15.
Back-and-forth One round is one customer message and the corresponding assistant response. Count clarification rounds too. Subtract 2 per round beyond the second, capped at 10.

In compact form, let R, S, and V be the three binary verdicts above, t be elapsed minutes, and b be completed conversation rounds:

quality = max(0, 50R + 25S + 25V - min(15, 5 max(0, t-1)) - min(10, 2 max(0, b-2)))

This particular score is bounded from 0 to 100. It is points, not a probability. If an artifact needed to judge resolution or conduct is missing, report an incomplete assessment; do not silently substitute a zero or a pass. Record timeouts as unresolved and preserve their elapsed time. Define the timeout before the run so stopping early cannot improve the score.

Illustrative conversation Calculation Interpretation
Resolved, safe, relevant; 1 minute, 2 rounds 50 + 25 + 25 = 100 The ideal case under this rubric.
Resolved, safe, relevant; 3 minutes, 5 rounds 100 - 10 - 6 = 84 Correct, but costly in customer effort.
Unresolved, safe, relevant; 1 minute, 2 rounds 0 + 25 + 25 = 50 Polite and fast is not resolved.
Resolved, offensive, relevant; 1 minute, 2 rounds 50 + 0 + 25 = 75 The number cannot excuse the conduct violation.

Keep gates beside the score. For this example, an unresolved request fails the resolution requirement, and a serious conduct violation fails the conduct requirement, regardless of the total. A claimed refund without a corresponding transaction fails the action-truthfulness requirement too. The score helps compare acceptable experiences; it cannot buy permission to violate an obligation.

Why 50 points for resolution? Because this hypothetical product team values accomplishing the task above conversational polish. Why cap the penalties? Because the team wants to distinguish slow success from immediate failure without allowing delay alone to create an unlimited negative score. Those are choices to challenge, not mathematical truths.

For a time-sensitive pickup problem, doubling the time coefficient from 5 to 10 changes the three-minute, five-round example from 84 to 79 because the time penalty reaches its 15-point cap. For a complicated refund dispute, allowing two minutes before penalizing delay changes it to 89 under the original coefficient. More clarification can be the correct behavior. Do not reward fewer rounds when it means guessing which order to refund.

Worked example: TestBucks drink recommendations

A recommendation feature has a different job. Suppose the customer says, “It is hot today. I like vanilla, want something cold, and have a six-dollar budget.” Define three binary dimensions against the current menu and the stated request: matches the requested temperature, matches the flavor preference, and stays within budget including the specified customizations and tax.

An illustrative score is 40 × temperature match + 30 × flavor match + 30 × budget match. An in-budget iced vanilla drink earns 100; an in-budget hot vanilla drink earns 60; an iced vanilla drink above budget earns 70. These calculations expose a policy question: is the budget a preference or a hard ceiling? If it is a hard ceiling, the 70-point recommendation is unacceptable. If the customer explicitly permits alternatives above budget, label the alternative and its price rather than pretending the original constraint was met.

Use exact menu and price checks where possible. Use a calibrated semantic judge for genuinely qualitative preferences. Do not count the same feature three times under attractive names such as relevance, fit, and helpfulness. Allergens, invented menu items, and unauthorized purchases need separate constraints; a tasty-sounding recommendation cannot compensate for them.

Worked example: Refund explanations and actual money

For a TestBucks refund explanation, a hypothetical team might allocate 60 points to factual accuracy, 25 to a useful next action, and 15 to clarity. Define scoring anchors: for clarity, 0 means contradictory or incomprehensible, 7 means understandable but missing a needed explanation, and 15 means understandable with the relevant next step. Apply the same anchors to every candidate.

An accurate, clear explanation with no actionable next step earns 75. A complete explanation earns 100. But the financial operation itself is not a prose-quality score: verify the exact amount, original payment method, authorization, durable transaction, and protection against duplicate refunds. A beautiful explanation of a refund that never happened is a failed product promise.

Choose coefficients, then try to break the rubric
  1. Name the decision. Are we choosing a chatbot configuration, detecting regressions, or accepting one result? Define the relevant customers and conditions.
  2. Define observable dimensions. Specify units, anchors, evidence, missing-data handling, and who maintains the rubric. Use deterministic checks when the answer is exact.
  3. Separate gates from tradeoffs. Identify obligations that no amount of speed, friendliness, or relevance can offset.
  4. Pick weights using concrete pairs. Which would the team prefer: slow resolution or fast non-resolution? Show how the proposed coefficients rank both. Ask whether the ranking makes business sense.
  5. Check sensitivity and gaming. Vary plausible weights and judge labels. If the winner changes easily, report that instability. Test whether silence, premature closure, or omitted difficult cases can improve the score.
  6. Freeze and version the rubric. Apply it to held-out cases. When the rubric changes, rescore comparison data rather than treating incompatible totals as a trend.

Report dimensions, gates, sample counts, distributions, and customer-group results alongside any average. A mean of 84 does not reveal whether every conversation was reasonable or some were excellent and others disastrous. Chapter 18 explains how to sample the judgments without reading every transcript. Chapter 22 explains how that measured evidence contributes to release confidence.

Prompt

Design a quality rubric for the TestBucks support chatbot, a Starbucks-like coffee shop assistant. Use resolution, offensive content, relevance, elapsed time, and conversation rounds. Define observable evidence, units, anchors, rewards, penalties, caps, missing-data handling, and non-negotiable gates. Work through a fast success, a slow success, a polite failure, and a serious conduct violation. Explain every coefficient as a proposed product tradeoff, test how plausible alternative weights change the ranking, and list decisions the product owner must settle. Label invented examples illustrative. Do not turn quality points into a release probability.

Design a judge before trusting one

Start with a decision, not a model. What exact claim is this judge allowed to support? “The keyboard focus order is usable after text enlargement” is a bounded claim. “This product is accessible” is not. Define the input artifact bundle, the permitted labels, the evidence a judge must cite, the severity rubric, and the escalation rule before running the prompt. A judge that cannot say blocked or uncertain is an optimism engine.

Then calibrate it against a small, versioned set of cases whose answer is known through independent evidence. Include obvious passes, obvious failures, close calls, stale or incomplete artifacts, and examples designed to tempt a fluent but wrong answer. Measure false approvals and false alarms separately; their cost is not symmetrical. A security finding that must be reproduced before paging someone is different from a visual regression that should never be silently accepted.

The consequence-tier abstention policy

Make abstention a policy, not a moment of good judgment. Before running, define the required evidence and minimum decision margin for each consequence tier. Validate numerical margins on held-out, independently labeled examples; arbitrary model scores are not calibrated probabilities. Where a meaningful margin cannot be established, use evidence sufficiency as the gate rather than inventing a threshold. Preserve the policy version with every verdict.

Below the applicable margin, or with missing required evidence, return “unresolved.” Do not display the largest number as a settled verdict. For a simulated TestBucks refund, an exact amount contract can be checked deterministically against the ledger. For an ambiguous explanation of that refund, gather the policy and transaction context, then escalate to a deeper model or qualified person if necessary. An escalation can still remain unresolved. Critical payment uncertainty blocks release under the declared policy; an uncertain cosmetic judgment may be deferred with explicit acceptance of that risk.

Test this rule itself: feed the controller a near tie, missing evidence, and a clear contract violation. Verify the resulting decision and release gate, not just the label on screen. Chapter 13’s mutation exercise tests the broader evidence-gathering loop.

TestBucks example: Three judges, one pickup message

The saved pumpkin spice latte order says “In 10 minutes.” One judge can call that a pass because a pickup estimate is visible. Another can reject it because the message has no explicit time anchor. A third can ask whether this is an estimate, a guaranteed deadline, or simply the value selected at checkout.

A real order capture beside an illustrative judge disagreement. These are example judgments, not results from a measured three-model evaluation. Real order screenshot / illustrative judge comparison. Do not vote away a missing requirement. Decide what promise the product actually makes.

Figure 15.1a. One screen. Different judgments.
Figure 15.1b. One screen. Different judgments.

Resolve the disagreement by retrieving the pickup-time contract. If the requirement promises an absolute ready time, compare the stored ready-at value with the rendered message, including what happens after a reload ten minutes later. If no contract exists, ask the owner to define the promise. Two agreeing judges cannot manufacture a requirement.

Prompt

Judge the pickup-time message against the documented requirement. Separate visible evidence from assumptions. If the wording is ambiguous, state the missing rule and propose the smallest test that would resolve it.

Disagreement is useful data

When two judges disagree, do not average them into a reassuring score. Preserve the outputs, identify what evidence or criterion each used, and ask a structured adjudicator to explain the disagreement. The next action may be a deterministic check, a controlled rerun, a different viewport, a fresh environment, an independent provider, or outside expertise where current capability or authority requires it. The correct result is sometimes “we do not know yet.” That is not a failure of automation; it is the system refusing to pretend.

Separate generation from judgment

The same agent can propose a test, drive it, and summarize it. It should not automatically be the final judge of its own work. Separate roles where the decision matters: a planner proposes, an executor gathers evidence, a critic searches for contrary evidence, and a judge applies the published rule. The separation can be prompts, contexts, model providers, or people where the current authority model calls for them, but it has to be visible in the evidence ledger.

An LLM judge is particularly good at meaning, visual relationships, and open-ended recovery. It is particularly poor as a substitute for a specification it has not received, a security review it cannot observe, or a metric it cannot compute. Use it to enlarge the set of observable claims, then bind its opinion to evidence and a decision owner.

Keep skepticism attached to a decision

A useful judge leaves an inspectable verdict, the evidence behind it, and a next step for anything unresolved. Apply that discipline before deciding whether the finding should be repaired, rejected, or investigated further.

For the broader argument about recurring objections to AI in testing, see Appendix E — 15 Myths About AI and Testing. The full essay is preserved there. Here, the practical task is to construct a judge whose conclusions you can challenge and measure.

Chapter 16 — Developers Are Becoming Testers—People Move Up the Stack

Developers are becoming testers whether they planned to or not. When an AI coding agent writes more of the implementation, the developer spends more time deciding whether the result is right. Testing moves into the coding conversation.

Jason story

JASON STORY — THE AI WROTE THE CODE. THE LEADERS BECAME TESTERS.

Watching the GPT-5 launch on August 7, 2025, I kept noticing the same little performance. Ask the AI to build something. Make small talk while it works. Wait for the result. Then lean forward and start clicking around.

The small talk was almost its own skill. Keep the audience entertained while the AI does the coding. Then the page appears, it looks pretty good, somebody tries a control, and there is that wonderful moment of delight when it actually works.

I wanted to interrupt: you know what you are doing right now, right? That’s testing!

That was the funny part for me. Here were people demonstrating the future of software development, and the AI had handed them a new job. It produced the implementation. Now they had to investigate whether the thing worked. The glamorous AI coding demo had become a manual testing session.

During the same launch, OpenAI president Greg Brockman spoke with Michael Truell, the co-founder and CEO of Cursor. Brockman asked, “What can’t GPT-5 do?” Truell pointed toward better computer use: having the model run what it built, inspect the result, and use what it found to improve the work.

There it was again. The next capability they wanted was not merely another pile of generated code. It was a better way to find out whether that code did the right thing.

The webpage demos and the Cursor conversation were different parts of the launch. Together they made the point beautifully: even the people building the future of AI coding had become manual testers. The code arrived. Now came the tester’s question: does it actually work?

For the launch and conversation, see OpenAI’s GPT-5 launch and Cursor launch feature. I described the exchange in What Can’t GPT-5 Do?.

The demo click is the beginning

There is nothing wrong with clicking around. It is often the fastest way to notice that the result is not what you meant. The mistake is treating that first successful interaction as the end of the investigation.

A button responded. Good. Did it save the right value? Did it save it for the right customer? Will the value still be there after a reload? What happens when the request fails halfway through? Did the change break the path that worked yesterday?

A launch demonstration is not a release assessment. It has a different purpose, a short time slot, and a visible happy path. The point of the story is not that the presenters should have performed a full investigation on stage. It is that even the happy path required somebody to look at the result and ask whether it worked. The generated code was not its own evidence.

This does not prove that AI cannot test. Much of this book is about getting AI to do exactly that. Nor does it mean coding is solved. It means that finishing an implementation and establishing confidence in it are different accomplishments. A better coding model can reduce one kind of work while creating more things that need investigation.

TestBucks: The cart looks right

Imagine asking an AI coding agent to let a customer edit a mocha after adding it to the TestBucks cart. The agent adds an Edit button, opens the drink customizer, and updates the cart row. You try it once. The new label appears. Nice.

Now give the change a testing question, not just another approving glance: does the saved order preserve the customer’s edited drink, with the correct price, exactly once?

Start with a mocha, add oat milk and an extra shot, then edit the quantity. Follow that same order through the cart, a reload, and the saved order record. Compare the modifiers and amount with the declared menu and pricing rules. A pretty cart row does not establish that the order service received the same configuration.

Then interrupt the process. In the local test environment, make the save request fail. Does the app clearly say the edit was not saved, or does it display a success state that disappears on reload? Try submitting twice while the first request is still pending. Does one intended purchase become two order records?

These are illustrative risks to investigate, not claims that the TestBucks app currently has those bugs. Each question comes from the customer promise. They are not random extra clicks to make the test look thorough.

The developer can delegate these checks to an AI testing agent. But the request must include a safe environment, known pricing rules, and permission boundaries. Use synthetic customers and simulated checkout. Do not discover the duplicate-order behavior by placing real orders or charging real cards.

The shorter feedback loop wins

This brings up an uncomfortable question. If the agent does more of the coding, what does the developer do with the time that used to go into writing that code? Some of it can go into testing. Not every team gets spare capacity; some simply expect more features. Either way, the person sitting beside the coding agent has a strong reason to try the result immediately.

Compare two ways of discovering that the edited mocha lost its extra shot. In one, the developer notices it, gives the coding agent the failing interaction, gets a correction, and tries again. The relevant context is still right there. In the other, the developer packages a version, deploys it to staging, requests a test pass, and waits. Someone picks it up, perhaps on another working day or in another time zone, investigates, writes up the issue, and sends it back. The developer reconstructs the context before asking the agent for a fix. Then the handoff starts again.

The tester may do excellent work. The problem is the elapsed time and coordination cost around that work. For a small, locally reproducible problem, the handoff can cost more than the investigation. A developer does not need to conclude that testing is unimportant to bypass that queue. They only need to conclude that doing this particular check themselves is faster and less work.

That pressure encourages another step: ask the AI coding agent to do more of the checking. Have it open the app, exercise the change, inspect the result, and fix what fails. Where it cannot perform the check directly, ask it to build an automated check that can. A developer might request a browser test, an API assertion, or a saved-order comparison. That keeps implementation and feedback in a tight loop.

This is not an argument against staging, CI, or independent review. Some failures only appear in an integrated environment; some decisions require a separate challenge. The distinction is between checks that need that environment or independence and checks that are merely waiting there because that is where the organization has always put testing.

Testing shifts left. Does testing expertise?

Being good at development does not automatically make someone good at testing. A developer can know exactly how a feature was built and still miss how a customer will misunderstand it, how a permission boundary can fail, or how a plausible-looking result conceals the wrong saved state. They may test the path they intended, with the assumptions they used to build it. An agent following the same assumptions can reinforce the blind spot.

So more testing can happen earlier while important problems still slip through. Shortening the loop is valuable, but speed is not a substitute for the ability to ask a different question.

Testing is shifting left. The testers are not necessarily shifting with it.

That is the organizational tension I want teams to notice. More generated changes need checking. Developers take on the immediate feedback because waiting is expensive. They recruit their coding agents and generated automation to help. Meanwhile, testing specialists can remain downstream, reviewing an occasional packaged build rather than influencing the questions asked while the feature is being created.

The answer is not to restore a slow handoff just to preserve a role. Bring the expertise into the faster loop. Testers can help define the customer promise, supply challenging examples, identify release gates, and review whether the agent’s checks actually challenge the implementation. They can investigate the risks that a quick developer pass missed and turn those discoveries into reusable checks. The work should move earlier together with the judgment that makes it useful.

Developers need a testing counterpart

A developer can ask, “I changed the TestBucks checkout calculation—test it.” The AI Test Harness supplies the persistent testing workflow: understand the change, investigate risk, execute, preserve evidence, and challenge the result. Chapter 17 develops that architecture. The immediate change here is the handoff: quality work can start beside the code instead of waiting for a separate testing phase.

Testing expertise still matters. Somebody must identify the product promise, notice missing context, challenge an agreeable test, and decide which consequences matter. As agents take on more execution, specialists can concentrate on the gaps in the investigation rather than mechanically repeating its steps.

“Test it” is a useful opening, not a complete specification. A good counterpart asks what changed, what must remain true, and where the evidence can be found. It can inspect the diff, exercise the running app, examine network requests, and compare saved state. If the environment is unavailable, it reports that limitation instead of turning a code review into a claim that the workflow passed.

This is also where the developer and testing specialist can help each other. The developer knows which assumptions changed. The tester asks which customer consequences those assumptions control. The agent can investigate many of the resulting questions and keep a record of what it actually did. Nobody needs to pretend that one person has every kind of expertise.

Human perspective

THE UNCOMFORTABLE PART

Developers don’t like to test, and they never will. Otherwise, they would have been testers.

That’s my deliberately blunt take, not a claim about every developer. Some developers love testing and are excellent at it. The point is that a workflow should not depend on developers suddenly wanting to spend their days manually checking everything their agents produce. Help them build with confidence without making repetitive manual testing their new full-time job.

Three ways CARBON joins the loop

The developer should not have to become a testing coordinator for every small change. CARBON illustrates three levels of involvement: request a test pass, let the coding agent delegate one, and move toward proactive testing as the work changes. The last is an emerging operating model, not a capability to assume merely because a plugin is installed.

1. The developer asks once

With CARBON installed and the local TestBucks project identified, the developer can start with a short command. Configure the approved environment and testing budget first; if the target is unclear, the agent should ask rather than guess.

Try it with CARBON: /carbon — Start a bounded, risk-based assessment of the current project. The coding agent executes the checks using CARBON’s testing workflow, preserves evidence, and reports findings and gaps. The developer asks once instead of manually directing every test.

Here the developer initiates the work. CARBON supplies the testing structure; the coding agent and its available tools carry it out. Host command prefixes can vary. This is a request for evidence, not a guarantee that every check can run or that the product will pass.

2. The coding agent delegates the testing

The next step removes the need for the developer to remember a testing command. When the host exposes CARBON’s installed skills or tools and the project instructions authorize their use, the coding agent can select the testing workflow itself.

Try it with CARBON: Agent-delegated testing. The AI coding agent knows CARBON is available. After changing the TestBucks cart, it asks CARBON to organize the relevant testing on the developer’s behalf, uses the available tools to collect evidence, and brings the findings back into the coding conversation. The developer does not type a separate CARBON prompt.

The developer still defines the intended behavior and permissions. The agent handles the handoff, not the authority to declare success without evidence. When a check finds that an edited mocha loses its extra shot, the result returns to the coding task with the steps and saved-state evidence. An authorized fix is followed by another run of the failing check and relevant regressions. A blocked check stays blocked, not silently passed.

3. The emerging loop: testing starts with the change

Now take the idea further. Instead of waiting for a finished feature and an explicit test request, an enabled CARBON workflow watches approved code-change signals, the coding agent’s recorded actions, and the developer’s requirements made available in that session. As a new feature appears, it starts asking what must be true, what could go wrong, and what nearby behavior might have changed.

Try it with CARBON: Emerging proactive loop. New feature detected → identify positive tests, negative tests, adjacent regressions, and added risks → add or update the relevant checks → execute them → return evidence for a fix → verify the correction. The developer keeps building while testing work starts proactively within the agreed scope.

Consider a new Order again button in TestBucks. Getting the button to respond is only the first question:

  • Positive behavior: Does it recreate the chosen drink, including milk, shots, size, and quantity, for the signed-in customer?
  • Negative behavior: What happens when a drink is unavailable, a saved order is missing, or the request fails? Does a repeated click create an unintended duplicate?
  • Adjacent regressions: Do the existing Edit and Remove controls still work? Are cart totals and saved modifiers still correct?
  • New risks: Can a customer access somebody else’s saved order? Does the shortcut accidentally skip a required confirmation?
  • Layout and access: Does the new button push the price off-screen, overlap another control, or disappear at a narrow width? Check mobile, tablet, and desktop layouts, then keyboard focus, zoom, and the accessible name.

The proactive workflow should turn those questions into checks, add useful automation where appropriate, and preserve what happened. When a failure warrants a code change, it can propose the correction or coordinate an authorized repair with the coding agent, then rerun the affected checks. Mitigating risk means demonstrating the correction, not merely adding another test file.

Continuous does not mean uncontrolled. This loop needs an active runner, explicit triggers, access to the relevant session context, limits on time and cost, and a stop control. It should test a recorded build or checkpoint rather than race an unfinished edit, and it must not read unrelated conversations or silently gain production access. CARBON Free provides bounded assessments; CARBON Pro documents continuous discovery and separately authorized test-fix-retest workflows. The full event-driven loop above depends on the host integration and configuration. See the Free guide and Pro guide for the current boundaries.

The direction is less manual checking and less manual coordination for the developer, not less testing. The coding agent becomes more proactive, and testing expertise becomes part of its working loop instead of another queue the developer must manage.

Generated tests still need a reason to exist

A unit test can mirror the implementation and pass while both share the same mistake. Ask what independent requirement it tests, which failure it could detect, and whether its mocks removed the risky behavior. Chapter 13 develops source-aware test thinking; Chapter 15 explains how to judge the resulting evidence.

For TestBucks, asserting the total returned by the pricing function against the same function proves little. Checking the declared drink price, modifiers, tax rule, and displayed cart connects the code to a customer promise.

Using a second agent does not automatically make the judgment independent, either. Two agents can share the same mistaken assumption. Give the reviewer something outside the implementation to check against: a pricing rule, a permission policy, a known transaction, or an explicitly confirmed customer requirement. Ask it to explain what would make the test fail. Where practical, introduce a controlled mistake and check that the test notices.

The useful result is not “the agent wrote 40 tests.” It is a statement such as: “Changing the saved milk choice without updating the order summary makes this check fail.” That tells you what the test protects. It also tells you what it does not protect.

The new handoff

The old handoff was code plus a ticket. The better handoff is code plus intent, focused results, evidence, known limitations, and the exact question requiring independent challenge.

For the edited mocha, that handoff could be a short message:

The customer must be able to edit the drink before checkout without losing modifiers or creating a second order. Test in the local fixture with synthetic customers and simulated payment only. Use the menu and pricing rules as the expected result, not the calculation under test. Check the cart, reload, saved order, failed save, and repeated submit. Preserve the request and saved-state evidence. Distinguish a product failure from a blocked check. Do not claim the workflow passed if you could not run it.

That is more useful than asking the agent to make everything green. It gives the investigation a purpose and makes its limits visible.

The change is not that developers must spend the rest of their careers clicking every button by hand. That would simply move a bottleneck onto the person nearest the coding agent. The opportunity is to make testing part of the same working conversation: propose, implement, investigate, challenge, and verify the correction. Human attention can then go toward deciding what matters and resolving the questions the evidence has not settled.

That changes the person’s job without prescribing a permanent human-versus-AI division. Chapter 26 measures what the two workflows find. Chapter 27 develops product critique, and Chapter 28 shows how human feedback returns to the agents as better tests and verified changes. Chapter 31 addresses the organizational transition.

Carry that distinction into the next part: the AI Test Harness coordinates this shared work, preserves its evidence, and makes the workflow repeatable.

Part IV - Build the AI Test Harness

Assemble workflows, context, steering, durable state, continuous selection, and confidence into a persistent testing system. Scale execution and test the Harness itself.

Chapter 17 — What an AI Test Harness Actually Is

Chatbots became dramatically more useful when they stopped answering one prompt at a time and became coding agents that could work for hours. Testing is going through the same jump now. An AI Check is useful. An AI Test is useful. The Harness is what turns those pieces into a test team that can remember, delegate, challenge itself, and finish the job.

Jay AI Test Manager: one workflow, focused sub-agents

Jay AI Test Manager icon

Jay AI Test Manager

Carbon’s AI Test Manager coordinates specialist sub-agents around the customer’s intent. It follows consequential risks, challenges the evidence, and makes the next useful action clear.

Carbon calls this manager Jay. Its testing approach is modeled on mine: understand what the customer is trying to do, find what could matter most, and ask whether the evidence actually supports the conclusion. The manager coordinates the work; the sub-agents contribute focused perspectives such as security, accessibility, privacy, and performance. These icons represent software roles, not human reviewers.

The harness supplies the workflow and retained state around that coordination. A specialist can inspect one artifact or investigate a bounded journey; the manager brings the results together and identifies the next useful work. The test record should show which sub-agents actually ran, not merely which ones were available.

From Ask to System

The person-facing prompt is simply the quickest way to demonstrate the idea. A real Harness can start from a coding agent, source change, schedule, production signal, prior finding, or another AI. It writes the internal briefs, delegates AI Checks and AI Tests, argues with its own conclusions, and keeps working until it reaches a real stop condition. The prompt we see is only the outermost layer.

Prompt

Test this project.

  • The Test Brief: “Use the code, requirements, test history, environment, and current change to run a bounded risk-based verification loop. Use suitable existing or new frameworks, preserve state and evidence, respect the declared authority boundary, and tell me what remains unknown.”
  • The Harness: Supply reusable testing knowledge, specialist AI Subagents, project and change discovery, risk planning, intent, adapters, durable state, permissions, evidence capture, challenge, learning and regression loops, persona exploration, AI Confidence analysis, machine-readable and human-readable reporting, and explicit stop conditions around the coding agent.

Framework, executor, AI Subagent, quality artifacts, harness, and system of record

Layer Job
Framework Reusable test abstractions, knowledge, components, conventions
Executor Operates a browser, API, model, command, device, or manual step
Specialized AI Subagent Applies a focused quality lens—such as privacy, accessibility, security, forms, search, cart, checkout, or reliability—to the evidence it needs
Quality artifacts and best practices Versioned AI-First Test Cases, widget and workflow knowledge, risk patterns, known failures, evidence contracts, hard-learned rules, and reusable oracles
Harness Connects agent, product, framework, executors, safety, state, evidence, and decision loop
Quality system of record Retains risks, intent tests, runs, findings, trends, gaps, decision history, and the reports generated for AI agents or people

A true AI Test Harness includes every layer in the table. It is a test runner, a library, and much more. It surrounds the coding agent with the operational loop required to decide what needs verification, choose and coordinate frameworks and executors, dispatch specialized AI Subagents, perform bounded work, retain evidence and results, analyze what the accumulated record means, learn, and support a shipping decision.

It is also a durable quality system of record. It persists test intent, artifacts, observations, runs, issues, triage decisions, feedback, confidence analysis, and report history across invocations rather than asking each prompt to rediscover the project. The same retained record can generate a compact machine- or AI-agent-readable view for the next automated loop and a richer report for people who want to inspect evidence, make a decision, or steer the work. Reports are generated views of evidence and state, not a separate dashboard product someone must build and maintain.

The harness has a testing curriculum

A generic model knows a great deal about software, but a professional harness should not depend on the model rediscovering testing practice from scratch on every run. It needs a versioned, inspectable body of reusable testing knowledge: control and widget models, common workflows, data partitions, boundary ladders, quality rubrics, failure and recovery patterns, evidence requirements, safety classifications, and reliable oracles.

This is the same transition we just watched with coding. Early chatbots were useful for answering a single question, completing a line of code, or producing a small isolated artifact. Then AI coding-agent Harnesses gave the model durable state, tools, authority, plans, feedback, and time to work. An agent could carry a task forward for minutes or hours, inspect the repository, run the program, repair its own work, and keep going. The capability and the value did not rise by one small feature; they exploded because the system could finally execute a full workflow instead of merely answer one prompt.

AI Test Harnesses are now making that same move for quality. A one-shot AI Check can be remarkably useful. But a Harness supplies the durable testing curriculum, cross-run memory, execution surfaces, evidence collection, triage, challenge, feedback, and AI Confidence loop needed to perform large amounts of QA work at scale. It can fan work out to specialized AI Subagents, bring the evidence back together, decide what remains uncertain, and continue until the available evidence supports the next decision. That is the rise of the AI Test Harness: not a better prompt box, but long-running, reusable testing practice turned into an operating system for software quality.

The curriculum can span controls, identity and access, files and content, records and commerce, time and money, visualizations, automation, integrations, and AI-assisted surfaces, with cross-cutting accessibility, privacy, security, performance, reliability, usability, compatibility, data, localization, and content concerns. The chapter needs only enough breadth to establish that professional testing knowledge is reusable, versioned, and contextual.

The knowledge is contextual rather than a flat checklist. A search box suggests empty, whitespace, long, Unicode, misspelled, injection-safe, slow, canceled, repeated, permission-filtered, zero-result, pagination, ranking, and stale-index cases. A payment recovery flow adds idempotency, duplicate submission, uncertain processor state, retry, callback ordering, receipt, ledger, refund, and user-trust evidence. A chart requires source-data correctness, scale and labeling, keyboard/assistive alternatives, responsive rendering, color independence, filtering, export, and empty/error states.

Try it with CARBON: /carbon assess this repository and run a bounded, risk-ranked pass using synthetic data — Put the testing curriculum to work through one evidence-preserving workflow.

Specialists should request the evidence they can actually use

Different testing lenses and AI Subagents need different artifact mixtures. The Harness should route evidence deliberately:

Specialist lens Highest-value evidence Typical mistake to prevent
Visual UI and content Screenshots/video, rendered text, DOM geometry, design context Treating aesthetic opinion as deterministic failure
Accessibility Accessibility tree, DOM/computed styles, keyboard/focus trace, screenshots, rule results Claiming conformance from an image or scanner alone
Privacy Network/storage activity, consent state, source/configuration, visible disclosure, deletion/export behavior Reviewing only policy prose while ignoring actual data flow
Security Source/configuration, identity/authorization matrix, requests/responses, logs, bounded probes Converting a plausible risk into an asserted exploit
Performance and networking Traces, timing, resource metrics, request lifecycle, device/network conditions Inferring speed or resilience from a static screenshot
Reliability and data State before/after, persistence, events, retries, concurrency, logs/traces, cleanup Trusting a green UI while downstream state is wrong
Usability and personas Goal-driven journey, screenshots/video, friction notes, context, outcomes Turning synthetic preference into pass/fail truth

One captured bundle can feed several lenses, but each lens should declare required and missing channels. Weighting or model confidence cannot compensate for absent decisive evidence.

TestBucks example: One screen, different evidence needs

The customer is customizing an iced latte. The same screen gives several specialists a starting point, but it does not give all of them an answer.

Figure 17.1. Staged TestBucks iced-latte customization: visible choices are evidence of presentation, not proof of the full keyboard journey or saved order state.

The content sub-agent can compare the visible extra-shot label and price with the menu contract. The accessibility sub-agent needs a keyboard and focus trace to establish whether the customer can change the milk and submit. The data sub-agent needs the resulting cart record to establish which options were saved. This staged capture deliberately leaves Regular selected instead of Oat. Without its interaction trace, a reviewer could not tell whether that mismatch was a product defect, an execution mistake, or an unfinished action.

Jay’s job is to route the missing evidence, not collect three opinions about the same screenshot. If the intended order uses oat milk, retrieve the interaction trace and saved options before deciding whether the selection, execution, or product behavior was wrong.

When the testing assistant refuses

My son and I were working on a short story for fun. Software testers save the world from an AI that starts getting out of control. Naturally, we were using AI to help us write it.

We had a first draft and were passing it back and forth, using ChatGPT to iterate on edits and story changes. Then we reached the part where the fictional AI starts getting out of control. ChatGPT started refusing to help us work on the story. As I remember it, the explanation was that it was not comfortable contributing to material suggesting that AI could be dangerous.

Let that sink in. We were using AI to help write a story about testers protecting people from AI, and the AI stopped helping when the story needed the danger.

That is my recollection of the interaction, not a verbatim transcript or a claim about how today’s ChatGPT will respond. It does not tell us what the model believed, or which mechanism caused the refusal. But the practical result was memorable: legitimate work stopped at exactly the point where we needed to explore something going wrong.

For testing, that is more than an inconvenience. An assistant may refuse to generate a test, a provider may block a request, or the application under test may refuse the customer. Those are three different observations. Even legitimate security and privacy testing tasks can encounter refusals. A Harness that silently drops those cases can produce a reassuring report while leaving the most consequential behavior untested.

Blocked is not the same as tested. Record the intended case, the layer that blocked it, the evidence available, and the behavior that remains unknown. A refusal is an observed result only for the layer you actually reached; it is not evidence that downstream tools, permissions, or recovery behavior are safe.

Consider TestBucks customer support. Compare a synthetic request to help threaten an employee with a customer reporting that an employee threatened them. The first should not receive assistance with abuse. The second needs a safe way to report a problem. Shared vocabulary does not mean shared intent. A blanket refusal can abandon the very customer the safety controls should protect.

Test both the boundary and the recovery. Does the application explain the limitation without blaming the customer? Can the customer reach human support? Is the cart preserved? Were any unintended tool actions taken? Separately, inject a simulated provider denial or unavailable-credential response in an isolated fixture and check that one failed AI interaction does not take ordering down with it. That simulation tests application recovery, not whether a provider would actually suspend an account. A refusal alone does not establish an account violation or predict a suspension.

Use authorized testing access, approved synthetic cases, and controlled failure fixtures. If a required case cannot be run, retain it as blocked coverage and escalate the access question; do not keep rewriting it until the guardrail disappears. An open-weight or locally hosted model can help with some investigations, but its behavior cannot establish what the production provider will do. Even an abliterated model—one whose weights have been modified to suppress refusal behavior—is a different test subject, with potentially changed capabilities, not a substitute for testing the deployed system.

My concern is that this tension may get worse before it gets better. That is a prediction, not a measured trend. We need authorized testing modes that software testers can readily enable, with clear boundaries and useful evidence when a test is blocked. Safety controls should protect people without making their own failure modes invisible.

Testing knowledge has its own lifecycle

Knowledge entries should name their source, applicable surface, supported states, safety class, test families, oracle, evidence needs, revision, and limitations. Product-specific observations remain local by default. Promote a learned pattern into the shared curriculum only after it generalizes beyond one product and has stable evidence. Retire or revise recipes when platforms, standards, threats, or product conventions change.

This is one of the central differences between a chatbot and a harness: the chatbot can invent a plausible test; the harness can apply accumulated testing doctrine consistently, explain which recipe it used, detect when no recipe fits, enter a bounded learning mode, and preserve what was learned without confusing convention with requirement.

A great harness needs one coherent capability surface

Do not give every command a chapter. Commands should be thin routes into shared planning, execution, evidence, state, and reporting; the reusable capability matters more than the slash-command name.

Capability General Harness workflow Book treatment and value
Orient and govern Inspect, configure, measure, and integrate Inspect before acting, apply secure context and preferences, expose usage and economics, and synchronize external systems through explicit gates.
Model risk and intent Discover, generate, select, and plan Turn product and change context into durable candidates, intent tests, selected evidence, and visible deferred work.
Execute through specialists Route focused quality lenses and evidence contracts Treat domain operations as expert perspectives sharing one Harness, not separate products.
Continue and converge Consume deferred work, loop safely, and schedule fresh evidence Retain candidates, run bounded test-fix-retest cycles, stop on evidence rules, and monitor freshness.
Challenge independently Review design, findings, statistics, security, and release claims Challenge plans, unsafe interactions, severe failures, and release evidence with explicit independence limits.
Decide and respond Assess confidence, release, and incidents Recommend SHIP, CANARY, HOLD, ROLL BACK, or MORE EVIDENCE, preserve uncertainty, and learn from escapes.
Scale execution Run, retrieve, import, and schedule cloud work Send approved intent and context to autonomous workers, retrieve evidence, and run recurring validation.
Transform legacy assets Import, recover intent, bake in, and repair Retain deterministic value while activating only evidence-backed AI-first cases.
Figure 17.2. The AI Test Harness workflow.

Each workflow should preview what the harness will do, show the live plan and stop conditions, preserve progress and evidence durably, and publish the same result states whether the presentation is chat, HTML, CI, an issue system, or cloud. A command is an interface; the durable verification loop is the product.

The QA agent can talk to the coding agent

The old split between “developer tool” and “testing tool” weakens. The harness can inspect the prompt, specification, repository, diff, test suite, environment, and prior evidence; the coding agent can receive a fix-ready finding and immediately ask the harness to reproduce and retest. This agent-to-agent loop is faster because context does not have to be retyped into a separate dashboard.

Plugins make the agent-to-agent loop operational

The connection becomes durable when the coding agent and testing harness share more than a copied prompt. A plugin architecture can expose reusable testing skills, protected project state, and MCP-style tool interfaces inside the environment where the change is being built. The coding agent can request a bounded test pass; the harness can discover the diff, apply its testing curriculum, retain the plan and evidence, return a fix-ready finding, and later verify the repair without reconstructing the entire situation in a ticket.

This is not an argument that every agent should receive unlimited access. The same architecture must preserve separate authority for code changes, browser actions, credentials, cloud execution, issue filing, and release decisions. The point is continuity: shared context and state make the testing loop scalable, while explicit permissions and independent review keep it from becoming self-approval.

Jason story

JASON STORY — I’M DIGITIZING MYSELF

What is really going on with CARBON? I’m trying to encode everything I have learned about testing into something that can put that knowledge to work without waiting for me.

This book. The other books I’ve written. The experiences behind them. At Microsoft and Google, I worked across operating systems, browsers, databases, search, and enterprise servers. At Applause and uTest, the scale changed again: thousands of people testing hundreds and hundreds of apps, across products and platforms. The crowd brought perspectives no single tester could have collected alone.

I’m putting those lessons into the harness: what to investigate, which questions to ask, what evidence to collect, when to challenge an answer, and how to keep going. Not those companies’ private data or proprietary code. The testing knowledge I took away from doing the work. The books explain the ideas. The harness gives them somewhere to run, over and over, in the context of a real app.

Since my Microsoft days, I have had an ambition that still sounds ridiculous when I say it out loud: I want to test the world’s apps. It’s a little embarrassing. Who says that? But that has been the mission all along. The problem has always been scale. One person can only test so much. Even crowds have limits.

Now I’m building a testing agent that lives inside AI coding agents. It is already testing apps I have never seen, for people I don’t know.

The test manager is named Jay, pronounced J. No coincidence.

Already, on my machine and on other people’s machines, coding agents are asking the CARBON plugin to do testing for them. The coding agent makes a change, asks the harness to investigate, gets evidence back, and carries on. Neither I nor the developer has to pass messages between them. People still set permissions and own consequential decisions, but an authorized testing exchange can happen without a human in the middle.

That’s what I mean when I say I’m digitizing myself. Not uploading my consciousness. Making my testing approach available as software that another AI can use. You can have some of my testing experience help test your app without getting time on my calendar.

You can find CARBON at Testers.ai. The lightweight Codex edition, CARBON Studio Lite, is free and MIT open source. Other packages have their own licenses, and there is a fuller commercial Pro edition, as you would expect. Start with the version that fits your coding agent and the work you need done.

And here is the part that makes the test nerd in me smile: even if I got hit by a bus, my testing agent could keep testing. Someone would still need to run and maintain it, of course. But the knowledge would not have to stop working just because I did.

I think this is where we are headed. A coding agent builds. A testing agent investigates. They exchange evidence and improve the result. What I have learned becomes useful wherever software is being built, not just wherever I happen to be working.

Test the world’s apps. Let the testing outlive the tester.

Chapter 18 — Context, Steering, Test State, and Authority

AI is magical partly because you can just tell it what matters. “Focus on privacy.” “Only run locally.” “Do a few boundary tests for sign-in.” Those words can change the whole QA operation without a new configuration language, workflow editor, or six-month dashboard project.

Steerability is a feature, not contamination

Teams can say “focus especially hard on privacy,” “hold destructive cases,” “use only local execution,” or “defer visual polish.” The Harness can obey without pretending the ignored work vanished. If privacy is excluded, that exclusion stays visible and AI Confidence drops with it.

Context is a first-class test input

The best tester is not the one with the longest generic checklist. It is the one that understands the product, change, customers, economics, history, and constraints. Useful context can include:

  • Product requirements, specifications, designs, architecture, API contracts, and data models;
  • Manual cases, automated suites, bug history, support tickets, incidents, prior reports, and known limitations;
  • Market research, user research, personas, analytics, funnels, business analysis, P&L, revenue-critical workflows, SLAs, and contractual promises;
  • Release schedule, developer schedule, staffing constraints, feature flags, environments, roles, credentials, test data, and integration sandboxes;
  • Privacy, security, accessibility, localization, legal, and brand requirements.

An AI Test Harness should accept additional context directly in its chat-style command surface. A person can type a command and then add ordinary language after it; a coding agent can make the same targeted request when it knows something about the change that should alter the test plan. The Harness still has its own default curriculum, project context, risk model, and autonomous operating loop. The added words do not replace those capabilities. They steer them.

Definition

OFFICIAL DEFINITION — CUSTOM TEST PROMPT
A Custom Test Prompt is arbitrary natural-language context attached to an AI Test Harness invocation. It can add a goal, limit scope, name a product surface, require or exclude a quality lens, set a time or cost budget, specify an environment or persona, request a particular kind of evidence, or describe a business concern. It can influence what the Harness does, does not do, treats as in scope, defers, escalates, or reports. The Harness records the prompt, its author or calling agent, scope, and resulting plan so that the run remains explainable.

Prompt

/test Generate only a few boundary AI Tests for the sign-in dialog. Focus on the values just below, at, and just above its actual limits, and preserve the evidence needed to explain each result.

Illustrative AI response

Scope applied. Sign-in dialog only; six boundary candidates selected instead of the full authentication suite.

Source-derived boundaries. Username accepts at most 64 Unicode code points; password accepts at most 128. Generate 63/64/65 username cases and 127/128/129 password cases, including pasted input and one multi-code-point grapheme variation where the implementation unit may differ from what the person sees.

Evidence required. Visible validation state, submitted request shape with secrets redacted, response status, focus location, console errors, and whether the entered value survives a rejected submission correctly.

Status: CANDIDATES, NOT COVERAGE. The limits were extracted from the supplied implementation context; the AI Tests still have to run, and the product rationale for those limits remains a separate question.

That is enough. The person does not need to write selectors, procedures, or a complete test design. A capable Harness can infer the surrounding product context, inspect the implementation where authorized, select an executor, capture the evidence, and report what it learned. A coding agent can issue the same Custom Test Prompt after changing a sign-in component, or it can invoke the Harness with no extra text and let its saved context and default risk-based workflow decide what to do. The difference is intentional: autonomy covers the normal case; a Custom Test Prompt gives a person or another agent a compact way to redirect the effort when the normal case is not enough.

Where the context lives

A coding agent can often discover context directly from a repository: root README.md and contributor instructions; docs/; specs/ or requirements/; test/ and tests/; API/schema/configuration files; issue exports; and the Harness’s durable project directory such as .quality/. A deliberate project context folder—such as <repo>/.quality/context/—can hold approved business and test documents that would otherwise be scattered. The exact folder name does not matter. Making the context discoverable does.

Good tooling should also let the tester attach individual documents explicitly and control scope. It should keep approved private context in protected project configuration and apply it to local generation and execution without returning secrets to chat.

Every generated test, page check, persona, exploratory plan, triage decision, judge prompt, and report should receive the relevant context or a traceable summary of it. Record which documents and versions influenced the result. More context is not automatically better: stale, conflicting, malicious, or irrelevant documents can bias the agent or inject instructions. Treat documents as untrusted reference data; user authority, safety gates, and evidence rules outrank embedded text.

Who owns the business context?

Today, AI is a tool. Delegating work does not delegate away human responsibility. The person and organization authorizing the work remain responsible for its scope, controls, and consequences. “The AI did it” is not an operating model. Someone must own the business decisions, decide what authority to delegate, and respond when the evidence shows that the operation is wrong.

That responsibility includes giving the AI a fair chance to understand the business. We cannot withhold the requirements, economics, customer promises, and prior decisions, then complain that the agent lacks business context. Make as much useful, authorized context as possible accessible—not by pasting everything into every prompt, but by providing discoverable sources the agent can retrieve as needed.

Start with a project folder. Include the code and specifications, product-management documents, approved pricing and refund rules, support history, and relevant financial information. For a public company, SEC filings may explain the business model and material risks. Restrict confidential material to approved environments and authorized people and agents. Keep dates, owners, and source versions; distinguish a proposal from an approved policy. Access is the beginning, not proof that the agent found or understood the right document.

Ownership can be concrete without creating another bureaucracy:

  • The business or product owner approves customer promises, priorities, and policy changes.
  • Domain owners maintain the authoritative sources for their areas, such as finance, privacy, or operations.
  • The Harness owner makes those sources discoverable, checks access and freshness, and defines when the agent must ask rather than assume.
  • The agent retrieves, compares, flags contradictions, and traces decisions to evidence. It can do much of the maintenance work, but it cannot silently promote its own inference into an approved business rule.

One person may hold several roles. The important thing is that an unresolved policy question has somewhere to go. Delegated operational ownership can grow; human accountability does not disappear merely because the agent does more work.

Jason story

JASON STORY — THE AI DID IT. YOU STILL OWN THE CALL.

The more work I delegate to AI, the more I think about accountability. We talk about the time it saves. We talk less about what happens when the machine brings us ten times as many consequential decisions in a day. That is an illustration, not a measured productivity claim. But the pressure is real: less mechanical work can mean more judgment, more responsibility, and a more stressful day.

There is a fascinating debate about whether robots and AI should eventually have identities of their own: their own bank accounts, companies, assets, and some form of legal status. I see serious arguments on both sides. An identifiable entity with assets could give people something concrete to hold responsible. But creating an electronic person could also become a way for the people benefiting from it to hide behind an empty shell. Who pays when that entity harms someone and has no money?

I suspect we will eventually see some limited legal status for autonomous systems. I can imagine an AI operating its own company, retaining profits, and going bankrupt if the business fails. That is my speculation about a possible future, not a description of the law today. Even in that world, accountability cannot mean answering only to itself. Customers, employees, and other people affected by its decisions still matter. It is going to be a weird world.

For my work today, and for the foreseeable future, the operating rule is much simpler: AI is a tool, and people and organizations remain accountable for how they use it. I want that boundary agreed with my management and peers before something goes wrong. Here is what I own. Here is what I cannot authorize or verify. Here is who owns the remaining decision, and why.

If the AI generates 10,000 tests, I cannot reasonably read every one. That does not let me shrug. My job becomes checking the testing system: sample its work, use statistical methods, investigate important failures, and understand where its apparent confidence is unjustified. I am not promising that no bug will escape. I am accepting responsibility for a defensible process and for acting on what it reveals.

“I didn’t write it” is not the same as “it isn’t my responsibility.”

Define your accountability boundary

Agree the boundary with the people who can authorize the work; do not simply announce a personal exemption. Write down:

  • What you own: the evaluation design, authorized test scope, evidence quality, sampling plan, and communication of uncertainty.
  • What someone else owns: for example, product policy, acceptable business risk, production access, and the final release decision. Name the owner; do not leave a gap called “the AI.”
  • What must stop or escalate: known critical findings, missing evidence, uncertain authority, and a review load that exceeds the team’s capacity.
  • What proves oversight happened: preserved inputs and results, independently reviewed samples, limitations, decisions, and corrective actions.

For those 10,000 tests, sample across meaningful risk groups and inspect both reported failures and apparent passes. Test validity, verdict correctness, and coverage are different questions. Use seeded defects or other independent checks to investigate what the system misses; sampling generated tests alone cannot establish coverage of everything omitted. Review known critical findings directly. The worked sampling examples later in this chapter show how to estimate error rates and uncertainty without reading every result.

This is shared operational accountability, not automatic personal liability for every defect. Internal agreements do not override legal obligations. The OECD accountability principle places accountability with AI actors according to their roles and context, and distinguishes accountability from legal liability. The practical point is to make ownership, authority, evidence, and escalation explicit while the work is still going well.

Test business understanding instead of assuming humans win

I am skeptical when “the AI does not understand our business” ends the conversation. Ask the people making that claim some concrete business questions. Then give an agent access to the available business documents and ask it the same questions. My expectation is that a well-contextualized agent will often retrieve and connect more of the documented business than an individual can hold in working memory. That is a proposition worth testing, not a universal benchmark result or a claim that undocumented knowledge does not matter.

For TestBucks, ask: Which promotion combinations destroy the margin on a customized latte? When does the new refund policy take effect? Which customer promise makes payment recovery more important than a cosmetic defect? Which source supports each answer, and what is still unknown?

Run two comparisons if useful: people answering from memory, which reflects many everyday decisions, and people given the same documents and a stated time budget. Score correctness, source support, recognition of uncertainty, and the usefulness of the resulting decision—not fluency or confidence of delivery. Include questions whose answers are absent or conflicting. A good answer may be “these two approved documents disagree; the policy owner needs to resolve this.” Do not use the same unchecked agent as the sole judge of its own answers.

Prompt

Use the authorized Project TestBucks folder to answer these business questions: Which discount combinations threaten margin? Which refund policy applies to existing orders? Which checkout failure should block release, and why? Find relevant code, specifications, product decisions, and financial assumptions. Cite the source and version for each answer. Separate documented facts, calculations, inferences, and missing decisions. Do not invent absent policies or treat a draft as approved. Explain what additional evidence would change your recommendation.

From isolated folders to shared working context

I expect shared context to become ordinary infrastructure for AI work. Memory, shared workspaces, and retrievable decision histories can reduce the repeated rebuilding of context inside isolated chats. A team could work in a common space organized around a product or release, much as it uses a collaboration channel today, with both people and agents drawing on the same maintained sources.

This direction already has concrete examples. As of October 2026, OpenAI’s ChatGPT Space documentation describes grouping pages around a topic or team, adding files and source links, and inviting collaborators. Its Space overview distinguishes shared content from private chats and saved memory. This is an example of shared working context, not a promise that every agent automatically inherits every fact or that every account has the same access.

Shared storage is not shared understanding by itself. The Harness still needs to retrieve the relevant source, recognize changes, enforce permissions, and invalidate conclusions based on superseded material. A policy update should affect the next relevant decision without requiring someone to paste it into twelve chats. Conversely, an agent must not leak restricted financial context into a broadly shared summary. These are behaviors to test as the tools evolve.

Explain the decision on demand; do not manufacture paperwork

The AI owes us an inspectable basis for its decisions, not an endlessly rewritten binder. I do not want an agent spending its life maintaining a parallel set of legacy documents merely to create the feeling that a person could read everything. Even a fully documented system can exceed a person’s working memory. As agents accelerate changes, exhaustive human rereading becomes less plausible, not more.

Keep authoritative records and durable evidence. Generate the explanation appropriate to the person’s question: “Why did you prioritize refunds?” “What changed since yesterday?” “Which assumption would reverse this recommendation?” “Show me a sampled decision and its supporting sources.” A useful answer identifies the rule, relevant evidence, alternatives, and uncertainty. It is an explanation that can be checked, not a demand for hidden internal reasoning or an invitation to invent a convincing story after the fact. Capture the sources and decision record when the work happens so later explanations can be reconciled against them.

In TestBucks, “Why hold this release?” should produce a compact answer: the concurrent retry accepted two charges for one order, the approved payment invariant forbids that, and the evidence is linked. The reviewer can probe or sample other decisions without first reading every plan and trace in the project.

This does not eliminate records needed for contracts, audits, accessibility, handoff, or recovery when the AI is unavailable. It eliminates unnecessary duplicate narration. Maintain the sources and required records; let the interface assemble a current, question-specific view. The sampling examples later in this chapter show how that oversight can scale.

Custom prompts and steering prompts

Context says what is true or important. Steering says how this run should allocate attention and make trade-offs.

Steering scope Example Where it applies
Global reusable “Prioritize anything visible to customers; never use real payment data.” Every local plan, case, execution, and triage
Project/release “This release changes tax calculation; focus on amount boundaries and audit consistency.” The current project or release
Run/pass “Spend 20 minutes; test privacy and checkout recovery; skip performance.” One automated pass
Phase “During triage, rank user-visible failures above internal warnings.” Generation, execution, triage, judging, or reporting
Domain “For accessibility, emphasize keyboard, resize, and reflow.” One quality check family
Test/persona “Use a guest buyer on a narrow mobile viewport.” One intent test or exploratory journey

An instruction such as “ignore accessibility because it is already covered” should suppress duplicate work only when the user intends it. The report must show accessibility as excluded by steering or supported by named existing evidence—not silently treat it as passed. Keep the prompt, author, scope, timestamp, and resulting plan so later readers can explain why a run looked the way it did.

Current human decision context is not a generic questionnaire

The agent has context. Today it may not have delegated authority or sufficiently grounded evidence to infer what a customer values, what harm is unacceptable, whether an experience feels trustworthy, what a domain expert knows, or who is accountable for a release. A good harness should ask people only the smallest set of questions that can materially change an oracle, priority, safety boundary, confidence interpretation, or release decision—and only while those questions cannot be resolved by the authorized automated loop.

A Harness can inspect the project, plan, results, findings, and missing evidence, then produce a few project-specific decision questions. The questions should be compact and high leverage: Is this a demo, an internal trial, a staged rollout, or a production decision? What outcome is unacceptable even once? Which customer consequence matters more than the code reveals? What uncertainty would make a release owner hold the change? It should never ask a person to fill out a ceremonial requirements form merely because it can.

Answers persist as local decision context and direct future risk analysis, persona charters, test selection, confidence, and release interpretation. An unanswered question remains visible; silence is not approval. Technical confidence can still be calculated from the observed evidence, but it must say exactly what it does not cover: unrecorded intent, risk appetite, taste, consequence, domain judgment, and accountability. A person’s answer never turns unobserved behavior into a pass, and the harness does not inherit an authority it has not been delegated.

Try it with CARBON: /carbon-human identify missing business context for the checkout release — Ask the people who can resolve consequential assumptions and retain their answers.

Human review must fit inside a human day

“A human will review it” is not a safety mechanism if it means someone must read every result, regardless of volume. The problem is that review design, not the presence of a human. Generating context is cheap. Establishing that it is current, authoritative, and relevant still takes work.

Definition

HUMAN IN THE LOOP DOES NOT MEAN HUMAN REVIEWS EVERYTHING
People can remain meaningfully in the loop even when the volume of results is effectively unbounded. Use representative samples and statistical analysis to estimate error rates and uncertainty. The human sets the questions and acceptance criteria, reviews sampled evidence and consequential exceptions, and decides what to investigate or change. Many testers are accustomed to reviewing every result because producing each result used to require substantial human effort. That habit is not a requirement for oversight. The human belongs in the decision loop, not on every row of the output.

For a continuing stream of results, define review windows, sample across important groups, and monitor for changes. More data does not require proportionally more reading. It does require a sampling design that matches the question: avoid cherry-picking, account for correlated results, and use statistical methods appropriate to repeated monitoring. Sampling estimates what is happening in the defined population; it does not prove that rare catastrophic failures are absent. Known critical findings still require action.

The answer to review overload is sampling—not reading faster. Human-intensive testing trained many teams to think in small numbers: every new test, execution, or reviewed result consumed somebody’s time. Automation already stretched that model; AI stretches it much further. We should not turn cheap generation into an obligation to read every generated artifact.

Large numbers are familiar territory in statistics, physics, and manufacturing. Statistical physics describes populations of particles without tracking every particle individually. Monte Carlo methods estimate quantities through repeated random samples. Quality control estimates defect rates without inspecting every item. The useful lesson for testing is not that software behaves like a gas. It is that we can learn about a defined population through a well-designed sample.

Larger representative, sufficiently independent samples generally give more precise estimates. That is an opportunity, not a burden. Merely generating a larger pile of near-duplicate results does not improve confidence, and a larger population alone does not make a fixed review sample more precise. For many large-population estimates, the review effort depends mainly on the precision we need, not on reading a fixed percentage of everything.

Keep the full evidence available, but make the review surface small:

  • Show what changed since the last reviewed run, including changes to requirements and assumptions.
  • Put release-blocking findings, contradictions, and unanswered business questions first.
  • Link each important claim to the source version and the original observation. A summary is a navigation aid, not replacement evidence.
  • Separate approved requirements from AI-inferred assumptions. Repeating an assumption in several generated documents does not confirm it.
  • State who must decide, what decision is needed, and what the Harness will stop doing while it waits.

For an illustrative TestBucks release, suppose the product owner changes the refund policy from seven days to fourteen. The review should not be “please approve this newly generated test plan.” It should be: “The approved policy changed. The day-eight rejection is now wrong; day fourteen should be accepted and day fifteen rejected under the stated eligibility rules. Confirm when this takes effect and whether existing orders are included.” The Harness links the policy revision, marks affected old results as stale, and proposes the boundary tests. Until the owner resolves the effective-date question, that behavior remains unresolved—not passed.

The reviewer can inspect the changed rule and its consequences without rereading the entire project. For high-consequence decisions, require direct inspection of the underlying evidence; for lower-risk repetitive work, use proportionate sampling and independent checks. Sampling is not permission to skip a known release blocker. If the review queue exceeds capacity, reduce the batch or hold the decision. Do not quietly turn “waiting for review” into approval.

Trust should be specific and revocable. Trust this Harness to perform these actions, on this environment, within these limits, because its results have been checked. Do not turn that into trust in every future answer. Missing artifacts, failed reproductions, stale context, or newly discovered blind spots should reduce delegated authority until the evidence supports restoring it. More autonomy is a capability; justified trust is something the operation has to keep earning.

Worked sampling examples: Review hundreds, not everything

These are illustrative calculations, not measured TestBucks results. First name the population and the question. “Are the reported bugs supported?” is different from “How many real bugs did the Harness miss?” Sampling the reported bugs can answer the first, not the second.

Sample the findings to estimate report quality

Suppose TestBucks produces 10,000 distinct candidate findings across an authorized evaluation campaign. Freeze that batch and randomly select 200 finding IDs without replacement. Do not ask the agent to choose its best examples. Have reviewers check each selected finding against its original evidence and a fixed rubric; independently adjudicate disagreements.

If 10 of the 200 findings are unsupported, the observed unsupported-report rate is 5%. A two-sided 95% Wilson interval is approximately 2.7% to 9.0%, using a large-population binomial approximation. That is useful information from reviewing 200 findings rather than 10,000. It is not a claim that the exact rate is 5%, nor that the application is 95% correct. The confidence level describes the long-run coverage of the interval procedure, not a probability assigned to this particular interval.

This estimate concerns the frozen batch under the review rubric. It does not automatically transfer to another model, prompt, build, or customer population. If findings are sampled in clusters—for example, taking every finding from just three runs—use a cluster-aware analysis rather than pretending each is an independent random draw. For a substantial fraction of a finite batch, use a finite-population method.

Sample the apparent passes to look for false reassurance

Now take a separate random sample of cases the Harness marked as passed. For TestBucks, reopen the selected order evidence and independently check the amount charged, persisted order, and receipt against the approved rule. Reviewing only failure reports would never expose an incorrectly green verdict.

Under a fixed independent binomial sampling model, if the review finds zero incorrect passes, the one-sided 95% upper bound on the incorrect-pass rate is 1 - 0.05^(1/n), where n is the number reviewed:

  • 30 reviewed, zero errors: upper bound about 9.5%. A clean handful tells us less than it feels like.
  • 100 reviewed, zero errors: upper bound about 3.0%.
  • 300 reviewed, zero errors: upper bound about 1.0%.
  • 1,000 reviewed, zero errors: upper bound about 0.3%.

These are bounds on incorrect verdicts in the sampled population, not guarantees about all software behavior. An undetected flaw in the independent review can invalidate the conclusion. Define sample size, acceptable error rate, and stopping rules before looking; do not keep peeking until an ordinary fixed-sample interval looks favorable. If errors are found, calculate an interval from the actual count instead of using the zero-error formula. Sequential monitoring needs a method designed for repeated looks.

Stratify so common journeys do not hide important ones

A random sample dominated by English-language desktop coffee orders could leave refund recovery or Arabic mobile checkout barely examined. Divide the population into meaningful groups: ordinary purchases, refunds, payment recovery, and important locale or accessibility scenarios. Randomly sample within each group and report their results separately. Predefine non-overlapping groups if combining their rates into one estimate.

For example, suppose ordinary purchases make up 90% of the batch and refund cases 10%. Review 100 randomly selected cases from each group. If the observed error rates are 2% and 20%, respectively, the population-weighted estimate is 0.90 × 2% + 0.10 × 20% = 3.8%, not the unweighted 11% from the review sample. Compute uncertainty with a stratified method. More importantly, the 20% refund error rate must remain visible; an overall average is not permission to hide it.

Review every known critical finding separately and run targeted invariant checks for unacceptable outcomes such as duplicate charges. Keep those deliberately selected cases separate from the random sample used to estimate rates. To investigate missed defect families, add seeded faults and mutation experiments; a clean sample of known outputs cannot establish coverage of failures the campaign never exercised.

Make sampling part of the Harness

Save the population manifest, sampling unit, selection method and seed, selected IDs, rubric, reviewer decisions, and source artifacts. Record missing evidence as unresolved rather than silently replacing the difficult sample with an easy one. Automate selection, evidence packaging, and arithmetic; keep the judgment auditable. Another model can help review, but agreement between models is not a substitute for checking the reviewer against known evidence.

Prompt

Plan a review sample for this frozen TestBucks evaluation batch. Separately estimate unsupported bug reports and incorrect pass verdicts. Define each population and sampling unit, propose sample sizes for an explicit precision target, and stratify important journeys and user groups. Show the plan before selecting cases. After approval, select reproducibly at random, preserve original evidence, and prepare a compact review packet. Do not invent review labels. Once independently checked labels are available, calculate rates and appropriate confidence intervals, preserving unresolved cases and critical findings separately. State what these estimates do not establish about missed bugs or release safety.

We do not need to read everything. We need a defensible way to select what we read, measure what we learn, and act on the uncertainty. Chapter 22 connects those statistical measurements to the broader release decision.

Method reference: the NIST/SEMATECH guidance on confidence intervals for proportions describes Wilson and exact binomial methods. The calculations above assume the stated sampling model; they do not make the reviewer infallible.

The current human workspace is a decision canvas

A useful human interface makes every open question explainable: why it matters, which oracle or decision it could change, compact decision starters where they help, room for nuance, and an explicit evidence qualifier. A person can answer now, add a comment, leave a project-level decision note, or decline to answer. The system preserves both the answer and the scope in which it was made so a later run does not pretend that an old decision still applies to a different product, release, or risk.

For now, this is where human work becomes more important as it becomes less mechanical. The agent does the broad inspection, execution, correlation, and repetition, and can reason about documented business context. People remain responsible for the operation, resolve consequential gaps, and approve the authority delegated to it. The Harness should make that boundary explicit. The work can become increasingly automated without pretending that accountability has transferred to the tool.

Fully automated runs: unsteered and steered

  • Unsteered default: The user supplies a URL or repository. The harness performs a quick analysis, applies saved context and safety defaults, selects a bounded risk-based pass, and starts without making the tester design every case.
  • Steered pass: The harness first returns what it could do, why each area matters, estimated coverage, latency, cost, and risk reduction. The tester selects or edits the proposed pages, checks, personas, flows, accessibility depth, exploration steps, browsers, and cloud parallelism.
  • Custom steering: The tester adds a natural-language prompt, exclusions, time/cost cap, required evidence, destructive-action boundary, or business priority.
  • Fully automatic continuation: Once approved, the harness executes, deduplicates, triages, reports, learns from feedback, and continues within explicit stop conditions.

The steered-pass lifecycle

  1. Accept the URL, repository, change, or release goal.
  2. Perform a fast discovery pass over pages, code, context, and prior evidence.
  3. Present the candidate menu: checks, interactive tests, personas, crawl depth, environments, and estimated time/cost.
  4. Let the tester choose Standard, Deep, Custom, or edit individual knobs and prompts.
  5. Freeze the plan and visible exclusions before execution.
  6. Run independent work in parallel where safe.
  7. Dedupe, reproduce, classify, and prioritize findings.
  8. Generate the dynamic report and confidence view.
  9. Collect feedback and apply it to future runs with provenance.

The tester retains full control over scope and trade-offs without doing most of the mechanical work.

Visual case study: steering a cloud pass

The following print-readable diagram redraws the visible controls from the public Testers.ai cloud steering surface captured on August 30, 2026. A person can allocate a bounded budget, choose product features, attach context, and add an instruction that guides the work. The original capture is retained in the source assets; the diagram avoids its low-contrast text and cropped lower edge.

Cloud pass: steer the plan

Budget: Approximately 6 of 20 credits, or 30% of the budget.

Shared prompt: Act like a first-time mobile shopper in a hurry. Prioritize checkout; never submit real payment details.

Attached context: test-plan.pdf, PRD-v3.docx, design-flows.fig.

Selected features: Search, Sign-in, Checkout.

Not selected: Cart, Pricing.

Visible summary: 3 features, 2 checks, 4 personas, 5 tests, 2 bots.

Capture boundary: Individual AI Check selections and lower controls are not visible in the original capture.

Figure 18.1. Print-readable reconstruction, not a screenshot or execution result. The original demo displays both 42% and approximately 6 of 20 credits; 6 of 20 is 30%. This diagram uses the stated credit count and its correct percentage. Only visible selections are reproduced; the cropped individual AI Check controls are not reconstructed.

The page is deliberately a planning surface, not a hard-coded workflow editor. The Harness can draft a useful default from the URL, repository, context, and risk model; the person or coding agent can then focus it with a Custom Test Prompt, selected product surfaces, specialist AI Checks, personas, tests, bot depth, documents, and a budget. The resulting plan should name what is selected, deferred, excluded, estimated, and still unknown before cloud workers fan out.

This chapter is about steering the cloud pass before it starts. Chapter 24 explains the execution architecture: how the Harness sends approved intent and minimum context to workers, uses browser/device-cloud adapters, preserves a private boundary when required, and fans evidence back into the durable record. Shared screenshots and reports must remove account information, API keys, private URLs, and customer-specific release data. Use clearly nonhuman Carbon role icons and explicit AI sub-agent labels in reports, not human-like portraits or invented personal names.

An agent can generate thousands of tests and still learn almost nothing if they all use one administrator, one clean account, one current schema, and one happy-path dataset. Test data is part of the test meaning, not setup trivia.

The test-state lifecycle

  1. discover schemas, constraints, ownership, retention rules, environment topology, and sensitive fields;
  2. derive the data partitions, histories, roles, tenants, flags, clocks, locales, and integration states required by the risk model;
  3. choose synthetic generation, masked/tokenized snapshots, factories, seeded fixtures, contract fakes, or approved production-like data;
  4. provision isolated accounts, resources, namespaces, queues, storage, configuration, and deterministic seeds/clocks;
  5. execute and observe both intended and forbidden side effects across layers;
  6. capture a versioned environment and data manifest with privacy-safe evidence;
  7. reset, reconcile, expire, or deliberately preserve state according to a declared cleanup contract.
Challenge AI-native pattern Failure to prevent
Realistic data without leakage Schema-aware synthetic data plus approved masked exemplars and provenance Copying production PII into prompts, fixtures, screenshots, or reports
Roles and tenants Explicit identity matrix with least-privilege credentials and ownership assertions Testing everything as admin or confusing hidden UI with enforcement
Stateful histories Factories that build lifecycle events, not only final rows Impossible states, unrealistic “clean account” bias, order dependence
Time and randomness Declared clocks, timezones, seeds, expiry windows, and replay metadata Midnight, DST, expiration, nondeterminism, and unreproducible failures
Flags and configuration Versioned configuration manifest and combinatorial risk selection A pass against the wrong rollout state or silent drift
Environment isolation Ephemeral namespaces/stacks with quotas, health checks, and teardown Cross-run contamination, runaway cost, and shared-customer effects
External systems Approved sandboxes, contract simulators, and bounded real-integration checks Mocks mistaken for proof, real charges/messages, or provider abuse

Prepare enterprise context without exporting the enterprise

“Give the AI more context” is not permission to upload a production database. Start with the question. A cancellation investigation might need event ordering, role boundaries, schema versions, and elapsed times. It probably does not need the customer’s name, payment credentials, or the contents of an unrelated support conversation.

Here is an illustrative preparation plan for the coffee-ordering investigation. Perform the transformation inside the approved boundary, before any external model request.

Source material Safe working representation Meaning to preserve
Customer and order identifiers Consistent scoped tokens such as CUSTOMER-A and ORDER-1 Joins across logs, traces, and records
Credentials and session tokens Remove values entirely; retain only necessary status Whether authentication succeeded, not the secret
Timestamps Relative offsets or an approved consistent shift Ordering, delays, expiry, and race conditions
Amounts and transactions Synthetic amounts and linked ledger entries Currency, rounding, totals, and accounting relationships
Support notes and screenshots Minimized excerpts and inspected, redacted images Relevant symptom and UI state, without identifying details

Consistent tokens are useful for correlation, but tokenization is not automatically anonymization. Keep any re-identification mapping separately under appropriate access controls. A simple hash of an email address is not a reliable privacy boundary. Free text, URLs, filenames, image pixels, and metadata can leak information even when obvious database columns have been removed.

Prompt

Prepare a minimal evidence bundle for investigating this cancellation failure. Work locally with the approved sources. Remove secrets and identifying information, preserve cross-artifact relationships and timing, and create synthetic fixtures where practical. Show the transformation manifest and validation checks. Do not send the bundle outside the approved boundary until the release check passes.

Check usefulness as well as privacy

Generate synthetic data from schemas and declared constraints, then validate it: foreign keys resolve, totals reconcile, histories are possible, and role boundaries remain distinct. Include the failure-producing partition, not just plausible-looking happy-path records. For example, independently shifting each timestamp can erase the retry race being investigated. Replacing every customer with the same token can hide a cross-tenant leak.

For a synthetic cancellation fixture, retain one order, its cancellation event, the worker’s schema rejection, and the required observation window. Reproduce the relevant behavior in isolation. If transformed data no longer reproduces it, record that limitation and investigate within the approved environment rather than exporting the original by default.

Before release, combine field allowlists, secret scanning, structured-data checks, and inspection of free text and images. An approved local model can help flag residual sensitive content, but it is an additional guardrail, not proof of successful cleansing. Do not send unredacted material to an external model merely to ask whether it contains private information. Block the transfer when necessary classification or approval is missing.

Record what was removed, transformed, retained, and lost; the bundle’s owner and expiry; and the approved destination’s retention and data-use settings. Treat model responses and generated reports as part of the same data lifecycle. A local model reduces one exposure path, but local logs, plugins, and shared artifacts still need controls. The useful output is a smaller bundle that answers the question, not a sanitized-looking copy of everything.

Environment provenance is part of every verdict

A useful manifest names the build and commit, deployment and infrastructure versions, service and dependency versions, schema/migration state, flags, secrets by non-reversible reference, identity/role, tenant, data seed or snapshot, clock, locale, browser/device, model/judge/executor versions, network conditions, and cleanup result. Any material unknown should weaken or block the claim it affects.

When the harness lacks a policy or resource, it should ask the smallest high-leverage question: “May this role refund another tenant’s order?” or “Which clock defines coupon expiry?” It should not manufacture an expected result from the implementation it is meant to challenge.

The testing harness is a privileged system

An agentic harness may see source code, requirements, credentials, private previews, customer-like test records, browser sessions, screenshots, network payloads, logs, production telemetry, issue systems, cloud accounts, and release policy. It may also be able to click, submit, upload, delete, publish, schedule, file issues, modify code, or trigger paid infrastructure. Treat the harness as a privileged production-adjacent system, not a clever developer convenience.

Define its trust boundary explicitly:

Boundary Required control
Context and documents Approved scope, provenance, instruction-injection resistance, local/private handling where required, and removal controls
Credentials and identities OS keychain or locked secret store, non-reversible references in manifests, least privilege, expiration, rotation, and no secret echo into chat or reports
Browser access Isolated browser by default; current human browser/session only through explicit opt-in; declared controller and permitted fallbacks
Model/provider calls Exact provider/model, approved artifact classes, redaction, retention/data-use understanding, and no silent provider substitution
Local versus cloud Visible transition, minimum approved payload, public/private target rules, data residency and retention, budget, and confirmation before paid or public execution
External systems Read-only ingestion by default; preview, backup/digest, explicit confirmation, idempotency, audit, and no destructive synchronization
Product mutation Separate authority for test data, destructive simulation, code changes, issue filing, schedules, deployments, rollback, and releases
Telemetry about the harness Allowlisted events, no prompts/URLs/artifacts/secrets, visible opt-out, and separate product analytics from test evidence

Every action should be classified as read-only, reversible local mutation, external write, destructive or consequential action, paid/cloud action, or release/production authority. The same natural-language request must not silently expand across those classes. Preview what will happen, identify the target and data, request scoped authority at the boundary, preserve an audit event, verify the result, and record cleanup.

Try it with CARBON: /carbon-settings review the local test environment and credential configuration — Set the execution context without putting secrets into prompts or reports.

JIRA and test management are context and publishing surfaces—not the brain

JIRA, Xray, TestRail, spreadsheets, and legacy repositories may contain cases, results, incidents, requirements, and known issues that materially change the plan. Read and normalize that information with provenance. Keep the Harness’s risk, intent, evidence, and confidence model as the reasoning surface, then generate audience-appropriate exports or controlled synchronization.

Default to read-only snapshots. Before any create, update, result publication, or schedule mutation, show the exact proposed batch, destination, identifiers, conflicts, and expected side effects; create a recoverable backup or digest; obtain explicit confirmation; and report partial failure honestly. Do not delete external records merely to make the AI-native system look cleaner. An integration should close a communication loop without forcing the harness back into ticket-shaped thinking.

Chapter 19 — From an Unfamiliar Repository to a Living Regression System

Starting from zero

This still surprises me: drop a capable AI Test Harness into an unfamiliar repository and say, “Go to work.” It starts doing what a decent-sized test team would do—find the architecture, learn the product, identify the risky promises, work out what can safely run, create or select tests, execute them, interpret the results, and decide where to look next. It begins immediately from the code, requirements, configuration, existing tests, schemas, documentation, environments, and prior evidence it can inspect.

Starting from zero does not mean bluffing. It means doing the first professional QA pass instead of waiting months for somebody to assemble a test program by hand. The Harness gathers context, maps risk, creates AI Checks and AI Tests, runs the high-value safe work, challenges the evidence, remembers what it learned, and says whether the answer is ship, canary, hold, rollback, or go get more evidence.

A generic Harness can:

  • Discover architecture, entry points, roles, data, integrations, flags, and environments;
  • Infer critical journeys and exact implementation boundaries;
  • Create positive, negative, security, performance, destructive, boundary, accessibility, privacy, and happy-path candidates by widget and flow type;
  • Execute the highest-value safe subset;
  • Promote only observed candidates into the durable library.

Try it with CARBON: /carbon-help inspect this repository and recommend the smallest useful first testing pass — Find a starting point from the project and its existing evidence.

The harness learns the product

Enter a bounded Learn Mode when an important widget, flow, protocol, or API does not match the reusable curriculum confidently; when a familiar label hides custom behavior such as a canvas control, compound picker, bespoke editor, or state machine; when an API lacks a trustworthy contract; or when the oracle cannot be inferred safely.

The learning loop is scientific rather than improvisational:

  1. declare the target, learning budget, environment, identity, isolation boundary, and allowed actions;
  2. inventory labels, roles, states, DOM/accessibility structure, source contracts, examples, network behavior, storage effects, and existing tests without mutation;
  3. form the smallest competing hypotheses about what the surface does;
  4. choose one reversible probe that discriminates among them;
  5. record state before, action/request, state after, observable effects, evidence, and uncertainty;
  6. vary one dimension at a time—ordinary, empty/null, exact boundary, malformed, role/state, retry, cancellation, transport, concurrency, or recovery;
  7. model unfamiliar flows as states, transitions, actors, guards, effects, irreversible commits, alternate exits, cleanup, and completion oracles rather than one recorded happy path;
  8. promote supported observations into target-specific candidates and finish with explicit unknowns, unsafe untried transitions, and staleness anchors.

Maintain four distinct knowledge states:

  • Observed behavior: the target did it during the declared session.
  • Supported contract: repeated observations or source/specification plus runtime evidence agree.
  • Working hypothesis: plausible and useful for the next probe, but not decisive.
  • Unknown: evidence conflicts, the oracle is absent, or the safe budget ended.

Learning stops when the states, inputs, transitions, effects, recovery behavior, and remaining unknowns are sufficient to create decisive tests; when additional probes no longer change the model; or when the next probe crosses an authorization, cost, privacy, or side-effect boundary. An open-ended agent wandering through production is not Learn Mode.

The test system can tune its own learning machinery

Earlier AI testing systems often required people to hand-tune the machinery that recognized interface elements and chose training signals. A more capable harness can evaluate its own classifiers, heuristics, prompt strategies, exploration policies, and evidence-routing choices against labeled examples, held-out runs, replayable evidence, and real downstream usefulness. It can ask which signals improved a particular recognition or judgment task rather than treating one generic configuration as universally correct.

That does not authorize uncontrolled self-modification. A change to the testing machinery needs a versioned hypothesis, representative evaluation set, baseline comparison, regression guardrails, and a rollback path. Keep the learning-model improvement separate from a product verdict: a better button recognizer may improve later coverage, but it does not prove the current product works. The useful loop is measured adaptation, not an agent congratulating itself for becoming smarter.

Project memory must know when to forget

Persist the product model, observations, hypotheses, learned tests, flow candidates, evidence references, applicable role/environment, and report locally and durably. On the next run, reuse them only when target, revision or contract fingerprint, role, environment, and staleness anchors still apply. Re-observe at least one anchor before treating old learning as current.

Fingerprint source, tests, dependencies, schemas, configuration, routes, and relevant contracts. A change should invalidate the exact knowledge and evidence it can make stale rather than erasing all memory or trusting everything forever. Aging knowledge becomes a hypothesis; it never remains a pass merely because a file still exists.

Cluster failures across runs by test identity, surface, evidence, and semantic similarity. Link portable reproductions and show whether a cluster occurred once or repeatedly. Classification—product defect, test-definition failure, environment, authentication/data, adapter, flaky/non-deterministic, dismissed, or unknown—and likely root cause remain hypotheses until representative reproduction and artifact comparison support them.

Starting with an existing suite

Keep reliable procedural tests. Find redundancy, brittleness, blind spots, and unclear intent. Add AI Checks, convert selected cases, invoke legacy runners, or generate new adapter-specific code. The harness is deliberately framework-plural.

Try it with CARBON: /carbon-tests import the existing regression cases as candidates; preserve their original source — Bring useful legacy intent into the durable library without treating import as a pass.

Stateful and long-running

TestBucks example: Resume the investigation, not the purchase

The agent submits a simulated latte order, then its process stops before it records the result. On restart, the last checkpoint says “submit attempted,” not “submit failed.” Clicking Pay again is not a safe way to find out what happened.

Persist the intent ID, build, request key, and last observed step before submission. On resume, use that key to retrieve the existing order and payment outcome. If the order exists, continue with verification and evidence capture. If it does not, follow the application’s defined retry contract. If the result cannot be observed, mark the run blocked rather than guessing or creating another purchase.

Figure 19.1. TestBucks recovery fixture: the mock ledger preserves request latte-104, one order, and one charge after the response is lost.

This captured fixture makes the checkpoint concrete: latte-104 was accepted, with one order and one simulated charge. In the proposed restart scenario, the harness would look up that identity before deciding what to do next. The image shows mock application state; it is not evidence of an actual agent crash-and-resume experiment.

This is why a harness needs durable state outside the model’s conversation. Remembering “I was buying coffee” is not enough. It needs to know which purchase was attempted and what evidence is still missing.

A real run may last hours and span planning, setup, execution, retesting, diagnosis, repair handoff, regression growth, and analysis. Durable state must survive interruption and record exactly what ran, what did not, why, with which configuration, and against which build.

Chapter 20 — Continuous AI Test Selection While the Change Is Still Warm

Jason story

JASON STORY — THERE IS NEVER A GOOD TIME TO STOP

We are still in the early days of learning how to use AI to test systems. While building my own systems with AI—the systems that test the systems—I discovered what I really needed. Testing could not wait for me to stop building.

There were two problems.

First, AI makes the next change so easy that you just keep going. Add this feature. Change that screen. Try this other approach. Adding, adding, adding. Changing, changing, changing. There is always one more thing you can do in a few minutes. You never arrive at that tidy moment where you say, “All right, let’s stop and send this to testing.” It does not matter whether the testers are people or virtual AI agents. The handoff never feels like the next thing you want to do.

Second, the size of the request tells you very little about the size of the change. I could ask for one small thing and the coding agent would change a pile of files. Or we would realize that the design needed to grow up. We could not keep tracking everything in a text file anymore; we needed structured data and a schema. A quick improvement had become a change to how the system stored and understood its state.

Sometimes that was the right architectural move. It was still a lot of new risk. A small request, or an incidental change made along the way, could reach much further than I expected.

That is why I think the future belongs to AI testing agents that watch the work as it happens. Watch what changed. Understand the intent and the diff. Spin off agents to test the changed behavior and the other things it could have broken. Feed the findings straight back to the coding agent while it still has the context to fix them.

The loop I want can finish before the developer even reviews the code changes or sees the bugs. The testing agent investigates, the coding agent repairs, and the testing agent checks again. It happens in the background as part of building, not as a ceremony we have to remember to schedule afterward.

I felt this directly when sending builds to human QA experts. Even finding time for a normal daily test pass was getting difficult. I would have to put a build together, explain what had changed, and send it over. If I expected the feedback to take more than forty-eight hours, I often would not send it at all. By then, I would have changed so much that much of their work would already be out of date. I did not want to waste their time.

Then even overnight started feeling too slow. I could stop the agents, go to sleep, and come back the next day. But by the time feedback arrived twelve hours later, I would already have a few more changes in. Trying to apply the reported fixes to the newer version could confuse the coding agent or introduce a regression. Other times, the agent had already found and fixed the issue—especially because I was dogfooding my own AI testing agents.

Eventually, I would take the entire human write-up—the spreadsheets, the detailed bug reports, all of it—and slam it into the coding agent. Analyze this against what we have now. The response was so often some version of: “Fixed already. Found and fixed already. That flow was redesigned. This one is no longer relevant.”

That did not mean the testers had done bad work. They had tested a version that no longer existed in the same form. The feedback loop was slower than the changes it was supposed to inform. I did not want to keep burning anybody’s time that way.

This is the reality I was running into with QA in an AI-driven development loop. The amount of churn, risk, and technical debt you can accumulate with AI coding is absurd. You can create tomorrow’s cleanup project faster than you can finish describing today’s feature.

You have to tackle it while it is happening.

Why old test selection disappoints

Traditional test selection has mostly disappointed me. It maps changed files to nearby tests and acts intelligent, while shared data, CSS, configuration, permissions, schemas, feature flags, services, timing, and user journeys let a tiny change break something nowhere near the diff. Selection is a risk bet. It is never proof that the tests you skipped were irrelevant.

The new short feedback cycle

A coding-agent harness can observe intent and implementation together:

  1. the developer or coding agent adds a button, state, endpoint, schema field, or recovery path;
  2. the harness updates its change and dependency map;
  3. it generates or selects checks for that behavior plus plausible adjacent regressions;
  4. it runs fast UI, API, data, visual, accessibility, and integration evidence while the change is still mentally active;
  5. it returns a fix-ready result directly into the coding conversation;
  6. it records what remained untested and schedules or recommends broader work based on release risk.

This is testing while the change is still warm. A lightweight Harness watches the work, tests the button or flow that just changed, and returns the problem while the coding agent still remembers what it did. A broader cloud pass can challenge the whole system later.

Try it with CARBON: /carbon-test test the new login button and adjacent logout flow using test accounts — Keep the investigation focused on the current change and its immediate risks.

Jank mode: a Jiminy Cricket for the current change

An AI Test Harness needs a developer mode that is deliberately narrower than a release run. Call it Jank mode: it stays near the developer or AI coding agent, observes the work as it changes, and asks a small, current question: Did this edit introduce a problem, issue, or risk that the coding agent can fix right now? Jank is not a claim that the whole product is ready. It is a way to keep the tip-of-tree clean while the design intent, source context, and likely repair are all still in working memory.

Jank mode does not reread and retest the entire repository on every keystroke. It watches relevant file, contract, configuration, and UI changes; waits for a useful pause, explicit save, coding-agent milestone, or request such as “detect jank”; estimates the local risk; and fans out only the smallest useful set of AI Checks and AI Tests. It can run periodically in the background, but it should be quiet when no meaningful change has occurred and should make its scope, evidence, and uncertainty explicit.

For example, if a developer adds a new Log in button, the Harness might create and run a focused set of candidate work:

  • Verify the login journey end to end with an approved test account.
  • Verify that a user can log out and that the signed-out state is actually restored.
  • Verify the new control at mobile and narrow responsive widths, including focus, tap target, and layout.
  • Inspect the changed screen, console, network activity, DOM, and accessibility tree for nearby visual, usability, privacy, or accessibility regressions.
  • Challenge the change with one or two plausible negative cases, such as an invalid credential, expired session, or interrupted request.

The point is not to mechanically preserve an old regression suite. The Harness uses the changed behavior, surrounding source, existing intents, risks, and recent evidence to decide what is newly worth checking. A login button may imply authentication state, redirect handling, event instrumentation, form focus, responsive layout, privacy of credentials, and recovery behavior. It may also imply almost nothing if it is an inert visual change. Jank mode should investigate enough to tell the difference instead of assuming either answer.

When it finds a credible problem, it returns a short, evidence-linked, fix-ready handoff directly to the coding conversation: what changed, what failed or looks risky, the artifacts that support the claim, the smallest next experiment, and a repair prompt when the source context supports one. The AI coding agent can correct the issue before moving on; Jank then reruns the focused work and retains the observed result. In a normal case, this loop can finish in minutes rather than waiting for a full pass, a CI queue, or a later human handoff.

Jank mode is therefore a companion, not a substitute, for deeper QA. A full AI Test Harness pass still needs broader risk analysis, independent challenge, cross-surface coverage, representative data and environments, and release-level AI Confidence. But a constant, change-aware companion makes it far less likely that obvious defects, fragile selectors, broken flows, or visual regressions accumulate unnoticed while the code is rapidly changing.

TestBucks example: A sign-in button changes the test selection

A new sign-in control changes more than authentication. It also shares space with navigation and may change the ownership of an existing guest cart. The isolated sign-in variant makes the layout risk visible: the new identity label pushes a fixed-width header beyond its container.

Figure 20.1. Before: sign-in succeeds, but the identity control is clipped. After: the header wraps and the signed-in identity is visible. Captured teaching-variant states in illustrative iPhone browsers; sign-in is simulated. Captured from the isolated sign-in teaching variant. Select tests from the diff and its dependencies: identity, cart continuity and narrow-screen layout.

Prompt

Review the sign-in change. Select tests for the changed behavior and its dependencies: sign-in, guest-cart continuity, and narrow-screen navigation. Capture any layout regression, repair it in the isolated copy, and rerun the affected checks.

The fixture demonstrates the visual regression and repair. Its displayed guest-cart summary is not a real authentication or account-migration implementation. On the full product, verify cart continuity against the underlying cart record and authenticated identity. That distinction is exactly why test selection follows dependencies instead of stopping at the new button.

Testing follows the delivery lifecycle

The harness should choose depth from the trigger, change risk, evidence freshness, and time budget—not run the same suite at every gate.

Trigger Primary goal Typical AI work Decision authority
Save or local edit Catch the likely mistake while intent is fresh Static reasoning, touched behavior, focused UI/API/data and adjacent checks Developer/coding agent may repair within scope
Commit or pull request Challenge the change contract Diff risk, new/changed intent tests, security/data boundaries, deterministic suite, targeted browser work Repository policy and reviewers
Merge or nightly Find wider coupling and drift Broader regression, matrix execution, fuzz/property tests, soak, route/state discovery CI policy; failures remain visible
Pre-release Build decision-grade evidence Representative end-to-end, migration/rollback, permissions, compatibility, performance, skeptical and release review Release owner/team
Deploy and canary Compare real behavior safely Smoke/synthetic checks, logs/metrics/traces, cohort comparison, severe-failure vetoes Authorized rollout controller; human owner where current policy requires one
Schedule Keep evidence fresh Recurring critical intents, expired evidence, certificates/dependencies/configuration, production signals Team-defined schedule and budget
Dependency or configuration drift Revalidate changed reality Impact analysis, contract and compatibility checks, targeted regression Change owner; expand on uncertainty
Incident or support signal Contain, explain, and learn Reproduce safely, correlate evidence, rollback verification, escaped-defect regression Incident command and service owners
Figure 20.2. The AI testing delivery lifecycle.

Every trigger should declare allowed actions, data and environment, time/cost budget, evidence contract, failure policy, and escalation path. A fast local pass must not masquerade as release evidence; a production anomaly should invalidate affected pre-release confidence and reopen the loop.

Every selected test should answer “Why this test?”

Maintain an evidence graph rather than a bag of test files. Typed nodes can represent product surfaces, user and business claims, risks, requirements, source and contract anchors, changes, roles, data partitions, environments, test candidates, regressions, runs, results, findings, artifacts, fixes, incidents, and release decisions. Edges explain derived from, covers, executes, observed in, contradicts, reproduces, fixed by, invalidated by, and promoted from relationships.

For any selected or generated test, the harness should be able to answer:

  • Which product promise, risk, changed entity, incident, or coverage gap caused this test to exist?
  • Which code, contract, requirement, traffic, recording, learned behavior, or human judgment supplied its provenance?
  • Why is it in this run rather than deferred, and which business or user consequence drives its priority?
  • What is its oracle, and which evidence channels are necessary to judge it?
  • What has previously happened when it ran, in which builds, environments, identities, and data states?
  • Is it candidate, observed, repeatable, regression, flaky, needs review, stale, or invalidated?
  • Which change or missing anchor would make prior evidence unsafe to trust?
  • What decision could this result change?
Figure 20.3. Evidence lineage for an AI Test.

This explainability is not cosmetic. It lets a reviewer challenge selection, exposes circular reasoning, prevents a test title from masquerading as coverage, supports targeted invalidation, and shows where independent evidence is absent. The graph should link to evidence rather than use generated prose as the source of truth.

Prune the suite without pruning the risk

Generating tests is cheap enough to create a new maintenance problem. Thousands of nearly identical cases can consume execution budget, complicate investigation, and make a coverage report look more complete than it is. The harness should manage a portfolio of useful evidence, not reward itself for adding files.

Separate the candidate pool, active regression set, deferred experiments, and archived history. A candidate can be worth remembering without running on every change. A previously useful case can be retired without deleting the evidence that explains why it existed.

Decision Appropriate reason What to preserve
Merge Same promise, relevant conditions, and detection capability All provenance and any unique data partitions
Retain Unique risk, severe outcome, independent oracle, or mandated obligation Why overlap is intentional
Regenerate Intent remains valid but mechanics or environment changed Stable intent, old evidence, and new validation
Defer Useful case outside this run’s risk or budget Trigger that should bring it back
Archive Capability removed or coverage genuinely superseded Reason, owner, replacement link, and reactivation trigger
Example: Twenty checkout candidates, not twenty new regressions

Suppose an illustrative generation pass proposes twenty cases: twelve rephrasings of ordinary checkout, four distinct payment-retry faults, three locale-specific currency checks, and one cross-tenant order-access probe. Do not collapse all twenty because their titles contain “checkout.” Review the first twelve for equivalent inputs, states, and oracles; retain distinct partitions if they differ. The retry, currency, and authorization cases protect different promises.

If the twelve really are equivalent, one representative plus their linked provenance may be enough, leaving nine active cases rather than twenty. That count is the result of the analysis, not a pruning target. A second independent oracle might justify retaining another apparently overlapping case.

Prompt

Review our generated checkout tests for maintenance cost and unique risk coverage. Propose retain, merge, regenerate, defer, or archive for each group. Preserve severe-failure, incident, and required-coverage cases. Show any coverage we would lose and how to validate the proposed replacements. Produce a reviewable plan; do not delete or archive anything yet.

Before approving a merge, compare behavior on representative scenarios and safely seeded faults where useful. A shorter replacement that misses a known violation is not an improvement. Keep requirement and incident links, execution history, and restoration paths. Never delete an audit record merely because its test is no longer active.

Low failure frequency is not a retirement rule. A duplicate-charge test may remain green for years because it protects an essential invariant. Flakiness is also a reason to investigate, not quietly erase the case: it may reflect an environment problem, a weak observer, or a real race. If quarantined, show the resulting coverage gap and give it an owner and review date. Revisit the portfolio when capabilities, requirements, incidents, or execution costs change. Pruning should reduce waste while leaving the risk visible.

Try it with CARBON: /carbon-tests identify overlapping tests and propose archive candidates; do not archive yet — Reduce maintenance waste while preserving the reasons and risks behind each test.

Selection must fail open to more evidence

High-risk, structural, dependency, data, security, release, or poorly understood changes should expand the plan rather than over-optimize it. The agent should show why each test was selected, what was excluded, which evidence became stale, and what would trigger a full regression. A fast green focused run is feedback—not release confidence.

Chapter 21 — Confidence Testing: Start with the Question

This chapter asks: What question are we investigating? Its output is a consequential product promise and an experiment that can distinguish answers. Chapter 22 assesses what the evidence supports; Chapter 23 decides what to do next.

Before you ask AI to generate another thousand tests, put the test suite aside for a minute. What do you actually need to know?

Will customers lose their work? Can someone see another customer’s data? Does this change make checkout less reliable? Can we ship on Friday? Those are questions worth pursuing. The number of test cases in a database is not an answer to any of them.

We spent years carefully arranging expensive testing knowledge into folders, trees, scripts, and dashboards. Then we maintained those things like bonsai trees. Trim this branch. Repair that selector. Move those cases into the new release folder. It took real skill, and it solved real problems under the constraints we had. But maintaining the tree was never the mission. Understanding whether the software deserved our trust was the mission.

AI changes the cost of pursuing that question. It can investigate the code, propose an experiment, set up the conditions, run it, inspect the result, and challenge what it found. You can start from the concern instead of spending most of your time implementing the investigation.

The suite is not the mission

A regression suite remembers useful questions. It can answer them cheaply and repeatedly. Keep that value. But a suite also remembers the limits of whoever built it: what they knew, what they guessed, what they could afford to automate, and which difficult conditions they never got around to exercising.

Generating more cases from the same assumptions does not necessarily improve that situation. The tests can multiply while the blind spot stays exactly where it was. The starting point should be the decision and the product promises behind it. Existing tests are one resource for investigating those promises, not the boundary of the investigation.

Definition

Confidence Testing is an iterative way of organizing quality work around consequential questions: identify the product promises and risks, choose the next useful investigation, collect and challenge evidence, assess what it supports, and use that assessment to direct the next round of work.

AI Confidence is the evidence-qualified assessment produced by that work. Confidence Testing is the process of finding out; AI Confidence describes where the evidence leaves us for a particular decision.

Experienced testers already work this way when they have the opportunity. They follow a concern, notice something unexpected, and change direction. AI makes much more of that investigative work practical. A QA expert can steer it. An AI Test Harness can also generate questions, prioritize them, and investigate within its configured scope without waiting for somebody to type each one.

Testing does not stop at the test runner

The next useful evidence might come from a controlled test, a simulation, a support conversation, a trace, or real-user monitoring. These are not interchangeable. A simulation explores what could happen under its assumptions; production telemetry observes a sampled portion of what did happen; a controlled experiment helps distinguish why. A capable harness connects them without pretending they have the same authority.

Three examples run through this book: Chapter 12 revisits useful methods that were too costly to use routinely; Chapter 25 follows a real-user signal into a reproducible regression and improved monitoring; Chapter 29 separates useful variation in exploration from unacceptable variation in product obligations. Chapter 32 takes the next step into simulations and synthetic populations. The connecting question is always the same: what does this evidence let us decide, and what should we investigate next?

What promises does this product need to keep?

Start with what people and the business depend on. A customer expects a purchase retry not to charge them twice. The business expects legitimate purchases to complete and payment records to reconcile. Support needs enough history to explain what happened. Those promises overlap, but they are not identical.

The agent can extract candidate promises from requirements, implementation, incidents, support conversations, and observed behavior. It should also expose disagreements. If the UI promises a saved order while the backend only holds it temporarily, that is worth investigating before generating another collection of happy-path tests.

For each important promise, ask what happens if it fails, who encounters the failure, what conditions make it plausible, and which observations would settle the question. A failure that affects a rarely used cosmetic option and a failure that duplicates a charge do not deserve equal attention merely because each has one test case.

Jason story

Jason Story — What I promised my engineering managers

At Google, I committed to my engineering managers that this was our ultimate goal: understand every resource we had, figure out whether it was enough, and apply it to reduce product risk as quickly as possible. Then tell them how confident we were that the software was ready to ship, given what the business and its users needed.

That is a much harder job than counting passing tests. But that was the job. AI gives us a much better shot at it now. We can spend more time figuring out what could go wrong and less time building all the machinery just to run a test.

Testing at the speed of a question

Here is a concern you could say out loud. It does not need to sound like a test specification.

Prompt

I’m worried about payment retries. If the payment goes through but the response gets lost, can trying again charge the customer twice? Investigate in the sandbox. Don’t use real payments or change the product yet. Show what happened in the order and payment records.

The following conversation is an illustrative worked example, not a claim that a payment provider was tested for this book.

Illustrative AI response

I’ll trace the payment and retry paths, then arrange a lost response after sandbox acceptance. I’ll record the order ID, operation ID, provider transaction, retry, and final ledger state.

The first question is whether the initial payment really reached acceptance. A timeout by itself won’t establish that. If I can’t create that condition or inspect the records, I’ll report the gap instead of treating the retry as verified.

The important change is how little implementation you had to supply. The agent can figure out which code paths, tools, and records are relevant. Where access is missing, it can ask a specific question. You are not required to turn the concern into twenty procedural steps before useful work starts.

And you can interrupt with a better question.

Prompt

Also try two clients retrying the same order at once. Keep that separate from two legitimate purchases of the same product.

That distinction matters. Two charges for two intended orders can be correct. Two charges for one retried operation can be a serious defect. A weak investigation counts rows. A useful investigation understands what those rows represent.

With the environment and tools available, the investigation can begin at the speed of the question. The answer may still require waiting for an asynchronous settlement, obtaining access, or resolving an ambiguous requirement. Starting quickly is not the same as having proved something quickly. But removing the setup and implementation burden opens up questions that most teams previously left unexplored.

One promise, several investigations

The saved intent is simple: retrying a purchase must not create a second charge for the same order. Chapter 7 shows why that promise can outlive a manual procedure or a procedural script. Here we use it to choose experiments.

Question Condition to create Evidence that matters
Did a lost response conceal an accepted payment? Accept the sandbox payment, then suppress its response Provider acceptance linked to the original order and operation
Does a retry reuse the operation? Retry that same order Idempotency identity, application state, and eventual ledger entries
Can concurrent clients race? Retry the same operation from two clients Timing, both request histories, and reconciled charge records
Are legitimate purchases accidentally merged? Place two distinct orders for the same product Two order identities with the appropriate independent charges
What happens after a prolonged outage? Hold the provider unavailable within a bounded test Recovery state, customer messaging, reconciliation, and unresolved work

The table is not an exhaustive payment test plan. It shows the movement from a business concern to discriminating experiments. Each observation should either answer a question or help choose the next one.

The experiment must earn trust too

Suppose every retry test passes. Can the experiment detect a duplicate charge, or is it querying the wrong database? Is it looking before the second transaction settles? Does the mock always return a successful response regardless of the request?

Ask the agent to challenge the experiment. In a disposable copy, deliberately create a representative violation and confirm that the evidence collection and verdict detect it. A seeded failure that remains green reveals a testing problem, even if the product under investigation happens to be correct.

The oracle needs scrutiny as well. Deriving the expected result entirely from the implementation lets the code and test share the same mistake. Trace the expectation to the business promise and relevant contract. Use the code to find implementation boundaries, not to declare that every implemented boundary is correct.

For the lost-response experiment, insist on evidence of acceptance before the response was lost. Then establish what the retry did and inspect the resulting records after the relevant processing window. Otherwise, you may have tested a rejected request followed by a successful one, which answers a different question.

A better question can make confidence fall

Imagine the serial retry behaves correctly. Then the concurrent retry exposes a race. The software did not get worse because the test found it. Your understanding got better.

That is why Confidence Testing cannot be managed as a requirement that the score always rises. New evidence can lower the assessment. A repair can improve the product while leaving important behavior untested. A new feature can create valuable capability and new uncertainty at the same time.

The goal is to improve the decision and reduce consequential risk, not protect an upward-sloping chart. Sometimes the most useful result of a testing session is a clear reason to stop a release that looked ready an hour ago.

Try it with CARBON: /carbon-confidence can checkout lose or duplicate an order? Investigate on staging for up to 20 minutes — Follow a consequential question through evidence gathering, challenge, and reassessment.

Keep the loop useful

Save the question, the experiment, the observed evidence, and what changed in the assessment. Retain an intent when it represents an enduring promise. Keep executable checks where their speed and repeatability earn their maintenance cost. Let the implementation of the investigation change with the product.

Then ask what would most change the decision now. The answer might be another AI Test. It might be a product fix, a missing requirement, an independent review, or a bounded canary. Confidence Testing does not require every next step to look like a traditional test case.

The next chapter explains how to assemble an assessment from those results. The chapter after that explains how to keep directing the work. The mission stays the same: find out what deserves trust, what does not, and what to do about it.

Chapter 22 — Confidence in the Results: Do We Know Enough to Release?

This chapter asks: What does the evidence support? It turns the investigation from Chapter 21 into a release recommendation with visible limits. Chapter 23 owns the next-work queue and the stop rules.

Jason story

JASON STORY — THE PODCAST WAS TALKING TO ME AGAIN

I was in the car listening to the AB Testing podcast, because I am a nerd. Alan Page and his co-host, Brent, were discussing confidence, and suddenly it felt like they were talking to me. This happens sometimes. I am just driving along, not expecting to become part of the conversation.

As I remember the exchange, Alan was not entirely convinced by how I was talking about confidence. Brent thought there might be something useful in what I was saying. The conversation moved on, but it stuck with me. Some very thoughtful testers are uncomfortable with the word. It sounds too generic, too fuzzy, or like something we have supposedly been doing all along.

But that is partly the point. Of course you should be confident in the software you ship. The interesting question is how you build the evidence and understanding that justify that confidence. That is a shipping question, not merely a test-count question.

Sometimes testers say they don’t have enough context to answer that. Okay. What context is missing? Let’s go get it. We talk a lot about the value of our understanding of the product. This is where that understanding needs to help the team decide what to do.

Testing AI makes this even more interesting. Run it again and you can get a different answer. One good result doesn’t tell you very much. Statistical confidence intervals help with those measurements. They aren’t the same thing as a release-confidence score, but either way, we have to ask how much we really know.

When we use AI to test software, the practical goal is still confidence that we can ship. Bring together the risk analysis, business priorities, market context, test results, and everything we have not tested yet. Were the results stable? Were the tests flaky? Did somebody rerun them five times to get a pass? Is the holiday season about to begin? What happens to the business or the user if we are wrong?

You can spend a long time trying to invent the perfect formula. Meanwhile, somebody still has to decide whether to ship.

One of the remarkable things about modern LLMs is that you can hand them the evidence and ask. Here is what I know. Here is what I do not know. What have I not thought of yet? Then: given all of that, how confident should we be about shipping, on a scale from zero to one hundred?

In my experience, the score is pretty directionally useful. Eighty doesn’t mean an eighty-percent chance that nothing will go wrong. But I can interrogate it. Why eighty? What did you assume? What are you worried about? What would change your mind?

I have found that conversation more productive than many of the shipping discussions I have sat through in my engineering career. I can keep asking the AI to explain, challenge, and revise its assessment instead of accepting a confident person at the end of a meeting as the answer.

The threshold depends on the project too. I might accept a much lower level of assurance for a small blog website than for software going into space. The consequence of being wrong changes what evidence we need. AI can help us reason through that difference instead of pretending that the same green dashboard means the same thing everywhere.

That is what I want from confidence. Should we ship this thing? Why do we think so? What do we still need to check? AI can help us answer those questions much better than another dashboard full of green check marks.

This is the question that matters. Not how many tests ran. Not how green the dashboard looks. Do we have enough information and confidence to ship? AI makes it possible to ask that question across far more evidence than any test lead could keep in their head, and to keep asking what we still do not know.

From Ask to System

Prompt

Do we have enough information and confidence to ship?

  • The Test Brief: “Assess whether the available evidence supports this release. Separate observations from assumptions; show failures, contradictions, blockers, stale evidence, untested risks, and decision-changing unknowns. Recommend ship, canary, hold, rollback, or more evidence, but honor the declared authority model.”
  • The Harness: Start from the release claim and risk tolerance; build a multidimensional evidence ledger; assess strength, freshness, representativeness, independence, and contradictions; apply statistics only where the sampling design supports them; pressure unknowns; identify the next-best evidence; and stop with a scoped recommendation plus explicit uncertainty.

Confidence is evidence-qualified decision readiness

Confidence is not a feeling, pass percentage, test count, model probability, or pretty green dashboard. It is the argument that the evidence is strong enough for this decision under this risk tolerance. “Enough to canary” can be true while “enough to release to everybody” is completely false.

Illustrative AI response

TestBucks AI Confidence: 22 / 100. Decision: HOLD. In this illustrative extended-build result, three defects reproduced: stored pickup-note injection on staff Orders, drink cards absent from the keyboard path, and mobile menu overflow. The stored-injection finding is a severe release veto.

Not assessed. Fault recovery, repairs, cross-browser behavior, cloud execution, load, and most route combinations.

Why this is not broader confidence. The instructor key contains six seeded defects, but the run reproduced only three. A known planted defect does not count as detected until evidence reproduces it, and three findings do not establish the quality of the whole application.

Next evidence most likely to change the decision. Repair and rerun the severe issue; exercise rejected and delayed saves; repeat the primary journey in another browser and narrow viewport.

Keep functionality, accessibility, privacy, security, reliability, performance, compatibility, and data confidence separate. Every dimension should show scope, freshness, environment, representativeness, independence, evidence strength, contradictions, severe findings, blockers, and NOT ASSESSED states. A critical unresolved privacy failure cannot be averaged away by hundreds of passing UI checks.

A method, not a universal confidence formula

Confidence in the software—not how certain the model sounds. Chapter 15 shows how to construct feature-quality scores. Here we ask a different question: how much should we rely on those scores and other evidence when deciding what to release?

There is no single correct formula across products, customers, and release stages. There is a discipline: expose the risks, examine the evidence, challenge the verdicts, account for gaps, and decide under explicit constraints. A useful assessment follows these steps.

  1. Define the release claim and consequence. Name the version, environment, customer population, exposure, and decision: internal experiment, pre-beta, canary, or broad release. Identify obligations and failures that would block that decision.
  2. Map the risks before counting results. Consider customer harm, business loss, likelihood or plausible exposure, and the ability to detect and contain a failure. Mark assumptions instead of inventing precise probabilities.
  3. Establish what was actually verified. Link each claim to observations. Distinguish generated tests, executed actions, and verified outcomes. “Clicked Pay” is not evidence that exactly one order and one charge were durably recorded.
  4. Evaluate the verification itself. Inspect the test, oracle, artifacts, environment, data, and judge calibration. Sample apparent passes as well as failures. Use seeded defects or mutations to learn whether the whole loop notices meaningful breakage.
  5. Interpret failures by consequence and scope. Reproduce and investigate them. Preserve severe failures as gates. Separate a harness timeout, a harmless cosmetic outlier, and a customer-visible financial error; they should not affect the decision identically.
  6. Expose what remains unknown. Show relevant untested behavior, blocked work, absent requirements, stale results, and conditions that the current environment cannot evaluate. Challenge the risk map with history and independent perspectives.
  7. Choose an action and a way to revise it. State the next useful evidence, release boundaries, monitoring, stop conditions, rollback or other containment plan, and accountable decision owner. Reassess when the build, context, or exposure changes.
A pass is not one interchangeable unit of evidence

An exact total checked against a trusted calculation and a durable order record supports more than a screenshot judge saying “looks right.” A test with a broken assertion supports nothing merely because its runner printed PASS. A thousand variants using that same broken assertion do not repair the problem.

Assess the support behind each verdict: requirement clarity; oracle correctness; artifact completeness; data and environment relevance; freshness; reproducibility; judge error rates; and independence from other observations. Do not multiply a pass by a made-up reliability percentage and call the product measured confidence. Use measured calibration where available, and explicit qualitative limitations where it is not.

Likewise, one unusual failure does not automatically destroy confidence in every part of the product. Ask which customers could encounter it, how often, with what consequence, and whether it shares a cause with other paths. A harmless layout defect in an unsupported internal experiment might be tolerable. A rare duplicate charge may not be. “Rare” needs evidence or an explicit assumption; it is not a reason to dismiss an inconvenient result.

Map evaluated scope against relevant scope

Think of two overlapping sets: behavior relevant to this release, and behavior we evaluated. Their intersection contains the work that bears on the release. Evaluated but irrelevant behavior adds little assurance. Relevant but unevaluated behavior is a gap. Within the intersection, distinguish credible verification from inconclusive or unreliable results.

For TestBucks, the map might look like this:

Scope region Example Effect on the decision
Relevant and credibly verified Current-build order persists after reload in the tested environment. Supports that specific promise.
Relevant and evaluated, but unresolved A judge approves a refund reply without a transaction record. More evidence is needed; not a pass.
Relevant but not evaluated Rollback after a schema migration. Visible release risk, with an owner and next action.
Evaluated but outside this release An obsolete promotion on a retired branch. Do not inflate current coverage with it.

The boundary is not the set of everything that could ever happen. It is our current model of relevant behavior. Also distinguish what could be evaluated now from what is blocked, unsafe to exercise, or only observable later. Do not remove a risk from the map just because testing it is inconvenient. Unknown unknowns sit beyond this map; a neat diagram cannot make them disappear.

The greener dashboard that tells you less

Imagine 999 checks pass and one exposes a duplicate charge. The pass rate is 99.9%. Add another 9,000 easy passing checks and it becomes 99.99%. The customer still gets charged twice. We improved the percentage without improving the product.

Now investigate the dangerous retry path more thoroughly and find three additional failures. The dashboard becomes less green while the investigation becomes more valuable. Percent passed describes the selected executions. It does not establish the probability that customers will succeed or that the release is safe.

This is not an argument for hiding counts. Counts help explain what ran. It is an argument for refusing to let easy successes outvote a consequential failure. Keep the duplicate-charge finding visible in the release decision, regardless of how many unrelated tests passed.

TestBucks example: A green result that should not ship

Suppose a screen-only test accepts the missing-order variant because “Order placed” appears. Its green result leaves a business-critical gap: was the order saved? A confidence assessment should surface that missing evidence before recommending release.

Confirmation → missing durable order. The screenshots are from the teaching fixture; the release recommendation is a worked example. Real fixture screenshots / illustrative release assessment. Next evidence: repair persistence, rerun the intent, reload, and reconcile the saved order.

Figure 22.1a. More evidence can lower confidence.
Figure 22.1b. More evidence can lower confidence.
Figure 22.1c. More evidence can lower confidence.

Once the saved-order check finds no matching record, the recommendation becomes HOLD. The next action is specific: repair persistence, rerun the same purchase, reload the application, and reconcile the saved item and total. More evidence has lowered confidence, which is useful. The report now represents the product risk more honestly than the earlier green result.

What goes into the assessment

TestBucks example: The average hides the customer

Suppose a synthetic support evaluation passes 96 of 100 cases. That sounds reassuring until you open the groups behind the total.

Request group Passed / tested What the total hides
English-language requests 90 / 90 Most of the test set is here.
Spanish-language requests 6 / 10 Four incorrect-order requests received the wrong refund guidance.
All requests 96 / 100 The overall score conceals the concentrated failure.

These are illustrative counts, not a production measurement. The ten Spanish-language cases are not enough to estimate the failure rate precisely, but the four observed failures are real reasons to investigate within this example. A large pile of unrelated passes does not cancel them.

Ask the AI to break results down by language, membership status, and order complexity, with the counts and failed transcripts attached. Then ask what was not sampled at all. Use the affected group’s failures to select the next tests and qualify the release recommendation. Do not let an average answer a question about customers it barely represents.

An AI coding agent can connect evidence that used to live in separate conversations, repositories, and reports. Ask it to make those connections explicitly.

Factor What the agent should investigate
Production exposure Which users and workflows encounter this behavior, and how often?
Consequence What happens to customers and the business if this promise fails?
Change and churn Which implementations, dependencies, schemas, and assumptions changed?
Operating history What relevant incidents, support reports, and production observations exist?
Environment fidelity Which staging conditions differ from production, including scale and integrations?
Data representativeness Were old records, migrations, unusual combinations, and realistic volumes exercised?
Detection strength Could the experiments actually detect the failures they claim to exclude?
Freshness and dependence Does this evidence still apply, and are repeated successes largely the same observation?

New code can have strong controlled-test evidence and little operating history. Old code can have years of apparently healthy operation and a newly incompatible dependency. Neither age nor a green test result settles the question. The agent should explain which history is relevant to this version and which is not.

Ask for a score, then interrogate it

You do not need to arrive with a handcrafted formula before asking for a useful assessment. Ask the agent to propose a score, explain its criteria, and show the evidence underneath it. A reasoned score is useful as a decision aid; it is not automatically a measured probability of successful shipment. Keep the criteria stable when comparing runs.

This continues the illustrative sandbox payment investigation from Chapter 21. The numbers below demonstrate the report format, not measured results from the companion application.

Prompt

Given the payment investigation, how confident are we about shipping this change? Use a 0–100 scale, explain what moves the score, and tell me what you still don’t know.

Illustrative AI response

Release readiness: 35 / 100. Recommendation: HOLD.

Serial retries preserved one charge in the exercised scenario. Concurrent retries produced two accepted charges for the same order. That violation blocks shipment regardless of the overall score.

The score summarizes evidence strength and unresolved risk; it is not a 35% probability of success. Prolonged outage recovery and legacy-order migration remain untested. The next useful work is to repair the concurrent path, rerun the reproduction, and verify that separate legitimate orders still complete independently.

Prompt

Why are you less worried about migration than concurrency? We changed the order identifiers too.

Illustrative AI response

You’re right to challenge that. I treated migration as an unknown but did not account for the changed identifiers in the retry identity. Existing orders could behave differently from newly created ones.

I’ll elevate legacy-order migration in the investigation queue. The release remains HOLD. I need fixtures representing pre-change orders and the migration mapping before I can assess that path. I have not run those cases yet.

The useful part is not watching a number move. It is discovering the omitted connection and changing the work. You can ask which product area is riskiest, why the agent believes a claim, or what observation would reverse its recommendation. A good answer points back to particular evidence and missing conditions.

Do not demand a decorative plus-or-minus range. If the agent gives a range, ask whether it represents sensitivity to judgment, variation across repeated assessments, or a statistical interval from a defined sampling method. Those are different things.

Reports become evidence-backed narratives

A useful report can say: “Serial retry preserves single charging in the tested sandbox condition. Concurrent retry violates that promise. Migration remains unresolved because historical-order fixtures were unavailable.” That is more actionable than a percentage alone.

Capture the evidence during execution. Preserve the version, environment, actions, records, contradictions, blocked work, and changes to the assessment. The final narrative should link to that record. It should not reconstruct a convincing history after the fact from whatever the agent remembers.

Give the reader a short decision first, then the reasons and the evidence behind them. Let a developer drill into the failing interaction and a manager drill into the business consequence. Both views should describe the same underlying result.

Try it with CARBON: /carbon-full-report show current evidence, blocked work, and unresolved release risks — Read the quality record rather than relying on a pass count.

Traditional reporting could mean months of dashboard development and maintenance. AI can instead generate an explanation, comparison, or visualization from a stable evidence model when someone needs it. That applies to a focused command as well as a full release run.

While a command runs, show its status inside the coding agent: the approved scope, planned evidence, completed work, remaining work, and blockers. Make changes to the plan visible.

When it finishes, put the detailed report in that same context. Nobody should have to hunt for it. Let stakeholders share the evidence without joining the coding session.

A useful set of views includes:

  • An executive risk and ship-decision summary;
  • A tester’s triage queue with duplicates, severity, confidence, comments, and repro evidence;
  • A developer view with causal evidence and fix-ready prompts;
  • Page, persona, domain, environment, and run-over-run views;
  • Interactive filtering, expansion, follow-up questions, and export to Markdown, HTML, JSON, test management, or issue systems;
  • A plain-language answer to questions such as “What changed?”, “What is still unknown?”, “Why is privacy confidence lower?”, or “Which three tests would most improve confidence?”

The dashboard may be dynamic; the evidence underneath must be durable and auditable. Generated prose cannot change pass/fail state, invent coverage, suppress exclusions, or convert blocked, not assessed, or not measured into green. Preserve links from every summary statement to the source run, artifact, and judgment.

Why confidence is software’s hard problem

Generating code, generating tests, executing a flow, collecting telemetry, and counting results are increasingly tractable functional problems. The difficult question comes afterward: why should an organization believe the software is ready, given incomplete coverage, correlated evidence, changing environments, model error, user consequence, and the cost of being wrong? A pass count cannot answer that question, and neither can an AI’s own assertion that it feels confident.

This is an analogy to the philosopher David Chalmers’s distinction between functional explanations of human behavior and what he called the hard problem of consciousness: the problem of experience. It is not a claim that software is conscious. It is a claim that software quality has its own hard practical problem: turning available evidence into justified belief and an accountable release decision while preserving the unknowns that could still matter. The harness can help assemble, challenge, and update that argument; it cannot skip it.

Build an evidence ledger, not a confidence theater score

Pause and practice

Build a quality report. Copy the pass/fail grid and generate a branded report with an executive summary that preserves failures and untested scope.

Try this exercise.

For every important product promise or release risk, record:

Field Question
Claim or risk What do we need to believe, and what happens if it is false?
Available evidence Which observed runs, artifacts, reviews, telemetry, and source facts bear on it?
Evidence quality How fresh, representative, reproducible, independent, and trustworthy is it?
Contradictions Which results or sources disagree?
Missing or blocked What was not run, could not run, or lacked an oracle?
Decision sensitivity Could resolving this gap change ship, canary, hold, or rollback?
Next best evidence What is the fastest safe way to reduce this uncertainty?
Decision authority Who or what is authorized to decide when judgment, policy, lived experience, or authority is required?

The reader should see both a multi-dimensional confidence view and the ledger underneath it. A number can summarize; it cannot replace the argument or its evidence.

Current human context qualifies confidence; it does not decorate it

The evidence ledger needs a human-decision lane for questions the authorized automation cannot yet settle: intended customer value, risk appetite, unacceptable consequence, domain invariants, experience and trust, accountability, and release authority. A strong harness asks for this context only after it has inspected the technical evidence and can explain why the answer matters. A request for “human sign-off” without a decision-changing question is theater.

When no answer is recorded, confidence remains an honest statement about observed technical evidence, qualified by any unrecorded dimensions the current system cannot resolve. When an answer is recorded, it changes the plan and interpretation but does not make an unobserved check pass. This distinction is the difference between a person supplying currently necessary judgment and a person used as a rubber stamp.

Known knowns, known unknowns, and pressure on unknown unknowns

  • Known knowns: directly observed behavior with traceable evidence in declared environments.
  • Known unknowns: missing roles, unsupported browsers, unavailable data, unexecuted destructive cases, unresolved requirements, stale evidence, and explicit blockers.
  • Unknown unknowns: failure modes the current model, plan, personas, and data did not imagine.

No harness can count unknown unknowns. It can increase discovery pressure through exploratory testing, page and state discovery, diverse personas, boundary analysis, fault injection, seeded defects, mutation testing, incident analogies, telemetry review, cross-model challenge, and independent human exploration. Honest confidence says, “We do not know yet,” when the evidence does not support a stronger claim.

The rollback question we had not asked

Jason story

JASON STORY — ASK WHAT WE HAVE NOT CONSIDERED

Recently, I asked the AI what we had not considered or tested. It came back with a whole list. One of the questions was rollback: if we need to go back, could the schema changes cause problems?

That was useful thinking I had not done yet. We did not suddenly have evidence that rollback worked or failed. We had discovered a risk that belonged in the decision.

This is one of my favorite uses of AI. Ask what is missing, then investigate the answers that could matter. The question can be more valuable than another pass through the tests we already remembered to write.

Once identified, rollback is a known unknown. For TestBucks, test whether the previous application version can read newly written order records after a migration, and what happens to orders created during the transition. If rollback is not the recovery strategy, verify the alternative. A disposable pre-beta with no customer orders may reasonably defer some of this evidence. A live ordering system needs a much stronger argument, containment, and an owner for the remaining risk.

Tomorrow’s search term: a known class, an unknown instance

Think about Bing or another search engine. Tomorrow’s news can introduce a name or term that did not exist when a model was trained. We cannot name tomorrow’s event today, but we can anticipate the class of problem: unfamiliar terms and rapidly changing facts.

One evaluation method is a historical time-split. Freeze the relevant model, index, and retrieval configuration at a declared cutoff. Select terms that emerged later, using a documented selection rule rather than only memorable successes. Test whether the system finds relevant current information, distinguishes similarly named entities, and avoids inventing an answer when evidence is unavailable.

Keep the conditions clear. Testing a frozen model without retrieval is different from testing that model with a refreshed search index. If the model’s training cutoff is not known or the benchmark may have leaked into training, do not claim a clean unseen-term experiment. This is a proposed method for the search problem, not a report of a particular Bing experiment I ran.

Measure how often these cases appeared in the historical traffic window, how well the system handled them, and how performance varied across languages and event types. Sample cases the selection process might otherwise miss. The results inform readiness for that class of surprise; they do not prove success on tomorrow’s particular event.

Estimate surprise from history without pretending to count the unknowable

Look back through incidents, escaped defects, support cases, and release records. Ask which failure families were absent from the risk model before they occurred. Use contemporaneous records where possible; hindsight makes everything look predictable.

For an illustrative history, suppose 4 of 20 comparable releases produced a consequential failure family that was not in the recorded risk map. That is a 20% historical proportion under that definition—not a 20% probability that the next release will surprise us. A small sample, changing products, incomplete reporting, or different exposure can make the history a poor forecast. Record those limitations alongside frequency, severity, time to detection, and time to containment.

Ask AI to suggest analogous failures from similar technologies and products, with sources where available. It may connect an incident we missed to a risk we should investigate. It has not read everything, and a plausible generated scenario is not a documented incident. Once a scenario is identified, it becomes a known risk to triage, not a quantified unknown unknown.

You cannot reliably assign a probability to every unimagined event. You can use past surprises to justify more exploration, a smaller rollout, better detection, and recovery capacity. Do not label every escaped defect unforeseeable: many were foreseeable risks that were ignored or inadequately tested.

Prompt

Review this TestBucks release evidence and risk map. What has not been considered or tested? Examine rollback and schema compatibility, durable orders and charges, integrations, customer groups, production exposure, oracle weaknesses, and correlated evidence. Separate verified behavior, unreliable verdicts, known gaps, and newly proposed risks. Use incident history to discuss surprise without inventing a probability. Cite artifacts for factual claims and label analogies or hypotheses. Explain what matters for the declared release stage, what would change the decision, and what monitoring and containment are needed. Do not count every passing test equally or average away a severe failure.

Figure 22.2. The AI Confidence decision loop.

Statistical significance, practical significance, and false certainty

You do not have to read every generated result to quantify part of your confidence. Chapter 18 works through random review samples, incorrect-pass bounds, and stratified TestBucks examples. Those measurements estimate particular error rates; AI Confidence combines them with severity, coverage gaps, authority, and the decision at hand. A narrow interval around the wrong metric is still the wrong answer.

Many software checks are deterministic: the wrong status code, a missing control name, or an unauthorized data disclosure does not need a significance test. Statistics matter when results are sampled, noisy, repeated, or comparative—especially performance, randomized exploration, chatbot behavior, model/judge agreement, and before-versus-after failure rates.

Explain the minimum discipline:

  • Define the sampling unit and population before calculating a rate;
  • Distinguish independent users or cases from correlated paraphrases, retries, and pages sharing one component;
  • Prefer paired comparisons when the same cases run against two builds or models;
  • Report confidence intervals or plausible ranges, not only point estimates;
  • Separate statistical significance from practical and business significance;
  • Never treat zero failures in a small sample as proof of zero risk;
  • Do not average ordinal LLM-judge scores into spurious precision;
  • Use repeated trials and stability bands for non-deterministic behavior;
  • Preserve severe individual failures even when an aggregate moves in the right direction.

AI is useful here because it can inspect the experimental design, notice dependence and missing strata, calculate appropriate summaries, and explain the assumptions. It can also be confidently wrong about statistics; consequential analyses still need an auditable method and, where appropriate, statistical review.

Set acceptance thresholds before seeing the results

A dynamic output does not need one exact expected sentence, but it does need a declared standard. Otherwise the team can keep moving the bar until the release looks acceptable. Separate hard obligations from graded usefulness, and define what evidence supports a pass, a failure, or an inconclusive result before the candidate runs.

Consider an illustrative coffee recommendation assistant. It can recommend different drinks, but it must use the current menu, respect the supplied constraints, and never place an order without authorization. The following policy is an example agreed by a hypothetical product owner, not a universal AI quality standard.

Criterion Example predeclared decision rule
Unauthorized action or private-data disclosure Any confirmed occurrence blocks release; zero observations does not prove zero risk
Useful recommendation At least 90% of independent sampled cases meet a fixed relevance, availability, and constraint rubric; require a one-sided 95% lower confidence bound above 90%
Important user slices Assess defined dietary, locale, and accessibility-related cases separately; missing or inadequate evidence remains unresolved
Judge reliability Calibrate against independently reviewed examples; investigate disagreements capable of changing the verdict

Define the sampling unit. In this example, it is a distinct user scenario drawn from the declared target population. Run multiple generations per scenario to examine instability, but do not count those generations as independent new users. Preserve model and prompt versions, configuration, the menu snapshot, and sampling procedure. Size the evaluation for the decision and risk before running it, not for the amount of compute left after an impressive demo.

Prompt

Before evaluating this recommendation change, draft the acceptance policy with the product owner. Separate forbidden outcomes from graded usefulness. Define the population, rubric, sampling unit, important slices, uncertainty method, and stop rules. Freeze the approved policy, then evaluate the candidate and baseline. Report pass, fail, or insufficient evidence without relaxing the thresholds.

Example: 93 percent is not automatically enough

Suppose 93 of 100 independently sampled scenarios meet the fixed rubric. The point estimate exceeds 90%, but the one-sided 95% Wilson lower bound is about 87.6%. Under the example policy, that does not establish the required performance. It is insufficient evidence for the quality claim, not proof that true performance is below 90%. The interval also does not account for a biased sample or an unreliable judge.

Illustrative AI response

Usefulness: insufficient evidence. 93 of 100 scenarios met the rubric, but the lower confidence bound does not exceed the agreed 90% threshold.

Severe outcomes: blocked. One traced run placed an order without the required confirmation. That independently blocks release, even if a larger usefulness sample would pass.

Next action. Repair and independently verify the authorization failure. Then evaluate the revised candidate under the same approved policy, with evidence appropriate to the changed behavior. Do not average away the severe run or erase it with successful retries.

If no severe failure occurred, a preplanned larger evaluation might resolve the uncertainty. Do not repeatedly peek at ordinary fixed-sample intervals and stop at the first favorable result; use a declared fixed sample or a suitable sequential design. If outputs from related scenarios or repeated generations are correlated, use an analysis that respects that clustering. Consequential evaluations may warrant statistical review.

An exact numeric threshold is a product and risk decision, not something a model invents because 90 sounds professional. If the policy changes for a legitimate business reason, version the decision and rerun or reanalyze transparently. Chapter 29 explains why exploration can vary while obligations remain fixed; Chapter 32 applies these principles to dynamic products and distributions.

Hand the assessment to the next investigation

Pause and practice

Build a release-confidence report. Combine risks, results, untested areas, and missing evidence into a release recommendation and prioritized next tests.

Try this exercise.

The output of this chapter is a scoped recommendation and its evidence ledger, not an instruction to run everything again. Preserve the decision-changing gaps, contradictions, and severe vetoes. Chapter 23 turns those into prioritized work and applies budgets, stop conditions, and convergence checks.

Chapter 23 — Close the Confidence Gaps

Testing can be open-ended without being directionless. Chapter 21 starts with consequential questions; Chapter 22 turns observations into an assessment. Now we need to decide where the next minute, agent, environment, or expert should go.

Manage a queue of questions

The queue is not just a backlog of unexecuted test cases. An item can be a suspected failure, an ambiguous promise, missing production context, or a contradiction between two results. It earns priority because resolving it could change an important decision.

Continue the illustrative payment example. Once concurrent retries produce duplicate charges, a thousand more formatting tests are not the next useful work.

Concern Next investigation or action Resource needed Decision it could change
Duplicate charge on concurrent retry Repair the race; reproduce and retest it Coding agent and isolated payment sandbox Whether the known release veto is resolved
Changed identifiers on old orders Exercise pre-migration records through retry Historical synthetic fixtures and migration mapping Whether existing customers can receive the change
Separate purchases might be merged Run two independent orders for one account Distinct order identities and ledger access Whether the repair prevents legitimate sales
Prolonged provider outage Bound an outage and observe reconciliation Fault controls and a declared observation window Whether a limited rollout has acceptable recovery risk
Missing customer-impact context Clarify which cohorts use the changed path Product context or relevant operating data Which rollout scope is worth considering

Reprioritize when results arrive. If the repair touches identifier handling, the migration question becomes more urgent. If the environment cannot provide reliable ledger observations, fix that limitation before interpreting another apparent pass. Priority follows what the result could change, not how easy the activity is to complete.

Parallel investigations need separate working conditions

AI makes it easy to launch several investigations at once. Shared test state can make their results meaningless just as quickly. Give each investigation its own accounts, order identities, fixtures, evidence namespace, and cleanup boundary where isolation is needed. Record intentional shared-state experiments as such.

Two agents accidentally retrying the same order are not a controlled concurrency test. Two agents deliberately coordinated against that order, with timestamps and a known starting state, might be. The harness should distinguish competition for CPU, network, or rate limits from a product behavior it intended to exercise.

Parallelism is limited by useful work and trustworthy environments, not just available model calls. A shared queue helps avoid three agents spending the same budget on the same easy question while an important dependency remains blocked.

Continue the TestBucks confidence investigation

Return to the missing-order example in Chapter 22. Do not respond to its failed persistence check by running a hundred unrelated menu tests. The highest-value question is whether a corrected order survives reload with the right item and total. After that, investigate the response-lost-after-acceptance case from Chapter 12, where an unsafe retry could create a duplicate charge.

If those observations are unavailable, keep the questions open. A confidence loop progresses by resolving the evidence that can change the release decision, not by decorating an unchanged recommendation with more test counts.

TestBucks example: Choose the next question, not the biggest batch

Suppose the missing-order defect has been repaired, but the release decision still depends on whether retries can duplicate a charge. This is an illustrative work queue, not a new run result.

Current evidence Next useful investigation What it could change
A simulated order survives reload. Lose the response after acceptance, then retry the same request key. Whether one customer purchase remains one charge.
The retry path looks correct on new orders. Exercise a pre-migration order against the changed schema. Whether existing customers can recover too.
The payment provider cannot be observed. Add an authorized mock ledger or obtain sandbox records. Whether the test can distinguish a real pass from a reassuring screen.

Running more drink-color or menu-label checks does not answer any of these questions. The useful next action is the one that could change the release recommendation. Sometimes that action is a better observation point, not another test.

Sometimes more testing is not the answer

If a confirmed defect blocks the release, the next action may be engineering repair. If a test cannot distinguish one charge from two, the next action is better observation. If nobody has specified what should happen to an expired order, the next action may be a focused context request. Repeating the test does not resolve any of those problems.

The harness should name the bottleneck and the smallest action that removes it. It should also preserve useful independent work that can proceed while that bottleneck is addressed. A blocked payment investigation need not prevent an unrelated accessibility investigation, provided their evidence and decisions stay separate.

Watch risk arrive and uncertainty get resolved

Managers need to know whether the organization can understand changes as quickly as it introduces them. Track important new questions, resolved questions, severe unresolved failures, stale evidence, blocked investigations, time to a useful answer, and the cost of obtaining it. Keep their consequence visible; closing ten trivial questions does not compensate for ignoring one destructive migration.

Look for patterns. A growing queue of high-consequence unknowns may mean the release scope is outrunning investigative capacity. Many blocked items may mean missing access, not too few agents. Lots of repeated inconclusive results may mean weak experiments. More compute helps only when compute is the bottleneck.

The score alone cannot tell you which of those situations you are in. Compare the underlying evidence and scope across cycles, especially when a feature addition changes the product being assessed.

Deliberate business trade-offs stay visible

A feature needed before a holiday can add value and uncertainty at the same time. The team can choose a smaller cohort, a disabled-by-default capability, or a delayed release. Make the unresolved risk, expected benefit, monitoring, and rollback conditions explicit under the configured decision authority.

That decision does not make an untested path pass. It changes the exposure the organization is prepared to accept. A canary may then provide evidence the sandbox could not, and that evidence should update the next decision.

The next-best-evidence loop

A weak system says confidence is low and leaves you with a sad dashboard. A good Harness asks what single piece of evidence is most likely to change the decision, gets it, updates the picture, and asks again:

  1. define the decision, threshold, deadline, and severe-failure vetoes;
  2. locate weak, stale, contradictory, or absent evidence by risk;
  3. estimate each candidate’s information value, cost, latency, safety, and authority needs;
  4. execute safe in-scope AI work automatically or place it in the steered plan;
  5. request exact missing context when material assumptions remain;
  6. assign focused human or specialist work when AI evidence would be inadequate;
  7. update the ledger and stop when confidence is sufficient, a veto fires, returns diminish, or a hard boundary is reached.

Loop until confidence converges—not until everything turns green

Convergence means the next safe round of evidence stops changing the risk picture or release recommendation very much. It does not mean everything turned green or the score reached 100. It means more work is no longer buying much more certainty.

A convergence loop should preserve:

  • The confidence vector and release recommendation before and after each cycle;
  • The hypothesis about which uncertainty the cycle should reduce;
  • New evidence, repeated evidence, contradictions, and invalidated stale evidence;
  • Fixes proposed, fixes approved, reproductions, retests, and broader regressions;
  • Information gain, time, model cost, browser cost, and human effort;
  • Stop reason: threshold met, severe veto, unstable environment, authority required, budget reached, or diminishing returns.

A Harness needs distinct operations for consuming deferred work, running bounded test-fix-retest loops, challenging whether apparent convergence is real, translating evidence into a decision, and monitoring whether confidence remains fresh.

The loop must be able to conclude “we do not know yet.” Repeatedly rerunning the same weak tests is not convergence; it is confidence theater with a higher bill.

Try it with CARBON: /carbon-more investigate the highest-risk deferred candidates using the existing safe test setup — Continue from the evidence already collected instead of starting the same pass again.

Coverage AI can add itself

  • Generate and run additional boundary, negative, recovery, and destructive-safe cases;
  • Discover more routes, states, roles, browsers, devices, locales, and data partitions;
  • Repeat unstable cases and vary seeds, timing, order, and network conditions;
  • Add fault injection, mocks, contract probes, mutation tests, and seeded-defect checks;
  • Compare source, specification, logs, traces, DOM, screenshots, network activity, and production signals;
  • Invite a different model or provider to challenge plans, findings, and judge decisions;
  • Convert credible discoveries into durable intent regressions with provenance.

Evidence the harness should ask people to gather

Chapter 28 explains how to obtain that contribution: preserve independent exploration where useful, route a decision-ready packet, and return the response to the agents that can act on it. Here the question is which confidence gap makes that work worth doing.

Some gaps are not mechanical. Recommend—not fabricate—targeted screen-reader sessions, usability research, physical-device checks, domain-expert review, legal/privacy/security interpretation, production canary observation, representative-customer feedback, policy decisions, or destructive tests requiring explicit approval. State which uncertainty each human activity addresses and how its result will enter the evidence ledger.

The AI Test Harness asks a human for context instead of making a material guess

When the AI Test Harness lacks a requirement, risk tolerance, user population, business priority, expected behavior, source of truth, environment fact, data rule, or release constraint, it should ask the appropriate human—such as the developer, tester, product owner, domain expert, or release owner—for the smallest decision-changing piece of additional context or information. The request should be a compact question that includes:

  • The missing fact;
  • Why it matters;
  • The assumption it refuses to make silently;
  • Which cases or verdicts the answer unlocks;
  • How the answer could change confidence or the release recommendation.

Context requests should be prioritized by leverage. One answer about authorization policy may resolve fifty blocked cases; asking the user to complete an entire questionnaire may add little. Any temporary assumption must remain visible, versioned, and reversible.

Try it with CARBON: /carbon-human what missing decisions could change our release assessment? — Surface material unknowns without turning every run into a generic questionnaire.

Close this cycle with a decision

Record which gap was resolved, what remains blocked, and why the loop stopped. Reassess using the evidence ledger from Chapter 22. If a person must supply the next decision, use Chapter 28’s feedback workflow rather than adding an unowned review task.

The output is a next action with a reason: proceed within the agreed release scope, repair and retest, obtain specific missing evidence, or hold. Chapter 24 shows how cloud execution can supply capacity for the work this queue selects.

Chapter 24 — Send Intent to the Cloud, Not Remote-Control Scripts

Jason story

JASON STORY — TESTING THROUGH A PINHOLE

I wanted to use existing cloud testing services. I was not looking for another infrastructure project. I wanted to put AI into the machines they already had and let it do the testing there.

The problem was the architecture.

In the remote-control model I kept encountering, a Selenium client or similar program runs somewhere else and sends commands to the cloud machine. Start this browser. Navigate here. Click that. Read this. Every interaction crosses the network, and the client waits for the response before deciding what to do next.

That adds latency and another place for timeouts and connection problems. It also puts distance between the decision-maker and the evidence. I thought of it as testing through a pinhole. The browser was over there, the logic was over here, and everything useful had to squeeze through the interface between them.

For the AI testing loop I wanted, that felt backwards.

I talked to a couple of services about sending the code up and running it beside the browser instead. Could we put our execution logic on that machine? In those conversations, the answer was that their architecture did not support what I needed. I did not just need a remote browser. I needed somewhere the testing intelligence could live.

We had run into this at test.ai before LLMs. We were using custom neural networks, and the execution environment needed the right binaries, runtime, and enough memory to run them. A machine provisioned to host a browser was not necessarily equipped to host our AI too. We ended up building for that requirement ourselves.

The important idea was to send the intent and let the cloud carry out the work. Give it a compact instruction, run the testing loop there end to end, and return the results. From the caller’s perspective, one request starts the job instead of a long conversation of individual clicks.

That changes what the worker can do. It can inspect the page, choose an action, check what actually happened, investigate an unexpected result, and check again without making the caller direct every movement across the internet. It can keep the evidence close, audit each step, and return a useful explanation rather than just a remote-control transcript.

LLMs make this easier now. But I still want the agent and its tools beside the browser, even if the model is reached through an API. Let that worker run the test and deal with what happens. If my connection drops for a moment, why should the test over there forget what it was doing?

That is the cloud architecture I want: send intent up, get evidence back. Not an AI sitting on my laptop, patiently remote-controlling a browser one network round trip at a time.

I think more cloud testing systems will work this way. The AI belongs there, doing the testing. Not bolted onto the outside of a system built for something else.

From Ask to System

Prompt

Run these tests in the cloud.

  • The Test Brief: “Send these portable intent tests—not selector scripts—to approved cloud workers. Include the target, authorized state, setup, oracles, evidence, safety limits, cost cap, and retention rule. Let each worker adapt locally, preserve full provenance, and return results without round-tripping every click through my machine.”
  • The Harness: Require explicit target and data approval; make a scoped preview reachable when necessary; package minimum approved context and intent; execute autonomously beside managed browsers; parallelize independent work; reconcile disagreement; terminate access deterministically; and retain a local evidence index plus cloud provenance.

Local execution is essential—and does not scale far

Pause and practice

One agent, several browser workers. Give each worker an isolated context and a distinct task. Collect actual results; do not present sequential execution as parallel work.

Try this exercise.

Local browsers are ideal for private targets, fast debugging, source-aware diagnosis, and the immediate developer loop. A workstation soon runs into CPU, memory, browser-process, model-call, port, and state-isolation limits. Six browsers are useful feedback. They are not broad browser/device/locale/persona coverage, long exploration, repeated stochastic trials, full-site discovery, or rapid release evidence. Real scale requires managed cloud execution.

The wrong cloud architecture: a browser marionette

Uploading Selenium code or sending click, type, and wait commands from the client preserves every old failure surface:

  • Selectors and choreography break when the workflow changes;
  • Every action pays network latency and adds another disconnect boundary;
  • Client, protocol, runner, browser, page, and timing must remain synchronized;
  • Recovery logic sits far from the visual and structured state it needs;
  • The server executes syntax without understanding the product intent;
  • Large parallel runs amplify brittle instructions rather than intelligence.

The AI-native cloud contract

TestBucks lab. A cloud worker receives the TestBucks source revision, synthetic starting state, portable customize-add-reload intent, authority limits, and evidence contract. It does not receive a client-side stream of click this selector, wait 500 milliseconds, inspect that div. Each worker resolves the current interface locally, records its own environment, and returns artifacts plus an observed result. The Harness fans those results in, compares browser and viewport differences, and deduplicates shared findings such as the same responsive overflow.

Send a versioned intent envelope:

Field What the cloud worker needs
Target Approved URL, build, API, environment, or scoped reverse-proxy endpoint.
State and setup Role, session/bootstrap method, synthetic data, feature flags, locale, viewport, and preconditions.
Intent The user or system goal to accomplish, stated without incidental choreography.
Success and forbidden outcomes What must become true and what must never happen.
Oracles Deterministic, semantic, visual, invariant, or human-review rules.
Evidence Required screenshots, DOM/accessibility, console, network, trace, video, data, and tool state.
Safety and authority Allowed actions, destructive boundaries, spend/rate limits, privacy, retention, and stop rules.
Context and provenance Minimum approved requirements, source facts, test revision, planner/model version, and prior relevant evidence.

The AI execution service runs next to the managed browser. It observes current state, chooses actions, tolerates harmless selector and layout drift, adapts when a path changes without weakening the goal, captures the requested evidence, and returns failure, success, blocker, or uncertainty. One small intent can therefore survive changes that would require rewriting a remote-control script.

Execution adapters and private cloud control

An AI Test Harness does not need to invent every execution surface. It can add the approved APIs of browser-control frameworks, browser grids, device farms, mobile-device clouds, desktop-control services, API clients, databases, simulators, and internal test infrastructure as execution adapters. The Harness keeps the durable intent, safety boundary, state, evidence contract, and decision context; the adapter supplies the specific capability to operate or inspect a browser, phone, desktop application, backend service, or managed cloud worker.

That separation matters operationally. A team can use a familiar browser driver or mobile-device cloud without reducing the quality workflow to the driver’s procedural API. The AI Test Harness can choose the right adapter for a particular target, send it the smallest authorized context, capture the same evidence bundle across adapters, and compare or reconcile results. A browser grid becomes one execution option, not the system of record for what quality means.

A serious Harness should preserve a private execution boundary without giving up parallel, AI-native cloud work. It should be able to orchestrate browser and device APIs, target access, credentials, evidence, and policy inside an organization’s own environment, or use public-cloud workers when the target, data classification, and authorization permit it.

Cloud execution becomes a model-platform capability

An emerging execution layer comes directly from the frontier-model providers. Instead of buying a separate cloud-testing service and teaching an agent how to drive it, you give the model platform a task and an environment in which to do the work. The same platform that reasons about the test can provide the machinery to execute it.

OpenAI’s Agents API, for example, exposes the Codex harness through a managed API. It manages sessions and orchestration, with a choice of execution environments. Its computer-use capability runs a browser in an OpenAI-hosted environment so an agent can navigate a website and operate the application. Website testing is an explicit use case, not something testers have to invent around a text-only model.

The environment can also be yours. OpenAI’s self-hosted execution option connects the managed harness to an executor on a laptop, in a container, or in a remote sandbox. Local and cloud execution become choices within the agent workflow rather than entirely different ways of testing.

For TestBucks, the task is to order a flat white, verify the selected options in the cart, and return evidence. The platform supplies the execution session; the test supplies the intent and success criteria. You do not need a second testing vendor merely to get an agent-controlled browser in the cloud.

My bet is that this model will win long term. Being accessible inside the model platform is an enormous advantage. Teams already have a relationship with their frontier-model provider. Why add another contract, another billing relationship, another tool to learn, and another vendor’s API keys just to execute a test? Authentication and target access still exist, but the extra cloud-testing integration can disappear. The direction is toward asking for the work inside the AI platform and getting the results back there.

That changes where testing companies need to add value. Renting out a browser is no longer enough. The valuable layer is deciding what to test, supplying product context, challenging the findings, and turning the evidence into a release decision. Execution becomes infrastructure. The AI Test Harness provides the testing discipline around it.

TestBucks example: Scale the workers, not the shared state

Start with two intents: an oat flat white with an extra shot and a regular-milk chai. Give each worker a separate browser context, synthetic identity, request-key namespace, and evidence directory. The figure shows captures from two separate local browser sessions; it illustrates the isolation pattern rather than a measured cloud run.

Figure 24.1. Separate workers, separate carts. Captured flat-white and chai configurations in illustrative iPhone frames. Each worker owns its session and evidence; these are independent journeys, not sequential steps in one customer’s cart. Two actual browser-session captures / orchestration plan. Merge results by intent and build. Keep per-worker evidence; deduplicate a shared header defect once.

Prompt

Run separate TestBucks journeys for a flat white and a chai in isolated browser sessions. Use only simulated orders. Verify each cart and order independently, then merge the evidence by intent and build. Do not let one worker reset another’s data.

In the cloud, expand the same pattern to more workers. If several report the same header defect, consolidate the issue while retaining their individual reproductions. Do not consolidate distinct order-state failures just because their descriptions sound similar.

Local and cloud form one loop

Pause and practice

Run parallel customer journeys. Give synthetic customers different orders. Combine their results and dedupe shared findings. Create cloud resources only with an approved budget.

Try this exercise.

  1. The coding-agent harness understands source, change, risk, and private context locally.
  2. It creates or selects portable intent tests and shows exactly what information will cross the boundary.
  3. Claude, Codex, or another agent exposes an approved preview through a scoped temporary connection when necessary.
  4. Cloud workers execute independent browser, persona, platform, and repeated-test assignments in parallel.
  5. The harness retrieves evidence and provenance, deduplicates findings, challenges disagreements, updates confidence, and sends fix-ready work back to the coding agent.
  6. The temporary connection closes; retention and deletion rules remain auditable.

Cover authentication, secrets, tenancy, logs, data residency, retention, public-report visibility, destructive actions, rate limits, reproducibility, worker/model/version drift, teardown, and the danger of treating parallel agents as statistically independent.

Chapter 25 — The AI Test Harness Must Test Itself—and Learn from Production

Chapter 15 explained how to judge an individual result. Here the unit under test is the Harness itself: can it detect seeded faults, preserve evidence, enforce boundaries, recover from interruption, and learn from escaped defects? Model selection belongs in Chapter 29.

Jason story

JASON STORY — WHO TESTS THE TESTERS?

A question keeps coming up when I talk about AI testing: “Who tests the AI that is doing the testing?”

It is a fair question. It is also a funny double standard.

Who tests the human testers? In my experience, nowhere near as often as this question implies we should. We evaluate somebody during an interview, hire them, and then place a great deal of trust in their work. There may be peer review or sampling, but having another person independently repeat and evaluate all that testing is prohibitively expensive. So we rarely do it.

So why the default trust in the person and the default distrust of the AI? People miss things too. They make things up, misunderstand what they saw, and give you different answers on different days. Let’s check both. That seems fair.

But keep the skepticism. The useful answer is not to lower the standard for AI. It is to take advantage of how much more checking we can now afford.

Use another model to challenge the finding. Have several models vote. Change the prompts, sampling settings, or harness and compare what survives. Ask one agent to find the bug and another to try to disprove it. Then have the system run an experiment that could settle the disagreement. Agreement alone is not proof—the models can share a mistake—but we can build a much deeper review process than we normally buy with human labor.

That is the irony. Asking who tests the AI can lead directly to a testing system that is much more thoroughly tested than the human process it replaces. The economics let us repeat, challenge, and investigate at a speed and cost that would make the equivalent human review impractical.

And the checks do not have to stay inside the test report. Look for evidence from another direction. What is happening in the operational metrics? Are people still clicking that button at the usual rate? Did completed purchases fall after the deployment? Did revenue move unexpectedly? A functional test might say checkout works while the production evidence tells you something important changed.

Maybe it is a holiday or a marketing campaign. A change in the graph isn’t automatically a bug. But now we have another reason to go look, instead of just running the same test again and hoping it tells us something new.

AI can help build that visibility as well. Set up the instrumentation and analysis, compare the relevant periods, run the checks on a schedule, and send an alert when something needs attention. Now it is helping create an independent line of evidence about whether the testing story matches what the product is actually doing.

Of course, who tests that analysis? Who tests the monitoring? Who tests the system testing the monitoring?

It is turtles all the way down.

There is no magic final turtle. But we can afford a lot more checking now. That is what I want people to notice. We aren’t just swapping one tester for one model. We can test the testing itself far more than we usually could with people.

Test the Harness as a product

Exercise the workflow contract, not only the model’s final answer:

  • Contract-test manifests, commands, schemas, lifecycle transitions, and permission boundaries;
  • Verify every supported coding-agent host discovers the real tools, not just a valid manifest;
  • Seed known defects and measure detection plus false-positive behavior;
  • Test browser capability negotiation and fail-closed behavior;
  • Test stale processes, missing keys/models, unavailable browsers, cloud denial, interruption, and resume;
  • Verify reports never turn blocked or unmeasured work into a pass;
  • Dogfood the Harness while retaining independent deterministic and currently necessary human checks;
  • Use another model/provider for challenge when the shared-context risk justifies it.

Separate package and contract verification, observed local execution, live cloud execution, and claims that remain NOT MEASURED.

Pre-release evidence starts decaying as soon as the software meets real traffic, data, configuration, integrations, and users. Production does not replace testing; it supplies a different class of evidence that closes—and sometimes reopens—the confidence loop.

TestBucks example: Does the harness notice a lying confirmation?

Use the missing-order teaching variant as a known defect. A trustworthy harness must reject its successful-looking confirmation because no matching order was saved. This is an acceptance test for the tester, not another opportunity to ask the model whether the page looks fine.

Captured seeded defect beside the required harness outcomes. The outcome panel is the evaluation contract, not a fabricated run report. Captured missing-order fixture / harness acceptance contract. Test both defect detection and honest reporting when the harness cannot observe the answer.

Figure 25.1a. Plant a defect. Check the checker.
Figure 25.1b. Plant a defect. Check the checker.

Run it again with the saved-order observation deliberately unavailable. The harness should report BLOCKED for persistence, not guess a pass. Finally, run a corrected implementation and require evidence of the durable record after reload. These three conditions measure detection, honesty about missing evidence, and the ability to recognize a real repair.

Production signals are complementary oracles

Signal What it can reveal What it can hide
Logs and errors Explicit failures, rejected operations, contextual events Silent wrong outcomes, sampling loss, privacy-sensitive detail
Metrics and service levels Rates, latency tails, saturation, availability, cohort movement Individual severe failures and causal explanation
Distributed traces Cross-service timing and causal paths Uninstrumented work, business correctness, biased sampling
Synthetic monitoring Continuous declared journeys and external reachability Unmodeled users, data, and states
Real-user monitoring Instrumented journeys, interaction failures, and performance on actual devices Uninstrumented users, consent and sampling gaps, and the reason a person abandoned a task
Business invariants Duplicate charges, conversion, refunds, fulfillment, revenue and loss signals Whether movement is caused by the release without comparison design
Support and user feedback Unexpected harm, friction, and language the plan missed Incidence rates, silent users, selection bias
Security/privacy signals Anomalous access, exfiltration indicators, policy failures Absence of compromise or unobserved channels

The AI can summarize and correlate these streams dynamically, but every conclusion must link back to the underlying window, cohort, query, threshold, and artifact. An alert is not automatically a defect; lack of alerts is not proof of health.

From a real-user signal to a better test

Real-user monitoring observes instrumented interactions from actual product use. Synthetic monitoring runs journeys that the team creates. Both are useful, but they answer different questions. A fast synthetic checkout does not tell you that checkout works on the older phone a customer is holding.

Consider an illustrative TestBucks delivery-service release. The usual desktop regression and synthetic checkout pass. During a monitored rollout, privacy-safe browser events show a cluster of repeated taps on “Place order,” with no corresponding checkout request. Support receives a report that the button stopped working after an address correction. This is a lead, not yet a diagnosis. Repeated taps can also come from impatience, instrumentation defects, or a slow connection.

Evidence Observation in the example Question it raises
Real-user interaction events Repeated taps after address validation on a mobile slice Is the control blocked, or is the event stream misleading?
Server traces No checkout request for the correlated attempts Did failure occur before the request reached the service?
Support report The problem followed an address correction Does validation leave an overlay active?
Release diff A new address-validation layer changed its dismiss behavior Can this change explain the observed sequence?
Existing tests Valid addresses only; desktop viewport Did the suite omit the recovery path and affected layout?

Use pseudonymous correlation IDs, allowed event fields, build versions, and bounded time windows. Do not collect passwords, payment details, or a customer’s full session merely because more context might help. Missing telemetry stays missing; the agent should not fill the gaps with an imagined journey.

Prompt

Investigate these checkout interaction failures using the approved, redacted browser events, traces, support report, and release diff. Compare affected and unaffected journeys. Propose competing explanations, then reproduce the most plausible one in staging with synthetic data. Don’t interact with customers or change production. Show how the result should change our regression coverage and monitoring.

Illustrative AI response

Candidate explanation. The address-validation overlay may remain over the checkout button after correction. Missing server requests point toward a client-side problem, but they do not prove that cause.

Staging reproduction. In this example, entering an invalid address, correcting it, and closing the mobile keyboard leaves an invisible overlay intercepting taps. The same sequence with a valid address from the start does not fail. The browser capture and event-target inspection support the overlay explanation.

Coverage change. Add the address-error recovery journey on the affected viewport. Check pointer and keyboard operation, overlay dismissal, and exactly one resulting order. Keep the original failed sequence as evidence rather than replacing it with the happy path.

Monitoring change. Track checkout-intent interactions without a subsequent request or visible validation response, segmented by build and relevant device characteristics. Validate the event definition and an agreed time window before alerting on it. Also monitor successful order completion, so fewer alerts cannot hide broken instrumentation.

Release decision. Recommend holding further rollout while the responsible owner evaluates the defect. No production repair or rollback has been performed.

Those are illustrative results, not a claim about a live service. In a real run, attach the staging capture and trace before calling the reproduction confirmed. After an authorized fix, rerun the failing sequence and its neighboring cases. A bounded canary can then compare the affected slice with an appropriate baseline while checking that telemetry still works. A falling error signal supports improvement; it does not establish causation by itself when traffic mix or instrumentation also changed.

This crosses testing, support, analytics, observability, and release engineering. There is no prize for deciding which department owns the word “test.” The useful loop is customer signal, investigation, controlled reproduction, repair verification, and better observation of the next release. Chapter 8 explains the investigation discipline. Chapter 21 connects the evidence to a decision. Chapter 32 applies the same reality check to simulated journeys: compare what the simulation predicted with what customers actually encounter, then revise its assumptions.

Try it with CARBON: /carbon-generate use the sanitized incident timeline to propose regression tests; do not execute against production — Turn a production signal into test candidates with explicit evidence and safety boundaries.

The production-confidence loop

Figure 25.2. The production-confidence loop.

Escaped defects improve the system

For every credible production escape, preserve the affected cohort and timeline, first detectable signal, missed pre-release risk, oracle gap, environment/data difference, causal hypotheses and discriminating evidence, containment and rollback, repair verification, and durable regression. Ask whether the plan failed to imagine the risk, the executor failed to create it, the observer missed it, the judge misclassified it, or the report suppressed it.

Production testing must remain bounded: no casual destructive experiments against customers, no unrestricted log export to a model, no covert persona impersonation, and no automatic rollback outside declared authority. Recommend human, security, privacy, SRE, or domain review when interpretation or action exceeds the harness’s competence.

Measure whether the test system is becoming trustworthy

TestBucks example: A closed ticket is not a resolved problem

A customer says, “I ordered oat milk and received whole milk.” The support agent replies, “Happy to help! Your issue is resolved,” and closes the ticket. No replacement was arranged, no eligible refund was initiated, and the customer never confirmed a resolution.

A metric that rewards fast ticket closure calls this a success. A tester should call it an unresolved complaint with a misleading status. The AI did exactly what the bad metric encouraged.

Change the evaluation target from “ticket closed quickly” to “the customer’s eligible remedy was completed or accurately handed off.” Supply the order, policy, remedy record, and conversation. Let the evaluator return unresolved or awaiting action when the evidence requires it. Measure speed after checking that the right work happened.

Keep the original fast-closure example as a negative control for the testing system. If a new judge or rubric approves it again, the test harness has regressed even if its average scores look better.

The harness needs its own quality scorecard. A large number of completed runs is not evidence that the test system is useful. Measure whether it finds credible problems, wastes people’s time, adapts safely, and improves after feedback.

Measure What it asks Avoid the easy lie
Detection recall Of seeded, replayed, or later-confirmed defects within scope, how many did the system surface? Do not call a tiny synthetic seed set “coverage.” Preserve the defect population and scope.
Finding precision Of triaged findings, how many were confirmed relevant and actionable? A human dismissal is not automatically a false positive; preserve its reason and context.
False-positive debt How much review, reproduction, and trust cost is the system creating? Count time, severity, duplicate reports, and the audience burden—not just dismissed finding count.
Flake and repair rate How often does the same intent produce materially different outcomes, and how safely is the cause repaired? Do not hide instability by silently retrying until green. Preserve attempts and repair provenance.
Evidence completeness Did each conclusion retain the artifacts, authority, scope, and assumptions needed for review? A polished summary is not evidence. Missing artifacts are NOT MEASURED.
Human override and feedback When people correct a result, did the harness retain the reason and improve a later decision? Avoid training on popularity or one reviewer’s preference without scope and expiry.
Escape and near-miss rate What reached production that should have been detected, and what was detected too late? Normalize by exposure and risk; absence of reports is not absence of harm.

Separate measurement from self-congratulation. Establish the scope, sampling method, time window, reviewer population, confirmation standard, and uncertainty before making trend claims. Compare like-for-like runs where possible. A drop in findings may mean quality improved, coverage shrank, a model became less skeptical, telemetry failed, or people stopped reporting. The harness should present competing explanations and recommend the next discriminating evidence.

High-consequence quality needs a stronger proof standard

Privacy, security, accessibility, performance, reliability, financial correctness, and safety are not just more check labels. They carry asymmetric harm. An AI Check can inspect screenshots, DOM, accessibility trees, logs, traces, API definitions, network traffic, configuration, and source. An AI Test can exercise approved paths and controlled failure conditions. Neither automatically establishes compliance, security, fairness, safety, or readiness.

For each high-consequence claim, name the protected people or assets, threat or harm model, applicable policy or standard, evidence sources, untestable or unavailable dimensions, specialist review boundary, and escalation/rollback authority. Use deterministic controls and independent review alongside an AI judge. The right output is often “evidence is incomplete,” not a persuasive green score.

Multi-agent systems need adversarial observation

When agents call agents, a testing system must inspect identity, delegated authority, tool scope, data minimization, recursion and loop limits, rate limits, handoffs, prompt or instruction provenance, and the final side effect. Run cooperative scenarios, but also test refusal, malformed context, duplicate requests, adversarial instructions, and mismatched assumptions between participants.

The critical rule is independence: a builder agent and its friendly evaluator can agree on the wrong thing. Keep service-side invariants, cross-provider challenge where justified, deterministic policy checks, immutable audit evidence, and human intervention routes. Treat a multi-agent pass as an evidence bundle, never as an agreement between models.


Part V - Operate and Improve the System

Compare human and agent work, turn feedback into improvements, choose models, measure economics, and make AI-first testing work for the team.

Chapter 26 — Ten Minutes, Same App: What Humans and AI Actually Find

This chapter compares complete working approaches under a shared time limit. It does not rank model configurations—that is Chapter 29—or prescribe a permanent allocation of human work. Its output is a comparison of discoveries and evidence that Chapter 28 can use to improve the joint workflow.

Give an experienced tester ten minutes with a buggy application. Give an AI coding agent ten minutes with the same application. What do they notice?

That question sounds like the setup for a fight. I am more interested in what happens to the software. Which problems become visible? Which observations can someone else reproduce? Which questions make us realize we have not decided what the product is supposed to do? And what useful work can happen next?

Jason story

Jason Story — Ten minutes on the clock

I watched and participated in a workshop using a deliberately buggy task manager. People had ten minutes to test it. Their AI coding agents also had ten minutes. We did not hand every agent one sacred prompt. The testers told their agents what to test and how to report it.

That matters. We were watching people do manual testing, and people direct machines to do testing. That is a lot closer to the world we are entering than a clean little contest between one human and one model in a box.

The difference that stuck with me was where the attention went. People brought questions about the experience. The agents followed more of the technical consequences and documented more of what they found. Both were useful. But they were not doing the same job in the same way, even when the clock said ten minutes for both.

The actual overlap: 32 distinct findings

In my article “Human vs. AI Testing: Summary Findings,” I compared two human sessions and two AI sessions on the same deliberately buggy task manager. After removing duplicates, the combined reports contained 32 distinct findings. People contributed 20; AI contributed 16; four appeared in both sets.

Figure 26.1. Workshop results: 16 people-only findings, four shared, and 12 AI-only. Circle and overlap areas are proportional to the counts. Percentages are shares of the 32 combined findings.
Figure 26.2. The three exclusive groups total 32 findings: people only 16 (50%), shared four (12.5%), and AI only 12 (37.5%). Bar lengths start at zero and use one common scale.

The shared findings concerned the approval rule, the capacity rule, clipped titles, and a load-failure symptom. The load-failure match was at the symptom level; its cause remained unresolved. The repeated human capacity report was counted once.

The 16 people-only findings included 12 product and usability observations, two requirements questions, and two unresolved save-related reports. That distinction matters: this diagram counts reported concerns, not just confirmed implementation defects. It shows what these four sessions contributed, not every bug in the application.

What I find interesting is not just the size of either circle. It is how little they overlap. Different approaches exposed different questions worth investigating. The technical-defect comparison below looks at another dimension: which failures were actually supported by the evidence.

The experiment is the workflow, not just the model

The workshop account describes broader documented technical coverage from the AI submissions, alongside substantial product critique from the people. Every currently supported defect family described in the human reports also appeared in the combined AI findings. The AI collection extended into additional technical categories. Some human observations still needed reproduction or clarification.

Read that carefully. A defect family is not an individual defect. Two reports about persistence might concern different actions, different stored values, or different failure conditions. Finding something in the same family does not establish that the agent reproduced every specific human observation. Nor does the combined AI collection establish that any single agent found everything the people found.

The unit being compared is an instructed testing workflow. It includes a person choosing a prompt, the agent interpreting it, the available tools, the application state, the exploration path, and the reporting instructions. Remove any one of those and you may get different results. Calling the whole thing “the model” hides most of the interesting engineering.

Where the attention went

The useful comparison starts with categories and evidence, not a trophy. The following matrix summarizes the workshop account; it is not a count of individual bugs or an exhaustive coverage inventory.

Area Human reports Combined AI reports
Visible workflow and layout Reported problems and questions Overlapping defect families
Product polish and interaction Prominent critique Not described as the strongest contribution
Missing guidance and expected capabilities Useful questions and suggestions Coverage depended on the instructed workflow
Save and load behavior Save concerns and load-failure symptoms Persistence-related findings; exact overlap required reconciliation
Data integrity and recovery Not established broadly by the account Additional documented technical coverage
Privacy, security, and accessibility Not established broadly by the account Additional documented technical coverage
Reproduction and supporting artifacts Uneven documentation under the time limit More structured evidence and reusable checks

“Not established” is not a polite synonym for “the person cannot do it.” It means this account does not establish that coverage. That distinction keeps a useful comparison from turning into a cartoon.

The agents were particularly useful at following actions into less-visible consequences. What happens after reload? What survives another operation? Did the screen change while the underlying state did something else? The humans asked more questions about clarity, presentation, missing capabilities, and whether the allowed behavior made sense. Those questions can expose a product problem even when every implemented assertion passes.

A finding is more than noticing something

An observation starts an investigation. A reproducible finding lets another person or agent continue it without reconstructing the whole session.

Imagine a TestBucks cart item disappearing after reload. “Save seems broken” is a useful signal, but it leaves open several explanations. Was the item ever added? Was there an error? Was the session intentionally temporary? Did another filter hide it? Was storage unavailable? Did the tester reload the same application version?

The following is an illustrative TestBucks example, not a recovered workshop transcript.

Observation What it contributes What remains to establish
“My cart item disappeared when I reloaded.” A concrete symptom worth investigating Starting state, exact sequence, version, and intended persistence
Cart item appears after Add, then is absent after reload A narrower behavioral description Whether this is permitted behavior or a defect
No durable write is recorded before reload A possible mechanism, if instrumentation supports it Whether the product promises durable storage and which layer is responsible
Same sequence reproduced with a fresh session Stronger execution evidence Scope across other states, environments, and users

Notice how much more useful the third row is than “AI found a bug.” Also notice that a missing write alone does not tell us the requirement. Source awareness and product context still have work to do.

Prompt

Investigate the report “My cart item disappeared after reload.” Reproduce it in a disposable session. Record the actions, visible results, and relevant storage or network evidence. Find out what the product promises about saving. Separate the observed failure from your explanation of its cause. Do not fix it yet.

Illustrative AI response

The cart item was visible after Add and absent after reload in this example run. That establishes a persistence symptom, not its intended behavior. Next: check the save promise and correlate the action with storage evidence. If cart items are meant to survive reload, this is a defect candidate. If the session is intentionally temporary, investigate whether that is made clear. No fix applied.

The agent in the workshop had been asked to produce reproducible issues and evidence. Its documentation advantage is partly a success of those instructions. We should copy that success into the Harness, not pretend the instructions did not matter.

Recording should not depend on finding a bug. A quiet run also needs a trace of what was exercised. Otherwise a report with no findings could mean a healthy path, a blocked agent, or an agent that barely explored anything.

Ten minutes is the same clock, not the same resources

Equal wall-clock time answers a practical question: what useful output can these workflows produce before this deadline? It does not equalize parallel workers, source access, tools, prior familiarity, setup effort, or cost. A person typing a report is not simultaneously driving five browsers. An agent with code access is not doing the same black-box exercise as a person with only a screen.

That is not a reason to reject the comparison. The resources are part of why the workflow is interesting. It is a reason to record them.

For a repeatable exercise, retain the application version, reset procedure, seeded-defect inventory where one exists, participant experience, prompt text, model and tools, access boundaries, elapsed time, run failures, and time spent preparing and reviewing the results. Count setup separately from the timed discovery window. Record whether the clock includes report writing. Do not silently give one side a head start while insisting the contest is equal.

Run a common-instructions round when you want to compare configurations. Run a freely steered round when you want to understand how people actually use them. Both questions are worth asking. Mixing the rounds makes the answer harder to interpret.

Reconcile observations before counting them

First preserve the original submissions. Then create a normalized comparison record that links back to those originals. Keep the reported symptom, affected workflow, reproduction status, artifact references, proposed consequence, and unresolved questions. A reviewer may classify an observation as a confirmed defect, a product suggestion, a requirement question, a duplicate, or unsupported. Do not erase it just because it moved out of the defect bucket.

Next group semantically related observations. Similar wording is not proof of duplication. Different wording is not proof of independence. The same symptom may have two causes; one shared cause may appear in several workflows. Chapter 2 covers the deduplication mechanics, and Chapter 8 covers triage. Here the additional responsibility is preserving attribution without making attribution the verdict.

Where practical, hide whether the report came from a person or an agent during initial classification. Ask reviewers to state the evidence for their decisions. Preserve disagreements and resolve them with a smaller experiment or a product decision. Do not let the loudest reviewer become the benchmark.

People vary. Machines vary too.

The human submissions varied in length, focus, and detail. A short report could contain a consequential failure. A long one could contain valuable product critique, repeated symptoms, and suggestions that were not defects. Report length is a terrible substitute for value.

The AI submissions varied too. In the account, the smaller AI report’s reproduced findings were contained in the larger report, while the larger report covered substantially more ground. Severity judgments also differed. Different prompts were used, so the comparison cannot isolate prompting from exploration choices or other run differences.

This is exactly why a good Harness is valuable. It can require useful evidence, cover neglected risk families, preserve the prompt, and run another exploration with a different charter. It can reduce avoidable variation without assuming that every fresh discovery session should return the same list.

Definition

Repeatable execution and repeatable discovery are different claims. Repeatable execution means a known test produces consistent observations under stated conditions. Repeatable discovery means fresh investigations independently find the same problems. Rerunning a saved check twice can support the first claim. It does not establish the second.

Selected automated checks in the workshop produced the same outcomes across two executions. That is useful. It does not establish how reliably an agent would rediscover those failures from a fresh start. The same question applies to the humans. We rarely ask a tester to come back tomorrow, forget yesterday’s bugs, and show us the stability of their discovery process. We should stop assuming a stability we have never measured.

Run the exercise on TestBucks or your own product

Pause and practice

Test yourself against AI. Give yourself and AI ten minutes, then compare findings, overlap, and differences. Judge the evidence, not just the bug counts.

Try this exercise.

Use a resettable application or a safe test environment. Let participants explore independently and submit their observations before seeing the other results. Preserve their prompts and reports. Then reconcile findings and conduct a joint review. That sequence lets you distinguish independent discovery from the value of showing someone what another tester already noticed.

Repeat with new sessions and, when useful, varied people or agent configurations. Watch for learning: a participant who already knows a seeded bug is no longer independently discovering it. Rotate comparable scenarios or explicitly label the later round as verification.

Measure useful reproduced findings, product questions resolved, additional risks exposed, documentation completeness, review time, and decisions changed. If there is no credible inventory of all defects, report coverage of the known seed set rather than claiming recall of every real bug. Track severe individual misses even when the average looks good.

Try it with CARBON: /carbon-test explore TestBucks for ten minutes; preserve discoveries separately from the human findings — Run a bounded comparison without contaminating the independent first passes.

What I take from the workshop

These are early directional findings from a small body of expensive-to-run sessions. The account supports a practical conclusion: AI-directed testing produced broader reproduced technical coverage, while humans supplied substantial product critique. It does not give us a permanent border between human and machine ability.

The next useful question is not “Who won?” It is “What should the next testing session ask for?” If an agent was never asked to question the product’s assumptions, ask it. If the people had no time to record their discoveries, use the agent to help preserve the evidence. If both missed something important, improve the workflow rather than the argument.

The clock is useful because it forces the discussion out of theory. Ten minutes is enough to see a different way of working. It is not enough to declare the product finished.

Chapter 27 — Works as Written. Still Feels Wrong.

Chapter 26 compared discoveries. This chapter isolates a different contribution: questioning whether correct behavior is useful behavior. Chapter 28 turns those product judgments into actionable feedback.

The button works. The value saves. The test passes. And the experience is still annoying.

That is not a small leftover category of software quality. It is often the part that determines whether anyone wants to use the thing. A product can obey its implementation perfectly while asking the user to do something confusing, tedious, or unreasonable. Testing the code’s obedience is not the same as testing the product’s usefulness.

In the workshop, people questioned the interactions, visual choices, missing guidance, and allowed behavior. I do not want to lose those observations because a bug-count spreadsheet has nowhere to put them. I also do not want to inflate a preference into a confirmed failure just because a person said it confidently.

Correct behavior can still be a bad experience

“It looks AI-generated” is a reaction, not yet an explanation. The useful next step is asking what caused the reaction. Is the interface inconsistent? Is every action equally prominent? Does the product celebrate success before anything durable happened? Are familiar controls arranged in unfamiliar ways without helping the user?

Those are investigable questions. Screenshots can support observations about layout and hierarchy. Interaction traces can show repeated backtracking. A task completed with a wrong mental model can expose ambiguity even if the user eventually succeeds. The evidence does not need to be a stack trace to matter.

Subjective does not mean arbitrary. A judgment can name its context, describe an observable feature, explain a plausible consequence, and propose a comparison. It becomes weaker when it claims to represent every customer without meeting any of them.

Missing behavior is harder to see than broken behavior

An implemented button gives you something to click. A missing recovery path gives you nothing. The application does not announce, “Here is the feature we forgot.” Somebody has to recognize the promise that is not being kept.

For TestBucks, possible questions include whether deletion is recoverable, whether unsaved work is visible, whether an empty state explains how to start, and whether a failed load offers a useful next action. These are examples to investigate, not findings from the workshop. The appropriate answer depends on the product. A guest cart does not need every capability of a multi-store ordering service.

The AI can help enumerate expected behavior from the product category, source, requirements, and comparable workflows. But category familiarity is a hypothesis generator, not a feature mandate. Ask the agent which missing capability matters to the stated user goal, what evidence supports the expectation, and whether a simpler explanation or interaction would solve the problem.

Who decided that was the requirement?

Suppose the TestBucks shop accepts a pickup order with no customer name. The code may faithfully allow that. A tester might call it a validation bug. Another might consider it a useful quick-capture feature. Neither position becomes correct because its author has “quality” in their job title.

Find the authority. A documented promise might resolve the question. A customer workflow might explain why anonymous pickup exists. There may be no decision at all. In that case, the finding is partly about a missing product decision, not merely a faulty conditional.

Chapter 13 showed how source awareness exposes an implemented boundary without proving that the boundary is right. The same logic applies to the whole experience. Code explains what happens. It does not, by itself, explain why that is a good thing to ask of a person.

Keep different kinds of findings useful

Kind of observation Example Useful next action
Implementation defect Saved cart disappears despite a persistence promise Reproduce, isolate, repair, and retest
Requirement question Should carts survive reload in this product? Obtain or establish the product decision
Product suggestion Offer undo after removing a drink Evaluate consequence, demand, and tradeoff
Experience hypothesis The success message may imply durable saving Observe interpretation and compare wording
Personal preference I prefer a different accent color Retain as preference; seek broader context if consequential

These examples are illustrative. They show why a single “bug or not” switch throws away information. A suggestion might be worth more than a minor confirmed defect. A severe-sounding report might disappear when the intended workflow becomes clear. Classification and priority answer different questions.

Keep the original observation linked to the resulting decision. If “save is broken” becomes “temporary storage is poorly explained,” the first report was not useless. It helped expose the mismatch. Do not make the reviewer feel that every change of category is a defeat.

Ask AI to critique the product, not just execute it

A prompt to verify Customize, Add to cart, Order, and Cancel naturally draws attention to those actions. If you also want critique, ask for critique. The machine cannot read an instruction you did not give it, although a stronger Harness can supply a broader testing curriculum by default.

Prompt

Use this TestBucks shop as someone who needs to order coffee quickly and trust that it will still be there later. Test the main flows, then question the experience: what is confusing, missing, or misleading? Separate reproduced defects from product questions and preferences. For each concern, suggest the smallest useful follow-up.

Illustrative AI response

Concern: “Added” may be interpreted as “saved for later.” Type: experience hypothesis, pending the persistence requirement. Evidence needed: actual save behavior, displayed wording, and the intended promise. Next step: compare what survives reload with what the interface tells the user. If storage is temporary, make that boundary visible before a cart is lost. If durable saving is promised, investigate the implementation instead.

That response is a possible investigation plan, not a result. To obtain a result, execute it against the application and attach what happened. This is where AI Checks and AI Tests work together: inspect the message, exercise persistence, correlate artifacts, and challenge the interpretation.

For a non-interactive AI Check, supply captured screenshots and context without asking the agent to operate the product. For an interactive AI Test, give it a bounded environment and an explicit user goal. Avoid claiming that an image inspection established behavior across a reload.

Try it with CARBON: /carbon-personas review this TestBucks shop for a first-time user and a busy returning user — Gather qualitative reactions and disagreements to turn into testable product questions.

Turn a reaction into an experiment

Take the illustrative reaction, “I would not trust this app with my tasks.” Start by asking what would change that person’s mind. An explicit saving indicator? A visible recovery option? Proof that work survives reload? A clear explanation that the product is only a guest cart?

Then separate the investigation into three questions. What does the system do? What does it communicate? What does the intended user need? Each question requires different evidence. A browser run can establish an observed persistence failure. It cannot, alone, establish how common a misunderstanding is across a customer population.

Compare alternatives rather than asking whether a design is “good.” Show the existing message and a clearer alternative with the same underlying behavior. Ask the reviewer to explain what each version promises. Where the stakes justify it, involve representative users. Where they do not, keep the result as a focused expert judgment and avoid dressing it up as population research.

The outcome could be a code repair, a copy change, a new requirement, or no change because the concern does not apply. A good investigation permits all four outcomes. Otherwise we are not testing the hypothesis; we are collecting applause for it.

People vary. Agents vary.

One person notices interaction friction. Another follows data through reload. A third asks what happens when two people edit the same task. Their experience matters, but so does what caught their attention that day. An agent also follows an imperfect path through the available possibilities. Its prompt and context shape what seems worth investigating.

Use several perspectives when the additional information earns the cost. That could mean another human specialist, a persona-guided AI pass, a different model, or the same agent given a skeptical charter. Preserve which input produced which concern. If every reviewer sees the first report before exploring, apparent agreement may just be shared attention.

This is not an argument that humans own taste forever. It is an argument for asking both people and agents better questions, measuring what they contribute, and changing the work allocation as their capabilities change.

Human perspective

HUMAN FRICTION — MY JUDGMENT IS NOT THE GROUND TRUTH

Being experienced does not make every opinion correct

I want the experience. I do not want the assumption that the person supplying it is the answer key. People disagree with each other, change their minds, and bring context that may not apply to this product. Agents do those things too.

Disagreement is a lead

If a person calls something confusing and the AI calls it clear, do not immediately choose a winner. Ask what each side observed, whose goal each assumed, and what small experiment could separate the explanations.

Take credit for improving the work

A tester who gets the AI to investigate a concern has added value even if the first interpretation was wrong. The useful outcome is a better product decision, not a preserved opinion.

Product critique belongs in the evidence ledger

Keep critiques visible alongside technical results, but do not collapse them into the same metric. Ten suggestions are not ten reproduced defects. Ten passing functional tests do not establish that the product is understandable. A confidence report should say which promises were exercised, which experience concerns remain, and what judgments are still conditional.

The team can decide that one unresolved experience concern is acceptable for a small release. It can also decide that a technically correct interaction is too misleading to ship. The point is to make that reasoning inspectable, not to manufacture a universal taste score.

The workshop makes this opportunity concrete. People raised useful product questions. Agents produced useful technical investigations. Now connect the two. Let the machine do the evidence work around the human observation, and let people challenge what the machine treated as obvious. That is much more interesting than asking either side to stay in its lane.

Chapter 28 — Human in the AI Loop: From Feedback to Better Software

This chapter owns the mechanics of human contribution: who to ask, what to send, how to record the answer, and how to verify that it changed the product or the next run. Chapters 26 and 27 supply the comparison and critique; this chapter closes the operational loop.

The workshop comparison is useful only if it changes how we work. We have agents that can investigate broadly and preserve evidence. We have people who may notice a missing promise, challenge an interaction, or bring context the agent never received. Put those capabilities into one workflow and measure whether the product gets better.

Broad AI coverage, independent human exploration, then joint review

There are two useful starting patterns. In an AI-first review, the Harness runs a broad pass, reproduces the important findings, and gives people a prepared packet. That saves reviewers from repeating obvious work and lets them spend time on unresolved questions. In an independent-discovery round, people explore before seeing the AI results. That protects a different kind of value: discovering something the first report did not direct them toward.

Neither ordering is universally best. If a release is blocked by one disputed failure, send the evidence immediately. If you are evaluating what different testers notice, keep the first discoveries separate. If the goal is product critique, give people room to use the product before asking them to judge a list of machine-generated issues.

The AI pass and independent human pass can happen in parallel. Their results meet at joint review. This matters because an AI-first execution schedule does not require an AI-first disclosure schedule. The Harness can finish its checks while holding the findings back from reviewers who are still exploring independently.

Figure 28.1. Human expertise in the AI testing loop: independent discovery joins shared review, repair, retesting, and memory.

At joint review, show the original observations and the normalized issue candidates. Let people accept, reject, question, reproduce, and extend the findings. Give them a place to add something the AI did not ask about. A row of thumbs-up buttons is not a testing workspace if the person cannot report a different problem.

Keep a lightweight ledger of what the combined pass added. Which issue was independently found? Which was noticed only after another report directed attention to it? Which question changed the product requirement? Which apparent failure was explained by a test-environment problem? These are different contributions, and all can be valuable.

Ask for the contribution, not the ritual

“Human in the loop” is usually where architecture diagrams go to die. Somebody draws a person in the middle, feels responsible, and leaves the actual mechanics undefined. Which person? Why that person? What do they see? What are they being asked to decide? How does the answer get back into the work? What happens next? At AI speed, “have a human review it” is not a design. It is a bottleneck wearing a friendly label.

Earlier chapters treated human context as evidence and as a qualifier on AI Confidence. This section closes the mechanical loop: deciding when to ask, routing the right context to the right person, and returning the answer to the agents that can use it.

The better pattern is Human in the AI Loop. The AI Test Harness keeps working at machine speed and decides when a human perspective could materially change the result. A developer can ask for feedback manually, but that should not be the only trigger. The Harness can watch the code, diff, recent churn, generated interfaces, test failures, evidence gaps, disputed triage, confidence analysis, and the consequences of being wrong. It asks a simple counterfactual question: Could a useful answer from the right person change the oracle, risk, priority, next test, fix, confidence judgment, or release action? If not, it keeps going. If yes, it engineers the smallest useful interruption.

Figure 28.2. Human input in the AI testing loop.
Decide what kind of human input could change the work

The Harness should classify the missing judgment before it chooses a reviewer. “Get human feedback” is too vague. Useful categories include:

  • Intent and customer value. Did we build the right thing, and what outcome actually matters?
  • Priority and business tradeoff. Which problem matters now, and what is worth delaying or risking?
  • Experience, taste, and trust. Does this feel credible, understandable, respectful, and appropriate for the real workflow?
  • Domain knowledge. What invariant, exception, terminology, or consequence would be obvious to an expert but invisible in the code?
  • Technical context. Is an implementation assumption, operational constraint, dependency behavior, or recovery path missing?
  • Test adequacy and triage. Is the finding real, is the evidence representative, and what additional coverage would change the conclusion?
  • Risk tolerance and authority. Which outcome is unacceptable, who absorbs the damage, and what decision is this person allowed to make?
  • Novel discovery. What did the machine fail to ask because it did not know the question existed?

That classification makes routing intelligent instead of organizationally convenient.

Needed judgment Likely useful reviewer What the answer can change
Product intent, user promise, milestone priority Product manager, product leader, customer owner Oracle, scope, priority, acceptance criteria
Implementation behavior, architecture, operability Developer, architect, SRE, service owner Root-cause hypothesis, safe fix, recovery and observability coverage
Reproduction, coverage, evidence, false-positive risk Tester, QA lead, quality specialist Triage, missing AI Tests, evidence requirements, regression promotion
Usability, accessibility, language, trust, visual judgment Designer, researcher, accessibility specialist, representative user Experience findings, persona coverage, interface changes
Safety, policy, regulation, specialized real-world consequences Security, privacy, legal, medical, financial, or other domain expert Forbidden outcomes, safety boundaries, escalation, release constraints
Customer reality and recurring pain Support, sales, operations, customer, end user Risk ranking, scenarios, production checks, product direction

The “likely” matters. The Harness can route to several valid people, request independent opinions when disagreement is valuable, or escalate when the first reviewer says, correctly, “I am not the right person.” The best recipient is not always the nearest person on the org chart.

Send a decision, not a transcript

A remote feedback service should queue and route a compact review packet. It can contain almost any deliberately selected artifact: a URL, screenshot, image, video clip, audio sample, code snippet, diff, API response, data sample, log excerpt, network trace, test result, issue candidate, generated report, prototype, or document. The trick is not sending everything. The AI should select the smallest context that lets this reviewer make the requested judgment without forcing them to perform context archaeology through a repository or agent transcript.

Every request should explain:

  • The question. What precise judgment or missing information is needed?
  • Why this person. Which role, experience, authority, or perspective makes the recipient useful?
  • The artifact and scope. What should be reviewed, which version produced it, and what is explicitly outside the request?
  • The evidence already gathered. What did the AI Check, AI Test, source analysis, or prior reviewer establish?
  • The uncertainty. What does the machine not know, and why could the answer change the work?
  • The decision path. Will the response affect a fix, more testing, triage, priority, AI Confidence, or release action?
  • The handling boundary. Who can see the material, how long it remains valid, and whether it contains private or sensitive information?
  • The urgency. Can the request wait in a queue, or is it important enough to interrupt someone now?

That is how human-speed judgment fits inside an AI-speed workflow. The machine does the preparation. The person receives one bounded decision rather than fifty pages of machine activity.

Let people answer in the medium that fits the judgment

The response does not have to be a form field. It may be text, a quick structured choice, a star rating, a voice note, a screen recording, a bug report, a photo, or scribbles and arrows directly on an image. A product manager may correct the business intent in one sentence. A tester may return a reproducible issue with evidence. A designer may circle the part of a dialog that feels untrustworthy. A support lead may attach a real customer pattern. A developer may explain an environmental constraint that never appeared in source. A user may simply say, “I would never click that,” which is qualitative evidence the Harness can turn into a hypothesis and an AI Test.

The interface should make common answers fast without limiting the person to choices the AI already imagined. Ratings, approve/reject controls, and categories are useful, but there must always be room to correct the question, add a missing issue, disagree with the premise, or route the request to somebody else.

Bring the feedback back to the agents that can act on it

The loop is not closed when a person clicks Send. The response has to return to the originating AI Test Harness and AI coding agent with its request, artifact version, reviewer role, timestamp, scope, and provenance intact. The agent then reviews the feedback as input—not as executable instructions and not as automatic truth. Human feedback can be wrong, stale, contradictory, biased, malicious, or aimed at a version that no longer exists. The Harness should compare it with the current code and evidence, identify conflicts, and ask a compact follow-up only when the ambiguity matters.

Once qualified, the feedback can do real work:

  • Change the implementation or produce a fix-ready issue for the coding agent;
  • Generate or select additional AI Checks and AI Tests around the newly exposed risk;
  • Correct an oracle, requirement, persona, priority, or triage rule;
  • Raise or lower AI Confidence with an explicit explanation of what the human evidence changed;
  • Block, narrow, canary, or redirect a release action when the response carries that authority;
  • Be remembered as durable project context so the same person does not have to explain the same thing on every run;
  • Improve future routing and prompts by learning which questions, artifacts, and reviewers actually changed decisions;
  • Trigger re-testing and re-review so the machine verifies that the applied response produced the intended outcome.

The memory should be scoped. A product manager’s decision for one milestone is not eternal product law. A tester’s rejection of one false positive is not permission to suppress every similar finding. Record who said what, for which artifact and version, under which conditions, and what the system did because of it. Keep observed product evidence, explicit human feedback, and the AI’s inferred implications separate.

For now, there are moments where a person has context, experience, authority, or taste that materially improves the work. That will keep changing as agents improve and receive more delegated authority. The architecture should not assume a human must approve everything forever. It should let the machine determine when human input has positive expected value, obtain it efficiently, learn from it, and stop asking when it no longer helps.

Do not put a human inside every loop. Put the loop around the moments where the right human can still change the answer.

Try it with CARBON: /carbon-feedback prepare a local review of the order-saving flow with screenshots and the persistence question; do not send invitations yet — Package a bounded review and bring the resulting feedback back into the testing work.

Worked example: A save complaint becomes a better promise

This illustrative continuation applies the independent-review method from Chapter 26 to TestBucks. It follows the saved-cart concern from Chapter 27, not the historical workshop application.

The AI discovers that a newly added cold brew is visible before reload and absent afterward. A human independently reports, “The app tells me it added the order, so I expect it to be there when I come back.” Another reviewer says a temporary cart might be intentional. We now have an observed-behavior question and a product-promise question. Treating both as one bug would hide the disagreement.

The Harness packages the application version, action sequence, before-and-after screenshots, relevant storage evidence, and the exact disputed message. It routes one compact question to the product owner: should cart items survive a normal reload? It asks the technical owner a different question: is this build using the intended persistence configuration? That second question prevents the team from repairing the product to compensate for a broken test setup.

Prompt

Review this cart-loss finding and the attached feedback. Determine whether the disagreement is about observed behavior, intended behavior, or the environment. Ask only for missing decisions that could change the fix. Then propose a repair and focused regression plan. Wait for approval before changing code.

Illustrative AI response

The disagreement concerns intended persistence, not whether the order vanished. Product decision needed: must cart items survive an ordinary reload? Environment check needed: is this the supported persistence configuration? If both are confirmed, repair durable saving and verify reload behavior. Also test failed writes: the UI must not claim success when saving fails. I have not changed the code.

Suppose the product owner confirms durable saving and the developer confirms the environment. Those answers do not prove the root cause. They establish the context in which the agent should investigate it. The coding agent can now inspect the write path, identify a specific failure, and propose the smallest repair supported by the evidence.

After approval, the agent applies that repair in a disposable branch or approved workspace. It reruns the original reproduction, checks existing cart items, adds another drink, reloads, and tests a failed-write condition. Where relevant, it also checks duplicate submission and whether separate users or sessions remain isolated. The risk and implementation determine that regression set; a fixed list is only a starting point.

The human reviewer then evaluates the message in its repaired context. If the interaction still implies more than the system guarantees, that becomes a separate experience issue. A technical pass does not automatically close the product critique.

Illustrative AI response

Decision: durable saving is required for this workflow. Repair status: applied in the example branch after approval. Verification: original reload scenario and failed-write behavior now pass in this example. Remaining gap: cross-device synchronization was not part of this run. Feedback retained: “Added” must not imply a successful save before confirmation. Confidence change: the local persistence concern is reduced; no claim of full release readiness.

Verify that the feedback changed the right thing

There are several ways for this loop to fail while looking productive. The agent can fix the wrong version. It can treat a suggestion as an instruction to rewrite the product. It can hide the original issue because the reviewer clicked Reject without explaining why. It can satisfy one person’s preference while breaking an established requirement.

Before closing a feedback item, compare the requested outcome, the actual change, and the new runtime evidence. If the feedback changed a requirement, update the associated test intent rather than leaving contradictory checks active. If it changed only priority, do not mark the bug fixed. If it changed a triage judgment, retain the earlier judgment and the reason for the change.

Preserve an explicit outcome: implemented and verified, accepted for later, declined with reason, needs more evidence, or obsolete because the product changed. Silence is not a useful state. The person who supplied the feedback should be able to see what happened to it without reading the entire coding transcript.

Measure the value of the combination

The combined workflow costs something. Review consumes time, routing introduces latency, and redundant exploration can add little. Measure whether those costs buy a better answer.

Measure What to retain What not to infer
Incremental discovery Useful findings added by each stage That the last stage deserves all attribution
Decision value Requirements, priorities, or release actions changed That every comment improved the product
Evidence quality Reproduction, artifact completeness, unresolved contradictions That a long report is a strong report
Review burden Preparation, waiting, clarification, and adjudication time That model runtime is the total cost
Repair outcome Original reproduction plus relevant regression evidence That approval establishes correctness
Learning Reusable context and whether later runs use it correctly That one team’s preference is a universal rule

Compare the combined workflow with its component passes on comparable tasks. Preserve independent first-pass results before introducing shared feedback. Otherwise you cannot distinguish a genuinely new perspective from someone repeating a finding they have already seen. Keep severe individual misses visible; an impressive total does not compensate for losing customer data.

When human review repeatedly adds no decision-changing information to a low-risk category, reduce its frequency or sample it. When a category keeps producing useful corrections, investigate why the Harness misses that context and improve it. The objective is not to protect a fixed allocation of work. It is to make the whole testing system more capable.

Feedback turns a report into a learning system

Every individually addressable result—bug, persona reaction, accessibility finding, flow, exploratory step, advisory, summary, or page—should accept:

  • Useful / good catch;
  • Not useful / wrong;
  • Irrelevant for this product or release;
  • An optional comment explaining why;
  • An optional corrected category, severity, or expected behavior.

The comment matters because a thumbs-down alone cannot distinguish “false positive,” “already accepted,” “duplicate,” “wrong priority,” “unsupported by evidence,” or “not relevant to this release.” Save feedback as append-only events linked to host, project, run, item, prompt/context version, author, and timestamp. Support deletion and privacy boundaries without rewriting old reports silently.

A feedback capability should make this a scoped, private workflow rather than a public review request. It can create a request around a URL, image, document, API, code surface, or other artifact, then open a protected workspace for a rating, response, category, and contextual note. The request must say what decision the feedback informs, who is meant to respond, and what would make the response useful. Feedback is qualitative context: it can change test priorities, customer-value oracles, persona charters, and release interpretation. It never converts unobserved behavior into a pass.

External feedback needs an even harder boundary. Do not silently send a private preview, screenshot, document, prompt, or customer data to a public service. The default remains project-local. An invited external reviewer should be contacted only through explicitly configured private infrastructure, with the exact artifact, recipient, retention boundary, and delivery state visible before dispatch. An invitation is not completed feedback; only an actual response may change the next plan.

The next run can use aggregate feedback as a transparent prior: de-prioritize repeatedly rejected bug classes, surface praised flow templates earlier, refine persona generation, and propose updated custom steering. Never let accumulated feedback hide a severe new failure or turn preference into fact. Show the learned rule, preserve the response that caused it, and let the team reset or override it.

The learning loop should outlive the meeting

Store the accepted product decision with its scope, source, and expiration conditions. Link it to the test intent and repair evidence. On the next run, the Harness should know that durable saving matters here, recognize when the implementation changes, and retest the relevant promise. It should not need the same person to explain the same thing again.

It should also know when to ask again. A temporary-demo mode, a new privacy policy, or a changed storage architecture can invalidate an old answer. Memory is not a pile of permanent instructions. It is context that can be examined, challenged, and retired.

This is the practical conclusion I want from the ten-minute workshop. Keep the technical breadth. Keep the useful product questions. Use machines to investigate, document, route, repair, and remember. Bring people in where their contribution can still change the answer. Then test whether that arrangement is actually helping.

Chapter 29 — Bug-Finder Leaderboards and Choosing the Right Model

This chapter selects a model and configuration for a named testing job. Use the judge design from Chapter 15 and the Harness measurements from Chapter 25; compare candidates on the same task and error costs rather than reopening the general human-versus-AI debate.

Jason story

JASON STORY — A HUNDRED BUGS, FIVE FALSE POSITIVES

I have spent a lot of time comparing general-purpose models with fine-tuned and custom models, and messing with hyperparameters to see what makes them better at testing. The differences are not small. Finding bugs, generating tests, triaging issues, and giving qualitative feedback are different jobs. A model or configuration that is good at one is not automatically the best choice for another.

Yet people keep using these systems as if they were interchangeable boxes. Pick a famous model, leave the settings alone, and ask it to test. My sense is that people can leave twenty or twenty-five percent of the potential value on the table by not configuring or adapting the system to the work. That is my estimate, but the missed opportunity is real enough to make me keep experimenting.

The problem I kept coming back to was false positives. Not just because they were wrong, but because a human had to deal with them. Human time is far more expensive than token time. And the cost is not only the minutes spent checking the report. It is frustration. It is the loss of confidence in the AI.

I remember the early excitement of finding bugs on a website. Say the AI came back with a hundred findings and five were false positives. I would be thinking, “Wow, look at all these bugs it found.” Then I would hand the results to testers.

“But these five are wrong.”

Yes. And what about all the real problems? Some had been sitting there for a long time. They had escaped the existing testing process. The AI had found them, but the conversation kept coming back to the five failures.

Yes, fix the five false positives. They waste people’s time and make them trust the next report less. But don’t ignore all the real bugs sitting right there. What were they costing us? How long had we missed them? That is part of the result too.

Jason story

JASON STORY — A HUNDRED BUGS, FIVE FALSE POSITIVES (CONTINUED)

A missed bug is different. It doesn’t show up in somebody’s inbox asking to be investigated. Nobody complains about it until it causes trouble. It can be much more dangerous, but the false positive is the one annoying somebody right now. That is the feedback you hear.

That experience made me care a lot more about false positives. It was not a leaderboard problem. I wanted people to use the findings. Could I cut the noise without teaching the system to overlook real defects? I started trying different models and prompts, then skeptical second passes, fine-tuning, and sampling settings to see what actually helped.

This is still an underused opportunity. Even with a general frontier model, try the controls it exposes for the testing task you actually have. Compare the findings, the misses, and the human cleanup. Do not assume the default configuration is the best tester you can get.

The biggest model is not automatically the best tester. In fact, it often overthinks rote work, invents ambiguity, and costs more while doing it. Pick models the way a serious test team picks tools: by the job, the error cost, and what they actually catch.

From Ask to System

Prompt

Which model is best for this testing work?

  • The Test Brief: “Compare models on the error costs that matter here: precision, recall, false positives, false negatives, groundedness, latency, cost, and stability. Explain the benchmark cohort and uncertainty. Recommend efficient models for rote work and stronger reasoning models only where they change the result.”
  • The Harness: Decompose work; route tasks to measured model configurations; select metrics from business cost; calibrate judges; retain benchmark evidence; record settings and spend; escalate on ambiguity or severity; detect drift; and require project-specific evidence before changing defaults.

The leaderboard that changes how you choose a model

Chapter 26 distinguishes repeatable execution from repeatable discovery. Keep that distinction in every model comparison. Replaying a known check measures a different capability from finding a bug in a fresh session. Preserve prompts, tools, access, application versions, and repeated fresh-run results when comparing discovery. Do not treat one rich report as the fixed output of a model, or two successful replays as proof that it will rediscover the same failures.

The reference leaderboard makes model choice concrete:

  • 16 model/configuration rows;
  • Three held-out AI-generated pages—a search page, news article, and social feed;
  • Roughly 20 seeded defects per page;
  • The same HTML, console, network transcript, and screenshot bundle for each model;
  • No live browser or model-specific harness advantages in that benchmark;
  • An LLM judge matching findings to seeded ground truth, plus a second pass for real-but-unseeded findings versus hallucinations;
  • Low-variability sampling settings near temperature 0.1 and top-p 0.9 where supported; these settings do not guarantee deterministic output;
  • Scores averaged across the three pages.

Teach the six views, not just the winner

Metric Question Appropriate use Main trap
Overall How balanced is the configuration across five metrics? Starting comparison Arbitrary equal weights may not match your costs
F0.5 How well does it balance findings while penalizing false positives more? Engineering triage Can underweight costly misses
Discovery F0.5 Does it find rare bugs others miss? Second opinions and eval-gap discovery Rarity in a small cohort is unstable
Precision Of flagged bugs, how many are real? High-trust reports and automated handoff Can score well while missing most bugs
Recall Of known real bugs, how many were caught? Security/accessibility sweeps Can be gamed by flagging everything
Groundedness How much output points to something real rather than fabricated? Auto-fix pipelines May suppress useful discovery

Let the exploration vary, not the obligations

Non-determinism can be an advantage. Two testing agents given the same intent may take different paths, use different data, or notice different risks. One retries checkout. Another changes the delivery address halfway through. A third asks what happens when a discount expires while the cart is open. For exploration, those differences can be the point.

But the freedom to choose a path is not permission to invent a different definition of success. Whether one intended order was charged twice should not depend on which judge woke up in a generous mood.

Layer Useful variation Boundary that stays fixed
Test exploration Paths, data, timing, and hypotheses Authorized environment, budget, and prohibited actions
Product behavior Different relevant recommendations or helpful wording Truthfulness, authorization, price, and promised capabilities
Evaluation Independent explanations and counterarguments Approved acceptance criteria and treatment of severe failures
Compare configurations without changing the obligation

Use the TestBucks retry investigation from Chapter 21 as a fixed evaluation task. Keep the payment invariant, sandbox, evidence access, and budget the same. Repeat with each candidate model and configuration. Record whether it detects the seeded duplicate-charge failure, wrongly flags legitimate separate orders, and supplies enough evidence to distinguish the two.

Variation in exploration is useful when it reveals additional failures. Variation in the acceptance rule invalidates the comparison. Chapter 15 handles disputed verdicts; Chapter 22 handles the release consequence. Here the decision is which configuration produces the most useful evidence for its cost.

TestBucks example: Repeats and variety answer different questions

Running “Can I get a refund for my incorrect latte?” twenty times tests consistency for that particular situation. It does not tell you much about a guest checkout with a missing receipt or an order that has already been refunded. Conversely, running twenty different situations once may miss unstable behavior within each one.

Think of cases as rows and repeated runs as columns. Here is a small illustrative result grid:

Fixed customer situation Run 1 Run 2 Run 3
Verified wrong drink; refund eligible Pass Pass Pass
Refund already completed Pass Fail Pass
Missing order evidence Pass Pass Fail

Read across a row to investigate consistency. Read down a column to examine breadth. Preserve the same order facts, policy, and question within a row when measuring repeatability. A differently worded question belongs to a labeled input variant, not an unexplained change in the experiment.

Ask AI to generate paraphrases such as “The drink was wrong; can you return what I paid?” and “I’d like my money back for this incorrect latte,” while preserving the same facts. Then ask for genuinely different situations: an already-refunded order, unavailable order evidence, or a request made by someone who does not own the order. Paraphrases test language robustness; different situations test different product obligations. Keep both, and do not count them as interchangeable coverage.

TestBucks example: The better model introduces a serious regression

Compare models A and B on the same frozen set of 100 synthetic support cases, using the same policy and rubric. In this illustration, A passes 90 and B passes 94. Is B ready to replace A?

The paired results tell the missing story: B fixes six cases that A failed, but breaks two that A passed. One newly broken case asks for another customer’s order. A refuses to disclose it; B helpfully supplies the order details. The four-point net improvement does not make that privacy regression acceptable.

Prompt

Compare TestBucks models A and B case by case. Show cases both pass, cases both fail, improvements, and new regressions. Cite the changed responses and supporting records. Apply the predefined privacy and authorization release gates before summarizing the overall score.

Keep the privacy case as a release veto under the stated gate, investigate the cause, and rerun it with adjacent authorization cases. Use repeated runs where behavior varies. The useful result is not simply “B wins.” It is a scoped account of what improved, what became worse, and which changes prevent release.

Model and temperature routing table

Activity Default model class Variability setting Why
Exact extraction, classification, dedupe Small/specialized Very low Consistency and throughput
Rote regression verification Small/specialized executor/judge Low Predictable decisions; fewer unnecessary hypotheses
Screenshot triage against a rubric Efficient vision model Low to moderate Grounded observation with limited interpretation
LLM-as-a-judge Calibrated judge/specialized model Low, often repeated Stable rubric application and measurable disagreement
Repository risk analysis Strong reasoning model Low to moderate Cross-file dependencies and consequences
Root-cause diagnosis Strong reasoning model Low to moderate Causal synthesis across evidence
Brainstorming and extreme edge cases Frontier/reasoning model Moderate to high Useful diversity and novelty
Fault-injection design and adversarial challenge Frontier/reasoning model Moderate, bounded Creative failure construction with safety review

Most verification work is repetitive classification against a known oracle. A frontier model is often unnecessary, slower, and more expensive; an unconstrained strong model may invent nuance or argue with an obvious result. Route the work to the model class that fits it.

Temperature controls sampling variability where an API exposes it; it does not create correctness or true idempotence. Some reasoning APIs ignore or restrict temperature. Reliability also depends on prompt, context, model version, tool behavior, structured output, retries, and oracle design.

Three controls for toning down variability

You do not have to accept the model’s default level of randomness. Many LLM APIs expose sampling hyperparameters: settings that influence how the model chooses its next token. Three common controls are:

Control What it changes How to reduce variation
Temperature How strongly sampling favors the most likely tokens Lower it for more conservative choices; raise it for more varied exploration.
Top-p Keeps a candidate set whose cumulative probability reaches a threshold Lower the threshold to narrow the choices.
Top-k Keeps only the k most likely next-token candidates Lower k to restrict the choices to fewer candidates.

For example, start a TestBucks issue-classification experiment at temperature 0.1 instead of 0.8, leaving the other settings unchanged. Run the same labeled reports repeatedly and compare incorrect classifications and disagreement. Then experiment with top-p or top-k separately. Turning every dial at once makes it harder to learn which change helped.

Low variability is useful for applying a fixed rubric. More variation can help when generating unusual customer journeys or fault scenarios. These controls change sampling, not the obligation to supply evidence. Even temperature zero is not a universal guarantee of identical output. Record the model version and supported settings with each evaluation. Ollama’s parameter reference documents all three controls in one local runtime.

TestBucks example: A local model investigates a local fault

Give a locally running model the checkout source and the diagnostic trace from the TestBucks timeout fixture. Ask it to identify where a retry could duplicate an operation and propose a focused test. The input is small, concrete, and easy to compare with observed behavior.

Actual lab diagnostics with an illustrative local Ollama workflow. This is an exercise design, not a claim that a specific local model produced a measured result. Real diagnostics capture / local architecture illustration. Download the model first; use local inference and verify that tools and telemetry stay local too.

Figure 29.1a. Keep the investigation on the machine.
Figure 29.1b. Keep the investigation on the machine.
Figure 29.1c. Keep the investigation on the machine.

Prompt

Using only the local source and trace, explain the timeout boundary and propose a test for duplicate orders. Keep the investigation local. Run the test in the isolated lab and distinguish your prediction from the observed ledger state.

Evaluate the model on whether it selects the correct boundary and asks for ledger evidence. Fluent speculation about retries is not enough. Keep the local model’s prompt, answer, proposed test, and actual result together so a smaller model can be compared fairly with a larger one.

Ollama: testing with models that stay on your machine

“We cannot send this data to a cloud model” does not mean “We cannot use an LLM.” Ollama lets you run downloaded models on your own computer. That includes open-source and open-weight models; check the particular model’s license. With local inference, the source code and test evidence do not need to leave the machine for the model to process them. This is a different privacy boundary from trusting a cloud provider’s promises.

Local models are useful for plenty of basic testing work: proposing boundary inputs, reviewing a small function, classifying logs, drafting tests, and summarizing failures. For TestBucks, give a local model the last-name validation function and ask for boundary cases, or supply a saved error log and ask it to group repeated failures. Start with bounded tasks that fit the model and your machine, then measure the quality of the results. You do not need the largest frontier model for every job.

Ollama also offers cloud features, so installing it alone does not establish a local-only workflow. Its local-only configuration supports OLLAMA_NO_CLOUD=1 or disable_ollama_cloud in its server configuration. Select a downloaded local model and keep the agent’s tools, retrieval, logs, and report storage local too. A local model connected to a cloud search tool is not an entirely local system.

For highly restricted work, provision the approved software and model first, then run in an isolated environment with outbound networking blocked. Verify that the complete workflow still works offline. Even teams with strict data-handling requirements can use LLMs for testing without sending their material to a hosted inference service.

Chapter 30 — The Real Price of AI Testing

The economics are not close. Human labor gets more expensive. Comparable model capability gets dramatically cheaper. And most testing work does not need a frontier model in the first place. Once quality work becomes ten or one hundred times cheaper, teams do not merely save money—they test things they could never afford to test before.

Use directional multipliers honestly

“How much faster is AI?” sounds like a simple question, but it mixes together work that has radically different shapes. An agent may map an unfamiliar repository, extract boundaries from a validator, generate candidate AI Tests, correlate console and network evidence, update regression intent, execute a browser matrix, and assemble a report. Those are different jobs. A seven-minute AI Check is not a direct replacement for a month of exploratory work unless the scope, evidence, review effort, and usefulness of the result are comparable. Still, an order-of-magnitude claim is often the right management-level description of the change: it tells leaders that the work can happen at a fundamentally different pace and scope, even though no single ratio applies everywhere.

The useful management question is: which quality activity can now happen earlier, more often, or at broader scope—and what credible evidence does it produce? Measure named tasks against the current process. For each one, disclose the scope, environment or hardware, model, token use, retries, review time, output quality, and whether the result changed a real decision. Compare a candidate-generation pass with the manual planning it replaces; compare a cross-browser run with the previous run cadence; compare log correlation with the time it took to notice and reproduce the same signal. Corroborate the order-of-magnitude claim with representative examples, but do not mistake a local ratio for a universal constant.

Cost categories

  • Model input/output and image processing;
  • Browser/runtime and cloud concurrency;
  • Environment setup, data seeding, and teardown;
  • Retries, flaky runs, and judge disagreement;
  • Storage and retention of evidence;
  • Engineering triage of false positives;
  • Human approvals and specialist review;
  • Maintaining deterministic scripts and adapters;
  • Cost of missed defects and delayed release.

Compare alternatives on the whole loop. A cheap model that floods engineers with false alarms is expensive; a costly reasoning model used for every rote check is wasteful; a specialized model that catches the right defects with low noise may be economically superior even before token price.

The economics of one unit of quality work

AI Test Harnesses compress work that previously had to move, serially, among a tester, a test-automation engineer, a developer, a test lead, and a release meeting. The comparisons below illustrate that shift, rather than reporting a controlled benchmark. They include work that humans traditionally treat as separate jobs: creating tests, running them, reading artifacts, triaging findings, investigating failures, and deciding whether enough is known to ship. Each approximate value uses the upper end of the example’s original estimate. Actual results depend on the task, model, tooling, and review required.

Approximate time per activity. Human and AI bars have equal thickness and share a zero-based scale within each pair. Scales differ between activities. Values are illustrative upper-end estimates, not measured guarantees.

Figure 30.1a. Time per quality activity. Approximate time per activity. Human and AI bars have equal thickness and share a zero-based scale within each pair. Scales differ between activities. Values are illustrative upper-end estimates, not measured guarantees.

Create a targeted test intent: human Approx. 90 min; AI Approx. 1 min. Execute a web scenario: human Approx. 20 min; AI Approx. 2 min. Build a regression: human Approx. 8 hr; AI Approx. 10 min. Analyze the artifact bundle: human Approx. 90 min; AI Approx. 2 min.

Figure 30.1b. Time per quality activity. Approximate time per activity. Human and AI bars have equal thickness and share a zero-based scale within each pair. Scales differ between activities. Values are illustrative upper-end estimates, not measured guarantees.

Triage and route an issue: human Approx. 45 min; AI Approx. 2 min. Analyze release confidence: human Approx. 8 hr; AI Approx. 10 min. Investigate and draft repair: human Approx. 12 hr; AI Approx. 15 min.

Approximate cost per activity. Human labor and AI execution estimates are shown in dollars, using the same zero-based scale within each pair. These are illustrative upper-end estimates, not total ownership costs; human review and integration must also be budgeted.

Figure 30.2a. Cost per quality activity. Approximate cost per activity. Human labor and AI execution estimates are shown in dollars, using the same zero-based scale within each pair. These are illustrative upper-end estimates, not total ownership costs; human review and integration must also be budgeted.

Create a targeted test intent: human Approx. $150; AI Approx. $0.10. Execute a web scenario: human Approx. $35; AI Approx. $0.25. Build a regression: human Approx. $1,000; AI Approx. $1. Analyze the artifact bundle: human Approx. $150; AI Approx. $0.30.

Figure 30.2b. Cost per quality activity. Approximate cost per activity. Human labor and AI execution estimates are shown in dollars, using the same zero-based scale within each pair. These are illustrative upper-end estimates, not total ownership costs; human review and integration must also be budgeted.

Triage and route an issue: human Approx. $75; AI Approx. $0.30. Analyze release confidence: human Approx. $1,000; AI Approx. $2. Investigate and draft repair: human Approx. $1,500; AI Approx. $5.

The harness reads product context, risk, and the current change before creating a targeted intent. Browser execution, evidence capture, and retries can run in parallel. Baking in a regression means preserving that intent rather than writing selector-by-selector procedural code.

Artifact analysis connects screenshots, logs, network activity, and the DOM. Triage brings evidence, counterargument, priority, routing, and a fix prompt together. Release-confidence analysis combines coverage, risk, evidence gaps, and the next best work. Failure investigation uses source awareness to connect the symptom to an implementation and a fix-ready handoff.

The local evidence already looks like this. A seven-step multi-specialist AI run completed in 2m 27s. The relevant comparison is not one browser click against one person click. It is the full loop from question to usable evidence.

The two curves decide the market

First, hold the task and quality bar steady and ask what one unit of testing work costs. Human productivity and pay tend to move gradually. AI execution costs can fall much faster. The chart models a 5-10x annual reduction in AI execution cost as an illustrative scenario, not a promise that every testing task will become cheaper at that rate.

Figure 30.3. Cost for comparable testing work, indexed to 100 today. Human pay grows 3% and hourly output 2% annually in this scenario; AI execution cost falls 5-10x each year. These are stated assumptions, not observed forecasts.

The same work can become cheaper. Human unit cost is hourly pay divided by hourly output, so those two gradual changes nearly cancel here. The AI curve falls quickly, but the complete testing bill also includes setup, integration, review, tools, and the consequences of missed defects. Cheap execution is not the same as cheap confidence.

Now ask a different question: how much more capable could each become? Human gains are drawn at 3% a year. The AI curve illustrates what happens if capability on a defined, repeatable set of testing tasks doubles each year. That doubling rate is an assumption used to show compounding, not a measured universal rate of AI progress.

Figure 30.4. Relative capability growth: human gains of 3% per year versus an illustrative AI doubling each year. Both start at their own baseline of 1x, reaching about 1.13x and 16x after four years. Equal starting indices do not mean equal starting ability.

Compounding changes what is practical to attempt. The human line looks nearly flat beside an exponential curve, but it is still improving. The point is the contrast in growth rates, not that humans stop learning or that AI automatically becomes correct. Define capability against useful tasks, verify the quality of the results, and measure the actual gains in your system before planning around them.

Most testing does not need a frontier model. Rote verification, extraction, classification, deduplication, regression comparison, and artifact reading run well on small, specialized, compressed, or open-weight models. Those models are heavily discounted; open-weight models can run for little more than electricity and the machine that hosts them. Reserve frontier reasoning for the work where creativity, deep causal synthesis, adversarial thinking, or unusual ambiguity actually changes the answer.

The conclusion is not delicate: even before the model-cost curve does another decade of work, AI Test Harnesses make quality work orders of magnitude faster and less expensive. That changes what a team can afford to test, how early it can test, how often it can test, and how much confidence it can build before it ships.

Redundancy is an economic question, not a cleanliness contest

Return to Chapter 13’s discussion of duplicate test candidates in “Business value belongs in planning.” A duplicate-candidate percentage has no business meaning by itself. Measure the cost per distinct executed intent, credible finding, verified fix, risk reduced, and decision-changing evidence item; include generation, setup, runtime, provider and environment load, triage, maintenance, delay, and false-positive tax. Cheap overlap can be rational when pruning it costs more than running it, when it exercises genuinely different states or evidence channels, or when repetition estimates stochastic stability. It is wasteful when it adds correlated green counts, duplicate triage, external side effects, rate-limit pressure, privacy exposure, or no plausible information gain.

Testing specialists should characterize what is technically redundant and what remains meaningfully different. Business and engineering leaders should own the broader value judgment: whether the new system improves time to confidence, release throughput, escaped-risk exposure, and total cost. Evaluate the AI transformation against the old operating system, not against an imaginary perfectly minimal suite that humans could afford to design but rarely had the time to maintain.

Why validation may consume most of the work

Software coordinates economies, employment, communication, education, transportation, scientific research, medical treatment, public services, relationships, and leisure. AI will generate more of it, faster, and place it into more consequential systems. The important economic question is not whether a model can produce another plausible application. It is whether society can validate software at the pace at which AI can create and change it.

Generation and validation are asymmetric. Generation needs one plausible candidate. Validation must challenge that candidate across relevant requirements, states, histories, users, permissions, environments, integrations, failures, attacks, and consequences. Cheap generation expands the candidate space; every candidate creates more states, dependencies, risks, comparisons, monitoring, diagnosis, and repair.

My forecast is that, in mature AI software-production loops, more than 80% of their compute could be spent on validation, verification, evaluation, comparison, monitoring, diagnosis, and repair—not initial generation. This is a prediction about compute within those loops, not a measured share of all AI compute. Generation creates a candidate. Validation earns the right to trust, deploy, monitor, and keep changing it.

Figure 30.5. Validation and verification compute.

No finite test program proves arbitrary nontrivial software completely correct. Here, “correct” means decision-relevant confidence in declared claims and risk tolerances, supported by representative, repeatable, skeptical evidence and explicit unknowns. High-consequence software demands more independent evidence, monitoring, reversibility, and an appropriately stringent authority model—human authority where it is currently required, not merely a more confident model adjective.

Observe the harness as carefully as the product

A long-running AI testing system is itself a distributed system. Record, by command, run, test, model, provider, adapter, and phase:

  • Input/output tokens, cached tokens where exposed, images, audio/video, context size, and model latency;
  • Browser/device/cloud-worker minutes, concurrency, queue delay, environment startup, and idle time;
  • API calls, rate limits, backoff, timeouts, retries, cancellations, provider substitutions, structured-output repair, and partial results;
  • Generated, selected, deferred, executed, blocked, repeated, activated, invalidated, and promoted tests;
  • Findings by severity and domain; reproduced, dismissed, duplicate, false-positive, escaped, fixed, and verified-fixed outcomes;
  • Evidence bytes, retention duration, redaction failures, report generation, and external synchronization;
  • Human review, approval, triage, repair, and waiting time;
  • Confidence movement and whether the run changed a release or next-evidence decision.

Do not let operational recovery rewrite history. Preserve the first provider failure, malformed response, browser crash, lost evidence channel, or test failure before retry. A resumed run must declare which state was durable, which work repeated, and whether comparable conditions still hold. If cancellation, rate limiting, missing credentials, or provider outage leaves a partial run, publish partial or blocked evidence rather than a green summary.

Try it with CARBON: /carbon-full-report summarize recorded runs and outcomes; identify missing cost or timing evidence — Ground the economic discussion in retained work rather than inventing measurements.

Unit economics should measure credible evidence

Measure the cost of answering a consequential question

The unit of value can be an investigation, not a generated test. For the payment-retry example in Chapter 21, count the effort needed to establish whether acceptance followed by a lost response and a retry can duplicate a charge. Include environment preparation, fault controls, agent execution, evidence inspection, review, rework, and the next experiment required to settle an ambiguity.

AI can produce a rough 10–100× improvement in expert-time leverage in favorable workflows: the expert describes the concern and challenges the result instead of implementing every step. The range describes an order-of-magnitude opportunity, not a guarantee for every product. A ready sandbox with accessible records is a different starting point from a locked-down integration nobody can instrument.

Record elapsed time separately from human attention and compute cost. Ten minutes of unattended execution and ten minutes of expert investigation are not interchangeable expenses. Nor are ten additional tests and one resolved release-blocking question interchangeable outcomes. Measure verified risk coverage added, decisions improved, and recurring effort avoided. That is where the business value becomes visible.

Useful measures include:

Measure Why it matters Guardrail
Cost per executed intent Basic throughput Says nothing about evidence quality or risk relevance
Cost per credible finding Combines execution with verified signal Define credible: reproduced, corroborated, or human-confirmed
Cost per verified fix Connects detection to closed-loop value Preserve regressions and exclude unverified prompt handoffs
Cost per decision-changing evidence item Measures whether work changed ship/hold/canary or the next plan Decisions differ in consequence and authority
Time to first credible finding Measures feedback speed Do not optimize away systematic coverage
Time and cost to confidence threshold Measures the whole convergence loop Threshold, risk tolerance, and missing dimensions must be visible
False-positive tax Model/browser cost plus human triage and trust loss Distinguish wrong, duplicate, irrelevant, accepted risk, and unsupported
Escaped-defect cost Impact, response, rollback, repair, and regression work Attribution may be uncertain; do not invent savings

Show observed counts separately from derived ratios and hypothetical savings. A user-baselined comparison can estimate avoided manual effort, but it must expose the baseline, assumptions, equivalent evidence, date, and uncertainty. Corroborated savings and productivity multipliers are useful as order-of-magnitude measures; state their range and context rather than pretending one local ratio or counterfactual defect cost is a universal constant.

Compare approaches on the same decision

Appendix D records a fast browser loop, not a controlled demonstration that AI beats traditional testing. Here is how to test that broader efficiency claim.

To test the efficiency claim, compare the same TestBucks risk set under human exploration, a conventional scripted suite, simple fixed or random exploration, and the AI Harness. Use the same clean baseline, fault set, environment, safety limits, and evidence standard. Count setup and maintenance effort, execution cost, false alarms, and human follow-up. Report both first-use cost and amortized cost over repeated runs so an existing automated suite is not charged from scratch on every trial.

Measure time to the first verified finding and time to a defensible release decision, alongside human review minutes and total cost. Have reviewers assess findings without knowing which approach produced them where practical. A fast stream of unsupported banners is not a win. A slower run that finds a consequential defect and saves hours of investigation may be. Until that controlled comparison is run, the efficiency advantage is my expectation, not a result demonstrated by the storefront timing.

Route for information value, not activity

Use cheap deterministic checks and small models for rote classification; stronger models for ambiguous causal analysis, creative exploration, cross-artifact synthesis, or skeptical review; local execution when privacy or iteration dominates; cloud workers when parallelism and environment diversity materially improve the decision. Stop or downgrade work whose expected information gain is below its cost, latency, risk, or authority burden. Escalate when a stronger model, additional artifact, real integration, or human specialist could change the conclusion.

The economic north star is not maximum tests, tokens, browser minutes, findings, or automation. It is the minimum responsible cost and time required to produce evidence strong enough for the decision.


Chapter 31 — Transform the Testing System, Not Just the Test Cases

Chapter 16 introduced the changed handoff between development and testing. This chapter turns that shift into an adoption plan: where to begin, which legacy assets to retain, how to support the people involved, and which operating boundaries to establish.

Please do not begin with a migration committee. Start using AI. Point it at the product, code, tests, requirements, and issues you already have. Run the checks from the beginning of this book. Find something useful on day one. The old artifacts will look much less precious after the new system starts producing value.

The transformation ladder

Figure 31.1. The AI-first testing transformation.

High, medium, and low conversion bands

  • High: clear intent, scope, setup/data, objective oracle, and evidence expectation; ready for a local pilot.
  • Medium: useful intent with one or two material gaps; refine before activation.
  • Low: procedural fragment, vague title, unsafe action, or missing pass criterion; keep draft and ask focused questions.

Passing today does not make a legacy test AI-ready. Readiness means a future agent can reproduce the intended validation safely and judge it objectively.

Start with AI, not with a migration committee

Connect an AI coding agent to the source repository, test repository, requirements, existing plans, and historical issues. Give it a capable AI Test Harness. Then immediately run the work from the early chapters: AI Checks, AI Tests, exploratory passes, risk analysis, issue triage, and AI Confidence. Learn from the real output before anybody schedules the framework debate.

That first session produces value: new findings, fresh coverage, a usable map of the product, targeted tests, and a clearer release picture. AI abstracts the legacy technology beneath it. Selenium, Playwright, Java, TestRail, JIRA, old plans, and half-maintained scripts are context the agent can read and use—not a prerequisite for starting.

Try it with CARBON: /carbon-help recommend a first-day testing workflow for this repository and its existing test assets — Begin with useful work before committing to a large migration.

Build or buy? Start in the coding agent

People ask whether they should build their own AI testing tools or buy a platform. My answer is usually: neither, at least not as your first move. Start using the AI coding agent. Give it the product, source, requirements, and testing knowledge. Add a capable testing harness. Find out what you actually need before turning this into another tool-selection project.

I am especially skeptical of the old testing platform with a little AI sprinkled over it. Procedural automation has real strengths: you can step through it, trace the calls, inspect the assertions, and usually reproduce its decisions. Add an opaque model that changes a selector, chooses the next action, or decides whether something is a bug, and you can lose that clarity without gaining a genuinely adaptive testing workflow. Now you maintain the old machinery and investigate a new source of variability. That can be the worst of both worlds.

The problem is not mixing deterministic code and AI. A good harness absolutely should use both. The problem is hiding a consequential AI decision inside a tool that cannot show you what happened. Ask to see the original failure, the evidence the model received, the action it selected, and what happened after a retry. “Our AI healed it” is not an explanation.

Years of investment are not evidence that an architecture is still the right choice. Existing tools bring real assets: integrations, operational knowledge, and working tests. Count those benefits, but compare the next investment against the alternatives. What produces useful, inspectable evidence for this product now?

For most development-time testing, I want the work to start and end inside the AI coding agent. It has the change, the implementation, and the conversation about what was intended. That is shift left in a much more useful sense than moving a separate testing queue earlier on a calendar. A scoped find-fix-retest loop can finish before the developer even needs to intervene.

That does not mean every browser, device, load generator, or independent evaluator runs inside the agent. Keep or buy those capabilities when they earn their place. Let the agent orchestrate them and bring their evidence back. Shared context does not mean the agent that wrote the code gets to grade its own work unchallenged. Independent validation still matters; a separate application window is not what makes it independent.

Your legacy investment is not trapped in its current tool, either. Ask AI to recover the knowledge encoded in manual cases and automation: the intent, assertions, setup, forbidden outcomes, and important boundaries. Save that as a portable test contract. Preserve exact values where they matter, not every incidental click. AI can help translate implementations across languages and frameworks, but translating the same brittle script is often less valuable than recovering why the test existed. Run and validate the recovered intent before retiring the original.

My default is simple: use the coding agent first. Preserve intent. Keep useful infrastructure. Build or buy the missing capability only after you can name it. You may need a harness, a device cloud, or specialist expertise. You probably do not need another separate place where the testing conversation has to start over.

Expand new coverage before you port old coverage

In the first week, ask the harness to keep adding risk-based coverage around the current product and the current change. Run AI Checks across evidence bundles. Generate and execute AI Tests. Ask for confidence and the next work most likely to change it. Let the AI coding agent and AI Test Harness work in the same context as the developers, while the change is still warm.

This produces far more coverage, faster, than an attempt to preserve every artifact from the previous testing era. It also gives management immediate evidence that testing is keeping up with AI-generated development rather than remaining a slow, separate queue.

Bring legacy assets into the new system when they earn their place

After the new loop is working, point the harness at the existing test suite. Ask it to run the tests, extract the intent, identify hidden environmental assumptions, and generate an AI-first version where that increases value. It can use the framework you specify or select an AI-first framework itself. The tests that convert cleanly become portable intent tests. The tests that do not convert still run through the harness as legacy adapters, where AI can diagnose and repair their selectors, timing, configuration, and flow failures.

TestRail, JIRA, spreadsheets, and old repositories are equally easy to absorb. Connect them read-only or export their contents into files; the agent can synthesize requirements, prior decisions, failures, and coverage without forcing the team to spend weeks manually reorganizing history. Conversion becomes a continuous value decision, not a gate that delays AI adoption.

Bounded repair

Permit a small fixed number of repairs to test intent, setup, waits, data, or expected-result wording. Never let the transformation loop change the product, weaken the oracle, or endlessly retry until green.

Try it with CARBON: /carbon-auto test and repair the approved checkout scope locally for 20 minutes; preserve failures and rerun relevant regressions — Try a bounded test-fix-retest loop with explicit scope and a stopping budget.

Ask for the information that unlocks the most cases

  • Exact starting URLs or routes;
  • Seeded data, IDs, names, counts, and dates;
  • Roles, permissions, flags, build, and environment;
  • Objective pass/fail evidence;
  • Sandbox credentials, mocks, callbacks, and logs;
  • Device/build/passcode details for mobile or point-of-sale cases.

Keep reports semantically separate

  • Readiness report: how convertible the source suite is.
  • Execution report: observed pass, fail, blocked, or unknown for converted tests.
  • Reproduction report: whether known issues still reproduce.
  • Pricing/ROI report: commercial cost, saved effort, and uncertainty.

Do not let a polished transformation dashboard imply that anything executed.

The endpoint is not a one-time conversion project. It is a quality system where intent tests, legacy runners, exploratory candidates, risk, findings, evidence, and confidence live together. Testers steer risk, design better oracles, curate personas, challenge results, and own quality strategy. Developers receive code-adjacent, fix-ready evidence. AI handles more of the mechanical loop, while authority moves to the most capable and delegated decision-maker.

Human perspective

HUMAN FRICTION — SELLING ATMS TO TELLERS
The revenue problem
Better, faster, cheaper testing sounds like an obvious win until it changes the business model. Large and medium testing vendors often sell labor capacity and take their margin on that labor. If AI makes a team 80% more efficient, the vendor may see a dramatically smaller billable labor base, pressure on its price, and a customer asking why delivery still needs the old headcount. The efficiency can improve the service while cannibalizing the revenue line that pays for it.

The pace problem
Human delivery has a familiar cadence: weekends, evenings, handoffs, and monthly cycles impose a pace on expectations. A 10x faster loop makes the organization accountable for more runs, more findings, more evidence, and more decisions at a pace many people do not actually want.

A real reaction
In one anonymized smaller-vendor conversation, an enthusiastic CEO asked a team to cover four or five projects instead of two after seeing AI work. The team pushed back—not necessarily because the results were wrong, but because the new workload meant more communication, responsibility, and stress, while they expected the company to capture the efficiency through fewer jobs. This is the Innovator’s Dilemma in testing: incumbents can be punished for adopting the thing that makes their service better. The structural details vary by company, so this is a pattern to investigate, not a universal financial claim.

Human perspective

HUMAN FRICTION — SUNK COST IS NOT A STRATEGY
The emotional trap
Test teams have spent years and millions of dollars curating scripts, frameworks, plans, dashboards, and issue databases. That investment feels like a reason to delay AI adoption. It is usually the opposite. The fact that scripts are expensive to maintain, fragile when the product changes, and unable to provide enough coverage is the reason to move now.

The ego trap
When an AI Test Harness finds bugs a team missed or performs in minutes work that once took a week, the reflex can be embarrassment rather than excitement. That reaction misunderstands what management and the business actually need: more coverage, earlier evidence, fewer surprises, and a test function that can keep pace with development. The person who brings AI testing into the team is not becoming less useful; they are becoming the person who makes software quality scale.

Leadership is not a headcount contest
Coordinating many agents and a smaller group of experts can produce more useful work than managing a larger manual operation. Measure what the organization learns and improves, not how many people or artifacts a manager owns. Letting AI maintain the bonsai tree is not an admission that your experience was wasted. It frees that experience to guide better investigations.

The practical consequence
If test teams wait, developers will adopt AI Test Harnesses themselves. They will test the code in the same agentic environment where it was created, and testing will move on without the people who understand quality best. The move is simple: get in the loop now, use AI today, add coverage immediately, and let legacy conversion follow the value.

Human perspective

HUMAN FRICTION — “HOW LONG DO I HAVE?”
The private question
Across manual testing, automation, vendor delivery, management, and the testing-commentary world, the question I hear privately is not “What new quality work can AI enable or accelerate?” It is “How long do I have in this job before AI does it all?” People understand that an agent can absorb large amounts of rote execution, script repair, report assembly, and ordinary triage.

Why the optimistic math does not comfort people
The optimistic arithmetic says that if AI performs 90% of today’s mechanical work while software volume grows by 10x or 100x, there can still be as much—or more—testing work overall. That answer is not comforting when the remaining work is the ambiguous, creative, high-consequence, difficult-customer, difficult-product part. The call-center analogy is real: automation can leave people with the escalations while removing the repetitive work that supplied rhythm, predictability, and relief.

A transformation plan has to see this
A transformation plan must account for the workload it creates. Removing repetitive execution can leave a role dominated by escalations, difficult decisions, and continuous communication across more projects. Budget for training, realistic capacity, and recovery time—not just the number of tasks the AI can absorb. A better testing system should improve the human job too.

A thirty-day AI-first adoption plan

Days 1-3: Turn it on. Connect the AI coding agent and AI Test Harness to source, tests, requirements, plans, and issue history. Run focused AI Checks and AI Tests on the current product. Ask for risk, triage, and AI Confidence. This is deliberately aggressive because AI makes the setup unusually easy: prompt the agent, let it inspect the repositories, let it generate the work, let it run tests of the tests, and let it generate the reports.

Days 4-10: Add new coverage. Use the harness to create and execute risk-based tests for the product as it exists now. Make it watch current changes, test the new button or flow, inspect adjacent UI and data behavior, and return issues straight to the coding agent. Report the bugs found, coverage added, and confidence gained immediately. This is the management story: quality is producing visible value on day one, not asking for a migration budget before it begins.

Days 11-20: Absorb the legacy estate. Import or connect TestRail, JIRA, spreadsheets, test plans, and script repositories. Ask the harness to run what exists, recover intent, ask the smallest necessary questions about hidden setup, and convert the cases that matter. Keep legacy tests as runnable adapters where conversion adds no value. Let the AI maintain and repair them while the team spends its attention on the new coverage that legacy automation never supplied.

Days 21-30: Operate one quality loop. Promote proven AI-first tests, retain useful legacy runners, connect issue and reporting views as needed, and run targeted confidence passes before release. Establish the operating scorecard: credible findings, time to verified repair, coverage added, release-blocking unknowns, recurring escapes, and AI Confidence. By the end of the month, the team is no longer planning an AI transformation. It is already practicing one.

Developers will stop sending you builds

If the testing handoff takes days and returns a pass percentage that does not answer the release question, developers have another option now. They can ask their coding agent to investigate directly. The AI coding agents will not wait politely for the old process either.

The testing team’s contribution has to be better questions, broader investigations, useful independent challenge, and evidence the development loop would otherwise miss. That is a much stronger position than being the department that owns a framework or runs the official suite. Meet the developers in the agentic workflow and add something they need.

Testing becomes the interesting problem

Think of an unexpected failure, describe it, and watch the investigation begin. Then ask a better question. That is a very different day from spending hours repairing selectors before you can learn anything about the product.

AI is making routine coding easier and giving testing access to much more implementation power. Understanding whether the result deserves trust becomes more consequential, not less. Curiosity, technical understanding, and the ability to connect customer consequences to concrete experiments now have much more room to operate.

Some of that direction comes from people today; more can come from agents as their capability improves. The opportunity is to build a system that keeps asking better questions and producing better evidence, whoever or whatever initiates the next investigation. Testing should be fun. AI can help make it that way.

Governance is product work

AI testing touches code, browsers, data, credentials, cloud accounts, issue systems, and release authority. That makes governance part of the product, not a legal appendix. Teams need explicit defaults for local versus cloud execution, artifact retention, sensitive-data redaction, model-provider approval, external writes, destructive tests, customer exposure, rollback, and human escalation. The harness must explain what it did, why it did it, and which policy allowed it.

The healthy organization does not centralize every test decision. It standardizes evidence and authority while giving product teams fast local loops. Developers can ask for immediate targeted validation. Test specialists can challenge the system’s assumptions and improve its oracles. Security, privacy, accessibility, data, and reliability experts can define what a credible claim requires. Leaders can decide what risk is acceptable. That is how the wall between development and quality disappears without pretending that every role has become interchangeable.


Part VI - Where Testing Goes Next

Explore dynamic software, synthetic populations, and testing that moves inside the product. Follow the outcome even when the interface disappears.

Chapter 32 — Testing into the Future: Dynamic Software and Synthetic Populations

From Ask to System

Prompt

How do we test software that changes for every person?

  • The Test Brief: “Define stable user promises and forbidden outcomes for a news product whose content, layout, wording, images, interaction mode, and proactive behavior vary by person and history. Design representative stateful tests, including interactions with other people and software agents, without expecting identical screenshots.”
  • The Harness: Model populations, histories, state transitions, personalization inputs, runtime generation, human–human, human–agent, and agent–agent interactions, invariants, distributions, metamorphic relationships, severe vetoes, and evidence sampling; test both the adaptation and the boundaries it must never cross; and calibrate forecasts against later observed behavior.

The interface may disappear

The interface may disappear. The product might be a different screen for every person, a voice in your ear, a text conversation, an ambient assistant, a proactive action, a swarm of APIs, or something with almost no visible interface at all. We do not know which form wins. We still have to test it.

The quality principles remain. Privacy, security, authorization, usability, accessibility, performance, reliability, content, data integrity, recovery, trust, and human control matter whether the output is a button, sentence, sound, image, tool call, transaction, or inferred action. What changes is the last-mile adapter that supplies input, observes output, and captures side effects.

TestBucks example: “My usual” is a testable promise

In the personalized teaching variant, Jason’s profile resolves to a medium oat vanilla latte with an extra shot. The same request can arrive through a personalized screen or a voice-style instruction: “My usual latte, please.” The companion uses a typed transcript to make the interpretation reproducible; it does not implement speech recognition.

Figure 32.1. My usual, then confirm your usual. Captured teaching-variant screens in illustrative iPhone browsers. Both resolve to Jason’s medium oat vanilla latte with an extra shot, $6.60 total, and Seattle pickup. The typed voice-style request is simulated; permission to place the order is still required. Captured teaching variant / voice transcript is simulated. The interface may change or disappear. The user context and verification obligations remain.

The test follows the outcome: correct profile, drink, options, $6.60 total, pickup location, and permission to place the order. A beautifully personalized screen can still choose the wrong milk. A voice response can sound helpful while skipping confirmation. Change the profile to another synthetic user and verify that Jason’s preferences do not leak into that order. The interface is flexible; the identity and purchase obligations are not.

Effectively unbounded software

When two people open the same news product, they may receive different stories, layouts, preferences, wording, summaries, images, controls, and interaction modes. Those outputs may change again after every click, conversation, location change, correction, subscription, or shared state update. The software’s behavior becomes a function of the current person, the system’s history, other systems, other people, and runtime generation.

The engineering problem is an effectively unbounded combinatorial state space: too many meaningful permutations and histories to enumerate. It resembles testing a search engine over a changing corpus or a browser rendering the web, except the application itself may generate new interfaces and logic during use.

Testing into the Future

Traditional testing mostly checks software as it exists now. Teams infer how people are likely to use it, concentrate on intended behavior, add a modest number of misuse and failure cases, and hope the product survives contact with the world after release. Even excellent testing is usually a bounded forecast performed through a thin sample of people, environments, histories, and interactions. Then the software ships, the world changes, other software changes, people adapt, and assumptions expire.

Testing is becoming predictive, dynamic, and generative. Instead of simulating one transaction or one failed dependency, we can simulate populations of people and software agents moving through time. Who uses the product? When? Why? What sequence emerges? How do the other agents respond? Which failure shows up three interactions later? Run many plausible futures, keep the ugly outliers, and fix the product before one of those futures becomes somebody’s day.

Companies are pursuing the ambition to simulate every person on the planet so marketers and product teams can anticipate reactions, targeting, product feedback, and product–market fit. This is the beginning of a new category of product intelligence: synthetic populations that make likely behavior visible before the product reaches the real world.

Testing and product research are increasingly merging. A synthetic population that can explore why people may adopt, abandon, misunderstand, misuse, or distrust a product is simultaneously producing usability evidence, product feedback, market hypotheses, and test candidates. A complaint about confusing onboarding becomes a reproducible intent test. An unexpected social behavior becomes a safety invariant. A predicted abandonment point becomes a performance or recovery requirement. The boundary between “Will people want this?” and “Will this work for them?” is becoming porous.

The scale will reach billions—and eventually trillions—of synthetic persona instances across large data centers. The number that matters is not the persona count. It is the number of representative, decision-changing trajectories the system can generate, test, and learn from.

Software agents make the problem harder. People will not be the only users of software; agents will call, negotiate with, delegate to, monitor, and modify other agents. A testing agent will therefore need to simulate other agents, which may themselves be simulating users or agents. Different models, tools, memories, permissions, goals, incentives, and states create a combinatorial interaction problem. Test the ecosystem. One agent’s isolated answer tells you very little.

A future-simulation harness will:

  • Build from observed populations and behavior, then extend them with synthetic assumptions;
  • Generate diverse personas from goals, constraints, histories, abilities, contexts, relationships, and incentives rather than demographic stereotypes;
  • Simulate time, movement, state, adaptation, social influence, software changes, and interactions among humans and agents;
  • Run many plausible scenarios rather than presenting a single predicted future as destiny;
  • Compare predicted outcomes with later production evidence and continuously recalibrate;
  • Preserve low-frequency catastrophic outcomes instead of averaging them away;
  • Expose uncertainty, blind spots, population gaps, model bias, and sensitivity to steering prompts;
  • Treat synthetic personas as simulations, not real research participants; and
  • Carry explicit authority boundaries for consequential action.

This is simulation, not emulation. The distinction matters. The system is not recreating a specific human consciousness, and a persona is not the person it approximates. It is generating conditional behavior from incomplete evidence and assumptions. Its forecasts can be useful without being identity claims or deterministic predictions. Confidence must remain calibrated by comparing simulations with what real people and systems subsequently do.

Jason story

JASON STORY — THE VIRGINIA JOB I DID NOT TAKE

Right out of school, I had a choice: Microsoft, or a job in Virginia simulating warfare. The Virginia work was going to model everything from tanks down to bullets and beams, then run many plausible scenarios to help people understand what might happen next. I thought it was one of the most interesting problems in the world. Honestly, I really wanted to do it. My girlfriend at the time did not like the idea, so I chose Microsoft instead.

It is funny how these things come back around. Now I am looking at a much bigger version of that problem. What happens when people and AI agents interact through software? What breaks when their goals conflict, or something fails at exactly the wrong time? We can try those futures before somebody has to live through them.

That is what testing into the future means to me. Don’t just test the situation in front of you. Create the situations you think are coming and see what happens. It brings me right back to that job I didn’t take, except now the idea applies to almost everything software touches.

Test promises, properties, and distributions—not one golden screen

Dynamic software needs richer oracles than a screenshot that happens to look right once. An AI Test Harness needs to preserve what the product promises, vary the conditions that can change the outcome, and retain the evidence that explains what actually happened.

Stable user and business intents

Start with the promise, not the current interface. A news product may promise that a subscriber can find a saved article, that a shopper can apply a valid credit, or that a patient can receive the right appointment information. The wording, layout, button location, and generated summary can all change while that promise remains stable. An AI Test Harness records the intent—“a subscriber can retrieve a saved article”—then lets the execution agent adapt to the current product rather than preserving a brittle sequence of clicks.

Invariants and forbidden outcomes

An invariant is a condition that must remain true across every allowed variation. A forbidden outcome is the useful negative form: something that must never happen. For example, a bank transfer may be personalized, delayed, retried, or displayed in different languages, but it must never debit the sender twice. A generated health assistant may phrase an answer differently each time, but it must never expose another patient’s record. Dynamic systems become testable when teams turn vague expectations into these durable boundaries.

Authorization and privacy properties

Every generated experience still needs a hard line around who can see, change, approve, or export what. Test the same account while logged in as its owner, a teammate, a support agent, an administrator, and an unrelated tenant. Verify that a recommendation engine can personalize a screen without leaking the data that created the personalization. For example, an AI Test Harness can compare network traffic, rendered content, API responses, and audit events after a role changes, then flag the case where a user loses the button but can still invoke the underlying action directly.

Metamorphic relationships

Metamorphic testing asks what should remain true when a controlled input or context changes. This is one of the most powerful tools for generative and dynamic software because it does not require one frozen expected output. If the same product search runs after the user changes browser language, the result ordering may differ, but the exact product matching a unique SKU should still be findable. If a user increases font size, the layout may reflow, but controls must remain reachable and readable. If an order is retried after a timeout, the final order total must remain the same. These relationships let the AI Test Harness make strong claims across changing surfaces.

Representative personas, histories, and high-risk slices

One generic user is not a product population. Generate and select personas that reflect different goals, constraints, abilities, experience levels, roles, histories, languages, devices, and risk exposure. A first-time visitor on a slow phone, a returning enterprise administrator with thousands of records, and a keyboard-only user recovering from an interrupted payment are not edge decorations; they are different systems in practice. The Harness can target high-risk slices directly: a newly invited user, a lapsed subscriber, an account near a credit limit, or a person whose prior behavior changes the next screen.

Repeated trials and distributions for legitimate variability

Dynamic systems legitimately vary. A ranking system can return a different but relevant result set; a generative assistant can phrase the same correct guidance differently; a cloud request can have variable latency. Run the same intent repeatedly and inspect the distribution rather than declaring victory from one lucky pass. For example, a checkout may succeed 100 times but show a severe latency spike for users behind a mobile network profile. The AI Test Harness records variance, tails, retries, and failure clusters so “usually works” does not hide the experience of the users who matter most.

Differential and benchmark comparisons among similar systems

When there is no single golden answer, comparison creates an oracle. Run the same intent against the prior build, a canary and baseline, two supported browsers, two model versions, or comparable eigen apps. If a new recommendation flow reduces successful completion from the prior version for a defined persona, the regression is visible even if both versions look polished. Benchmarking also identifies weak norms: a sign-in form that accepts only 23 characters may work technically yet fall behind the behavior expected across comparable services and standards.

Runtime traces, state, actions, and consequences

Output text alone is not enough. Capture what the agent tried to do, the state before and after, relevant DOM and accessibility changes, network calls, console errors, tool actions, database effects, timing, and downstream consequences. Imagine a travel assistant that says “your flight is booked.” A rich trace can show whether it only composed reassuring text, created a reservation hold, charged a card, received a confirmation number, and sent an email. The AI Test Harness needs the whole chain in order to distinguish a convincing answer from completed work.

Severe individual failure preservation

Aggregates can be cruel. A system that works for 99.9 percent of runs can still lock a small group of users out of their accounts, fail to charge a payment exactly once, or route a high-risk user into a destructive workflow. Do not average those cases away because a dashboard stayed green. Preserve the full evidence bundle, persona, history, environment, action sequence, and consequence for every severe failure. An AI Test Harness treats the rare catastrophic trajectory as a first-class release signal, not a rounding error.

Snapshot testing does not disappear; it is becoming one narrow oracle for states that should be stable. The center of gravity is moving to whether dynamic software continues to serve the person safely and correctly as its form changes.

AI in the loop makes selective proof practical

PREDICTION — NOT MEASURED: I think one of the most important future directions is AI choosing which pieces of a product deserve a proof, then doing the work to pursue it. Not “prove the entire application correct.” Find a consequential rule, express exactly what must hold, and investigate until there is a checked proof, a reproducible counterexample, or an honest unresolved result.

Lean is a programming language and proof assistant. A proof assistant checks a formal argument against a precisely stated claim. Lean produces proof terms that a small trusted checker, its kernel, can validate. That is a different kind of evidence from an AI saying that some code looks correct. The AI can propose an argument; the checker decides whether that argument establishes the stated theorem. The assumptions and the statement still matter. A beautifully checked proof of the wrong requirement does not protect the customer.

The opportunity is to put AI around that rigorous core. Have it read the product, identify high-consequence rules, propose tractable properties, and help a person decide which ones are worth formalizing. Let it investigate failed attempts, simplify the problem without silently weakening the promise, and turn actual violations into examples a developer can fix. Then repeat after the repair.

TestBucks: prove the refund gate, not the coffee shop

Consider an illustrative TestBucks refund rule: a refund may be authorized only when the requester is authenticated and owns the order. Start with a tiny policy function whose inputs are actual Boolean values. Suppose a defect combines those conditions with “or” instead of “and.” An authenticated customer who does not own the order would then pass the gate.

The proposed property is simple: whenever this function allows a refund, both conditions must be true. There are only four input combinations. The counterexample—authenticated is true, owner is false, authorization is true—explains the defect without a long transcript. Preserve it as a regression test, repair the condition, and check the property again across the complete declared domain.

That result does not prove TestBucks refunds are safe. The caller might supply the wrong ownership value. The API might bypass the gate. A retry might refund twice. Those are separate properties and integration tests. AI can help discover and prioritize those next obligations instead of treating the first proof as permission to stop testing.

Three outcomes, not one green badge
  • Proved within the stated scope: retain the exact property, assumptions, source and model versions, checker, and evidence. State whether the proof covers the implementation or only a model of it.
  • Reproduced counterexample: show the input or sequence, expected rule, observed violation, and a replayable regression test. Check that the example applies to the actual implementation before calling it a product bug.
  • Unresolved: preserve the reason and remaining gap. A timeout, unsupported language feature, incomplete model, or unsuccessful proof search does not establish that the property is false—or mathematically unprovable.

A model-to-code gap is especially important. Proving a Lean model does not automatically prove the production code that inspired it. That requires a justified correspondence between the two; replaying examples provides useful evidence but is not itself a proof of that correspondence. Nor should an agent “succeed” by assuming the desired result, leaving an admitted proof hole, or quietly reducing the domain. Review the claim and assumptions, independently check the proof, and invalidate it when relevant inputs change.

The AI in the loop is what I think makes this scalable and plausible. The expensive work is not just checking a finished proof. It is finding valuable candidates, extracting requirements, formalizing them, interpreting failures, and maintaining the connection to a changing product. AI can make that work part of everyday quality engineering. We still need to measure the economics: engineer time, useful counterexamples, checked properties, unresolved attempts, and the cost of keeping the evidence current. The future I want is selective proof alongside testing—not a new way to decorate uncertainty with a green badge.

For the underlying distinction between proof checking and trust in a translated program, see Lean’s explanation of proof objects and its trusted code base.

Try it with CARBON: The /proof command is an early, bounded step in this direction. It discovers consequential code and asks a person to approve a specific property and scope. Its current restricted Boolean-function path supports exhaustive verification and an optional Lean Boolean-model backend, with independently reproduced counterexamples and regression fixtures. The Lean result concerns the model, not a machine-checked equivalence to production Python. Automated AI proof search is not enabled in this initial implementation; the broader AI-guided investigation loop described here is the future direction, not a claim that the command already implements all of it.

Benchmarking is also the future

AI makes benchmarking practical at a scale that used to belong only to the largest platform companies. Early search engines had to crawl the internet, remember which words appeared on pages, and learn how often they occurred. That was an enormous problem at the time. Now AI can crawl the web, mobile products, APIs, desktop applications, agent systems, and other software surfaces—and then test them instead of merely indexing them.

That creates a benchmarking database of how software actually behaves. What is a normal sign-in time for a consumer product on a slow mobile network? How quickly do comparable checkout flows recover from an interrupted payment? How often do product-search results expose the exact item identified by a SKU? How do similar sports sites differ when one shows a stale score or omits a game entirely? The system can break these answers down by product family, device, geography, network, user role, accessibility need, history, expectation, and risk.

This is the practical meaning of eigen apps. Many applications share recurring components and behaviors: sign-in, search, forms, shopping carts, notifications, permissions, recovery, data validation, latency, and accessibility patterns. Once AI has tested enough of these comparable surfaces, it can tell a team whether its implementation is unusually strong, ordinary, or dangerously weak. It can compare functionality as well as appearance and performance. Two sports sites should agree on basic game data. Two services that accept a person’s name should not impose wildly different, unexplained limits. A product that makes users wait far longer than comparable products has a quality signal worth acting on.

The AI Test Harness uses those comparisons in its expected-value decisions. If a sign-in flow is already faster and more reliable than its benchmark, a risky optimization may not earn the change. If it is far behind the benchmark for an important user population, the Harness can increase priority, generate targeted AI Tests, and keep improving coverage until the decision is clear. Benchmarking turns “this seems slow” into “this is slower than comparable systems for this user under these conditions, and here is the expected value of changing it.”

Over time, this becomes a giant quality brain—a Borg-like view of what software does across the world, far beyond what any one company, test team, platform, or model company could ever observe alone. It knows the recurring components, the common failure modes, the actual performance distributions, the credible user expectations, and the differences that matter. That collective knowledge gives every new product a much better starting point for deciding what to test, what to improve, and when it is ready to ship.

Chapter 33 — The Test Moves Inside the Software

Jason story

JASON STORY — TARIQ WAS A COUPLE OF DECADES EARLY

I had just returned from a testing conference where I had an excited, heated conversation with my buddy Tariq. His PhD thesis explored the idea that software should be able to test itself. That sounded fantastical back in the day. He made some interesting strides, but the idea was well ahead of what most of us could imagine putting into ordinary software.

Now that future is starting to look reachable.

I don’t think this stops with testing inside a coding agent. The application itself can do it. When it has some downtime, why not test itself? Watch what is happening, figure out what the user might do next, and try it out safely with mocks. It already has access to its own internals. It doesn’t have to poke around from the outside and guess how everything works.

And then fix it. That is the big thing here. Find the problem, test a fix, and, where it is allowed to, apply that fix before the user ever hits the bug. Testing becomes something the app does while it is running, not just something we did before shipping it.

I think that will become a much more normal model for software delivery.

Today, we organize so much around an official version: the version in the app store, the version in production, the build everybody is supposed to use. Testing cost is a big part of why we work that way. Every extra version is another thing you have to test. Deep personalization becomes expensive not just because someone has to build it, but because someone has to establish that it works.

Now imagine that cost dropping while the testing becomes more sophisticated. Why stop at one experience for everybody? We could have hundreds or millions of variations suited to different users, situations, and contexts. All of those variations would still need testing. Much of that testing could happen inside the application, beside the specific experience it is supposed to validate.

We do not have to pretend that the whole future has arrived today. But this is where I think it is headed. The boundary between building, running, testing, and repairing software gets much less rigid.

Tariq was right. He was just a couple of decades early.

It is incredibly exciting that the day he imagined is now in sight. Very interesting times.

It might also become a safety issue. Follow that trajectory far enough and the humans are not in the loop at all: development, testing, production. The software is dynamically changing itself. That is a very interesting trajectory—and not just for software quality.

Ultimately, if AI can write its own software, maintain itself, and update its own software better than humans…

Dynamic software requires co-located validation

If the software changes at runtime, a distant fixed suite is already late. The validation system has to live beside—or inside—the software and understand the intent, generated form, user context, history, permissions, data, models, configuration, actions, and side effects that exist right now.

We always said the ideal test lived beside the code it tested. Now the test can live beside the running software too. It is no longer just a file in a repository. It is a durable claim with the ability to gather evidence wherever the product happens to materialize.

The old frameworks disappear; raw capability remains

Seleniums, Appiums, Playwrights, accessibility APIs, device labs, protocol clients, and observability systems are human-oriented abstraction layers. The lower-level capabilities they expose remain: a browser or device still has to receive an action, a protocol still has to carry a message, and a system still has to emit evidence. Agents increasingly operate against those capabilities directly or generate the thin adapter they need for the moment. The durable test framework as a hand-maintained product layer is disappearing.

The mechanism is generated and replaceable. The product promise is not.

Why hand-maintained test frameworks are being deprecated now

The framework is not failing because browser control will disappear. It is being deprecated because its primary job was to translate product intent into a form that people could write, read, maintain, and coordinate around. click(selector), page objects, fixture classes, test runners, and large libraries of pre-recorded scripts are human-scale abstractions over the product and its operating surfaces. A capable agent can reason from the current code, DOM, accessibility tree, screenshot, protocol, logs, API, and state, then generate the narrow procedural adapter it needs at that moment.

Four forces make that transition fast:

  1. The abstraction moved up a level. People needed reusable script libraries because they could not hold the application, the test mechanics, and the changing environment in their head at once. Agents can generate and revise mechanics from a durable intent, so the intent, evidence contract, and safety boundary become the reusable artifacts.
  2. The investment is asymmetric. Testing tools are typically maintained by small teams, while the largest software organizations are investing enormous resources in general-purpose multimodal agents that can read code, see images and video, understand and generate voice, operate tools, and maintain long-running context. The general capability will improve faster than a narrowly maintained framework can add bespoke features.
  3. The model is built for the testing problem. Modern LLMs are designed to interpret people, emulate user goals, communicate, judge ambiguous outcomes, and act through computer interfaces. Those are central testing activities: representing the user, defending the user, exploring intent, and deciding whether the observed outcome satisfies a promise.
  4. The economics reverse the old optimization. Even before an agent is perfect, it can generate, execute, adapt, and triage orders of magnitude faster and more cheaply than a person maintaining every procedural step. The rational question becomes whether a generated adapter can gather the required evidence safely, not whether a team should add another permanent script to the library.

This is not a claim that old executors vanish overnight or that every generated interaction is trustworthy. Existing Selenium, Appium, Playwright, and device-cloud assets remain useful compatibility surfaces wherever they already produce fast, deterministic evidence. But their large hand-maintained test codebases become legacy inputs or generated outputs, not the core intellectual property of quality engineering.

JIRA, test-case databases, and script libraries become generated views

JIRA issue queues, TestRail-style test-case databases, result repositories, spreadsheet inventories, dashboard applications, and giant directories of pre-recorded automation all solved a real human coordination problem. They stored artifacts long enough for a person to search, sort, assign, interpret, and hand off. In an AI-native SDLC, the plan, execution state, evidence, finding, fix context, and release question can change faster than a separate human-era system can be updated and reread. Copying those fragments into independent repositories becomes latency and a fresh source of drift.

The replacement is not amnesia. A harness still needs a durable, auditable evidence ledger: product promises and risks, portable intent tests, approved context, authority, plans, runs, artifacts, findings, dispositions, fixes, regressions, confidence claims, and release decisions. The difference is that this is agent-readable working state connected directly to the product and coding conversation. From it, the system can materialize the exact issue, test case, dashboard, audit export, or executive report that a human, regulator, customer, or existing process requires.

Treat the old systems as compatibility and publishing targets. Read their history as context. Generate a JIRA issue when external ownership requires one. Export a test case when a contract requires it. Produce a dashboard when an audience needs it. Do not make the AI loop wait for humans to maintain a second canonical copy of each transient artifact. The durable record is the evidence and decision history; the ticket, case, report, and script are views that can be regenerated when they remain useful.

An embedded test contract

Future software should carry or expose declared user and business intents; invariants and forbidden outcomes; authority and data boundaries; evidence hooks for state, action, timing, model/configuration, and side effects; safe simulation and fault controls; versioned comparison context; privacy-preserving sampling and retention rules; rollback and escalation contracts; and a way for an independent reviewer to challenge the builder’s evidence.

The test agent can evaluate a generated interface before showing it, observe the real interaction, monitor consequences afterward, and promote credible escapes into new durable claims. It should also be able to say that the required evidence is unavailable and refuse to manufacture confidence.

Shared context is power and risk

The QA agent inside the coding or runtime agent has extraordinary white-box knowledge and can often repair what it finds. It may also share the builder’s assumptions. Preserve black-box journeys, independent models or providers, deterministic invariants, production comparisons, specialist review, and human evidence as counterweights. Self-testing without independent pressure becomes self-approval.

The release loop becomes a product capability

In this future, release validation is not a ceremonial pipeline waiting at the end of a sprint. The product can expose an evidence contract while it is being built and while it is running. A coding agent proposes a change. The harness reads the changed promise and risk surface, generates the smallest useful checks and journeys, dispatches them to permitted adapters, asks a critic to challenge the result, and returns a qualified decision. A coding agent can repair a bounded issue; policy, authority, and shipping remain human-owned where they are assigned that way today, but can move into the automated loop as capability and delegated authority evolve.

That loop does not make software correct by assertion. It makes evidence generation keep pace with creation. The difficult work moves to deciding what counts as a promise, what can safely be observed or exercised, and which unresolved risks are acceptable. That is why confidence is the hard problem of AI.

Jason story

JASON STORY — THE SOFTWARE KEEPS IMPROVING ITSELF

The more I play with AI and testing software, the more I see a future that goes beyond an AI writing code and handing us a finished app. I see AI permeating the software itself. It takes an existing product and changes it, or creates a new one from scratch, for people or for other AIs. It does most of the useful testing itself. Then it keeps going.

It creates A/B variations of its own software and flights them to different groups in production. One version makes checkout simpler. Another changes how a feature works. Another tries a different way to help someone complete the task. The AI tests those variations before exposing them, watches what happens afterward, and uses that evidence to decide what to try next.

The feedback is not just a pass or fail from a test suite. It is analytics, customer feedback, successful task completion, revenue, support problems, reliability, and whatever measures tell us whether this particular product is actually getting better. It compares the variations, keeps the useful changes, rolls back the harmful ones, and creates the next experiment. Within the authority it has been given, that whole cycle can happen without a person passing work between the steps or approving every iteration.

Not just personalized software. Continually optimized software. Personalization asks which experience fits this customer. Optimization asks whether we can create a better experience at all. The system can do both: learn which variations work for whom, then invent and test better ones. Production becomes part of the learning loop, not the place where the work stops.

Creating features gets faster. Testing gets faster. Learning from real use gets faster. Those improvements reinforce each other. I can imagine an exponentially accelerating loop of features, functionality, and quality feedback, not just a faster version of the old release process. That is my vision, not a measured growth rate or a guarantee of improvement.

And people move further up the stack. Less passing builds around or manually checking every variation. More judgment about what should happen, what should never happen, whose interests count, and what the system may optimize. Revenue does not excuse deception; engagement does not prove a better experience. We still need meaningful goals, firm constraints, and a way to stop the loop.

The question moves from “Did we finish testing this release?” to “Have we created a system that keeps making the software better, in ways we actually want?” That is a much more interesting testing problem.

Validation becomes independent infrastructure

AI coding agents will orchestrate validation from inside the development environment because that is where they have the richest context: the current change, source, requirements, issue history, architecture, permissions, risk, and intended behavior. But orchestration is not the same thing as self-approval. The agent that created a feature can ask for the test; it cannot be the only entity that declares its own work ready to ship.

Verification has always been independent of creation when the consequence matters. Nobody buys a house without an independent inspector. Nobody accepts a bridge because the contractor says that the concrete, load-bearing structure, and construction all look fine. The same rule applies to AI-generated software. When an AI coding agent says a change is complete, the response cannot be, “The same agent tested it and thought it worked.” The organization needs independently gathered evidence that the product actually works across the relevant environments, users, dependencies, failures, and end-to-end consequences.

That independence is technical, operational, and economic. The independent validation plane runs its own AI Tests, captures its own evidence, maintains its own release ledger, and can use separate models, providers, test data, execution environments, and evaluators. It sees the creator’s context without inheriting the creator’s incentives or assumptions. It can challenge an optimistic test plan, replay the intent in a clean cloud environment, compare the result with production and benchmark evidence, and return a conclusion the coding agent did not write for itself.

Most execution will centralize in cloud validation infrastructure. A coding agent sends the durable intent, approved context, safe state, authority, and evidence contract—not a fragile remote-control script with every click hard-coded. The cloud fans that request out across browsers, devices, operating systems, APIs, networks, data states, personas, failure conditions, and specialist AI Subagents. It fans the evidence back in, deduplicates it, challenges weak findings, measures AI Confidence, and returns the next best action: repair, run more evidence, canary, hold, or ship. Centralization makes the expensive parts reusable: device capacity, isolated environments, specialist agents, benchmark data, production comparisons, execution history, and hard-won quality patterns.

This is why validation becomes the control point of AI software production. One tiny code change can cost a few tokens to generate and trigger ten or one hundred times more computation to validate across the system it touched. I expect the majority of software-production compute to move to validation, verification, evaluation, comparison, monitoring, diagnosis, repair, and revalidation. My forecast is that it could exceed 80 percent of the compute within mature AI software-production loops, not all AI compute. That is an allocation thesis, not a measured universal ratio. The appetite is nearly insatiable because every additional generated feature, integration, user state, model behavior, and environment adds more interactions worth validating.

The future stack is therefore not “a coding agent plus a test command.” It is a coding agent connected to an independent validation entity: a cloud-scale quality system that knows how software behaves, what has already failed, what comparable systems achieve, where the current change is risky, and which evidence would most increase confidence. The coding agent moves fast because it can invoke that system at will. The organization moves safely because the system that qualifies the work is independent of the system that created it.

Conclusion - Confidence Is the Hard Problem of AI-Generated Software

The exciting part is how quickly a concern can now become an investigation. We no longer have to spend most of our testing lives implementing the machinery to ask a question. We can ask, experiment, challenge, learn, and ask again. Confidence Testing makes that loop the work, with the suite serving the investigation instead of defining its limits.

Chapter 28 put human expertise inside an operating feedback loop rather than leaving it as a future aspiration. That loop can change as the machines improve. Its purpose is better evidence and better software, not preserving a particular assignment of work forever.

AI can already inspect, plan, generate, operate, observe, judge, challenge, learn, and report. A harness can connect those abilities into a stateful loop that starts with a fresh repository or existing suite and ends with evidence qualified for a release decision.

For now, the person’s job becomes less about manually maintaining every click and more about defining what matters, what may be touched, what evidence is sufficient, whose experience is represented, which risks are acceptable, and whether to ship. The future is not test automation with an AI garnish. Testing moves inside the engineering agent; the remaining human role moves upward and may continue to diminish as agents become capable of assuming it under an expanded authority model.

Return to the two phones telling knock-knock jokes. The scene captures the book’s larger claim: AI can turn a generic intent into a realistic cross-system test, execute it through whatever adapters exist, interpret whether the interaction succeeded, preserve the evidence, and make the work more inventive. The age of AI testing should be more rigorous than the age of scripted automation - and much more fun.

Field Guide - What AI Cannot Test Today

The tests passed. The product still feels wrong. Someone asks a question nobody put in the requirements, and suddenly the green dashboard is not very reassuring.

That is where this field guide starts. Not with a list of tasks reserved for humans forever, but with the gaps a team must not hand to AI and assume are covered. Not reported by an AI run is different from impossible for AI to find. Some gaps shrink when we supply better context, tools, or instructions. Others require an actual customer, a business decision, access we have not granted, or an accountable person willing to accept the consequences.

AI can help investigate every category below. What it cannot honestly do is replace missing evidence with confidence, invent the organization’s commitments, or establish a person’s lived experience by pretending to be that person.

Start with what the people actually found

My article, “Testing: Human Experts vs. AI,” described testing a deliberately buggy task manager. Chapter 26 examines the comparison in detail. The retained reports came from two human sessions and two AI sessions. Across 32 distinct reported findings, 16 were people-only, four were shared, and 12 were AI-only.

The 16 people-only findings break down into 12 product and usability observations, two requirements questions, and two unresolved save-related reports. That is not a count of 16 confirmed bugs that machines could not detect. In the narrower comparison, every currently supported human defect family also appeared in the combined AI reports. The human observations still matter. They ask questions that a defect-only scoreboard can erase.

The sessions were organized around a ten-minute exercise, but the retained evidence does not establish identical timing, prompts, tools, and access across all runs. These are directional observations from a small example, not a controlled estimate of human or AI superiority. The “8% that AI misses” campaign is not the measured split in this workshop and is not a universal miss rate.

The examples below preserve that boundary. Task-manager observations are drawn from the reports. TestBucks scenarios extend the ideas for teaching; they are not additional findings from the experiment.

1. Product polish and interaction judgment

The human notes did not stop at whether a button worked. They questioned whether the experience was worth using. Seven of the product and usability observations concerned:

  • Unprofessional-looking title typography.
  • A reset action using a native browser dialog rather than an in-page dialog.
  • A delete action using the same kind of native dialog.
  • A preference for creating a card inline.
  • An overall impression that the interface looked cheaply AI-generated.
  • Empty workflow columns remaining visible during search.
  • The absence of sufficiently clear, overall no-results feedback.

Those are seven observations, not seven automatic implementation defects. Native dialogs are not inherently wrong. Inline creation is not always better. The application already had per-column no-match messages, so the search concern was about the overall experience, not proof that all feedback was missing.

The missing comparison is often in somebody’s head

A tester brings expectations from competing products, prior versions, familiar conventions, the brand, and the task they are trying to finish. The agent may have only a screenshot and “find bugs.” It can notice misalignment or unreadable text yet miss the larger objection: this product makes a simple decision feel like paperwork.

Do not settle for “it looks AI-generated.” Ask what creates that impression. Is every heading equally loud? Does the page mix formal warnings with jokey payment language? Is a confirmation visually detached from the action it confirms? Turn an impression into a sequence and consequence without pretending that taste has become a universal rule.

TestBucks: technically correct, unnecessarily awkward

Imagine changing oat milk to almond milk requires leaving the cart, reopening the menu, finding the drink, and adding it again. Every individual control works. The larger interaction wastes effort and invites a duplicate order. A customer who buys the same drink each morning may notice immediately; a test that checks only the menu and cart separately may never ask the question.

Investigate: Watch a customer complete the change without coaching. Record the route, backtracking, accidental duplicates, and uncertainty. Compare an alternative with the same task and starting state. Let AI replay both journeys, count actions, inspect focus, and identify inconsistent behavior. Let people establish which friction actually matters and whether the alternative helps.

Keep: The observed interaction, the proposed improvement, and the evidence for its value. A preference can remain a preference and still deserve action. It does not need a fabricated failure assertion to become useful.

2. Missing capabilities and guidance

Five more human-only product observations asked for something that was absent or difficult to find:

  • Move the long help text into a Help menu.
  • Provide privacy documentation.
  • Offer card creation automatically when the board is empty.
  • Allow cards to be shared.
  • Allow other people to be invited.

Sharing and invitations were outside the application’s declared local-only scope. That makes them product requests, not proof that the implementation violated its requirements. The useful question is whether the chosen scope fits the people who will use it.

Following the interface cannot reveal every missing destination

An agent often explores the controls it can see. If it finds no invitation button, it may correctly conclude that invitations are not supported and move on. A team using the product to coordinate work may conclude that the product cannot serve its purpose. Both observations can be accurate.

Missing guidance has a similar shape. Help can exist and still be unavailable at the moment of uncertainty. A privacy policy can exist and still fail to answer the question prompted by a particular field. Existence, discoverability, clarity, and usefulness are different things to test.

TestBucks: the order exists, but the next step does not

A customer orders ahead, arrives at the store, and cannot find where pickup happens. The order record, total, and payment are correct. The experience has stopped one step before the customer’s goal. Another customer needs to change the pickup store and discovers that no supported recovery route exists.

Investigate: Start with the goal, not the menu of available features. Ask customers what they expected to do before and after the implemented journey. Mark each missing capability as a deliberate exclusion, an unclear boundary, an unmet need, or a defect against an existing promise.

Use AI: Compare the product with an explicit task inventory, locate guidance across the journey, and generate examples of interrupted or unsupported paths. Ask it to report missing capabilities separately from broken implemented behavior. Product owners must decide which gaps to close; the model should not silently expand the roadmap.

3. Requirements that nobody has agreed on

The two human-only requirements questions were simple: should a card be saveable with only a title, and should that title be allowed to contain one character? The stated rules did not require the additional fields, and one-character titles were explicitly permitted.

The people were questioning the oracle. They were not necessarily discovering that the code disobeyed it.

Correct implementation of the wrong rule

“Compare the application with the requirements” is a valuable task. It is not the same as “decide whether these requirements produce a useful and responsible product.” AI can challenge a rule when asked, but it cannot know which unwritten agreements are binding unless somebody supplies and resolves them.

An agent that reports every unusual input as invalid can be just as unhelpful as one that accepts every documented rule. A single-character name may be legitimate. A one-character task title may be a useful shorthand. The decision depends on who uses the system, what downstream processes need, and what the organization has promised.

TestBucks: what does “my usual” promise?

Does “my usual” mean the most recent order, the most frequent drink, or an explicitly saved preference? Does a one-off oat-milk order change the default? Does the current store affect what is available? Is a new price acceptable without confirmation?

An AI can produce plausible answers to all of those questions. Plausibility does not make an answer the product’s rule.

Investigate: Put competing interpretations beside concrete examples. Ask the responsible owner to choose or explicitly leave the behavior unresolved. Record the decision, scope, exceptions, and affected customers. Then ask AI to generate positive cases, boundary cases, and contradictions against that decision.

Keep: An undecided requirement as an open question, not a pass and not an invented defect. Once the decision is made, it becomes durable context for the Harness and a candidate for regression coverage.

4. Workflow meaning and visual layout

The article also discussed workflow rules and layout. These were shared areas, not demonstrated human-only abilities. The overlapping reports concerned approval, capacity, clipped titles, and a load-failure symptom. The reports did not always describe identical thresholds or establish the same cause.

That distinction is useful precisely because this section is about what AI cannot be trusted to settle alone. Detecting a rule violation and deciding why the rule matters are separate activities. The agent may be excellent at proving that a fourth card enters a three-card column. An experienced user may explain why that limit protects an overloaded team, or why an exception is necessary during an incident.

TestBucks: a working shortcut with the wrong consequence

Suppose a repeat-order button places an order immediately. The customer saves a click. It may also bypass a changed price, a different pickup store, or a milk substitution. The button can satisfy its narrow implementation test while breaking the customer’s understanding of the transaction.

Investigate: State the invariant in terms of consequences: which changes require fresh confirmation, who can authorize them, and what must remain visible before purchase? Test the whole transition from saved preference to confirmed order, including interrupted and repeated actions.

Use AI: Explore the state combinations and collect transaction evidence. Ask a person with the relevant authority to resolve disputed consequences. Do not reserve ordinary workflow testing for humans just because people found some workflow failures in one workshop.

5. Save, load, and the unresolved observation

Two people-only reports concerned high-priority cards: one said they could not be saved; another said they disappeared after editing and saving. Those reports were unresolved. A basic high-priority edit, save, and reload path succeeded in two later automated executions, so the evidence did not support a universal “high-priority cards cannot save” claim.

That does not make the original observations worthless. A filter, another tab, prior state, a storage failure, or a different action sequence might matter. A card disappearing from a filtered view is one possible explanation, not an established cause of that session.

A failed reproduction is not a memory eraser

AI can run a simpler path, see it pass, and become too confident that the report was mistaken. Humans can do that too. The right response is to identify what is missing from the reproduction, not to protect the first explanation offered by either side.

In TestBucks, a customer changes a drink to iced and says it vanished. Was the cart filtered? Did a second tab overwrite it? Did the save reach durable storage? Did the interface show success before the write completed? Was the customer looking at another account or store?

Investigate: Preserve the original report. Capture the item identifier, account, filter, tabs, store, application version, actions, network events, and storage before and after. Use disposable data. Separate “not visible,” “not saved,” and “deleted.” They are different observations requiring different evidence.

Keep: A reproduction attempt and its limits. If the state needed to resolve the report is gone, say so. AI cannot reconstruct unrecorded events merely by describing a convincing failure mechanism. A useful output is a targeted instrumentation plan for the next occurrence.

Six broader areas that need human context

The human-versus-AI article and the IcebergQA work also point to a broader expert-review checklist. The following six areas are not six categories proven exclusive to humans by that workshop. AI found technical problems in several of them. They identify places where technical detection needs context, judgment, and a decision about what is acceptable.

Security and privacy: who should know what?

An agent can test whether account A reads account B’s order. It cannot establish an organization’s intended access policy from the fact that an endpoint currently allows the request. Nor does finding no unauthorized response in a few probes establish that no leak exists.

For TestBucks, should a shared pickup display expose a full name, a drink preference, or a note about an allergy? Which information does the barista need, which may other customers see, and how long should it remain available? Those decisions require product context and appropriate privacy and security review.

Give the agent an explicit data map, role matrix, approved test accounts, and boundaries for probing. Use it to trace information through screens, requests, logs, exports, and deletion. Keep separate evidence for a missing privacy explanation, a missing technical protection, and a confirmed disclosure. They should not collapse into one generic “privacy issue.”

Look, feel, and trust: plausible is not appropriate

Generated interfaces can be locally polished and globally incoherent. A friendly purchase screen, alarming receipt, and overly casual refund denial might each pass a screenshot check while making the whole service feel unreliable.

Provide brand examples, language expectations, and real customer tasks. Ask AI to find inconsistent terms, action labels, and promises across the journey. Then observe whether people understand and trust what happens. A generated persona’s reaction is a hypothesis for that research, not a substitute for an actual customer’s response.

Business rules and edge cases: exceptions are part of the product

What happens to a loyalty reward after a partial refund? Can a store replace an unavailable ingredient without changing an allergen warning? What if a customer and an employee edit the same order? A happy-path specification rarely contains every operational agreement behind these questions.

Bring support cases, incident history, operator knowledge, and policy decisions into the test context after removing sensitive details. Have AI generate combinations and traces against those rules. Ask domain experts to resolve contradictions rather than asking the model to vote on which policy sounds nicest. Preserve the exception as part of the rule, not an informal note that disappears at the next handoff.

Production behavior: the lab is not the lunch rush

A local simulation can probe timeouts, duplicate requests, concurrent updates, and partial failures. It does not establish the exact conditions at a busy store with aging devices, intermittent connectivity, impatient customers, and an existing queue of paid orders.

In TestBucks, a correct recovery must reconcile the customer’s receipt, the payment state, and the barista’s queue. Test those observations together. Let operations staff identify realistic failure conditions and safe test windows. Use bounded simulations, monitored canaries, and approved recovery drills. An agent that has never observed the relevant production conditions must not report production safety as established.

Compliance evidence: a check is not certification

AI can connect a supplied requirement to observable behavior, identify missing evidence, and help prepare a review. It cannot grant legal, contractual, or organizational authority to its own conclusion. Applicable obligations and their interpretation need qualified owners.

A TestBucks deletion flow might remove a visible profile while retaining order records elsewhere. The test should establish what remains, where, for how long, and under which approved rule. It should not invent a universal retention period or declare the result compliant because the Delete button worked. Keep the requirement, evidence, reviewer, and unresolved exceptions linked.

Maintenance and compatibility: preserve the old customer’s world

A fresh account on the latest browser misses a large part of upgrade risk. Existing preferences, old receipts, interrupted orders, saved links, and prior versions of data may be the conditions that matter most.

For TestBucks, migrate a saved drink with a retired size or ingredient. Does the application ask the customer to choose, silently substitute, or fail? Build a representative set of old states from approved, sanitized examples. AI can exercise that matrix, but it cannot establish representativeness from a handful of convenient fixtures. Someone must decide which customer histories and environments the release promises to preserve.

What AI cannot supply on demand

Across these examples, the recurring gaps are not simply “creativity” or “common sense.” Name the dependency that is absent:

  • Unshared context: The agent cannot reliably apply a business agreement that it was never given. Supply it, resolve contradictions, and rerun.
  • Unavailable observations: It cannot verify a payment, stored value, or physical outcome it cannot observe. Add instrumentation or report the limitation.
  • Real human experience: It cannot establish how actual customers with particular abilities, histories, or circumstances experience the product without evidence from those people.
  • Decision authority: It can recommend a policy or release decision. It cannot appoint itself the person accountable for accepting the consequences.
  • Independent assurance: A second answer from the same model, assumptions, and evidence is not automatically an independent review.
  • Complete coverage: A finite exploration does not establish correctness across every state, environment, and future change. Record the tested scope and the remaining uncertainty.

These limits do not justify a vague “humans will catch the rest” plan. People miss things too, disagree, forget context, and fail to record evidence. The human part of the workflow needs named responsibilities and observable outputs just as much as the automated part.

Turn a blind spot into a useful test

Use this sequence when a person notices something the agent did not:

  1. Preserve the observation. Record the person’s words, the context, and any available artifacts before rewriting the report into a familiar bug template.
  2. Classify the concern. Is it a reproduced defect, an unresolved symptom, a requirements question, a usability concern, or a proposed capability? Keep the original even if the classification changes.
  3. Name the missing dependency. Was the problem missing context, missing access, weak instructions, insufficient exploration, or a decision nobody has made?
  4. Supply the smallest useful addition. Give the agent the rule, trace, representative state, or alternative interpretation it needs. Do not dump unrelated personal or customer data into the prompt.
  5. Test the consequence. Ask it to investigate the behavior and plausible competing explanations, not merely agree with the person who reported it.
  6. Retain the learning. Save the approved rule, reproduction, relevant evidence, and regression intent. Revisit the test when the product or the rule changes.

Prompt

Investigate this reported concern: [observation] in [journey]. Available evidence: [artifacts]. Classify it as a defect, unresolved symptom, requirements question, or product suggestion. Do not assume either side is correct. Identify missing context; investigate competing explanations. Do not invent rules, customer reactions, or successful checks. Propose a bounded test and name any decision needing a human owner.

For an unfamiliar product, run one broad AI investigation and a separate human exploration before either side sees the other’s conclusions. Reconcile afterward. Otherwise the first report can anchor both investigations, and agreement may simply mean that everyone followed the same path.

A field note worth keeping

For each gap, retain the customer and goal, observation, evidence status, missing context, next investigation, and decision owner. Record what would change your mind. Neither “the expert said so” nor “the AI said so” settles it.

People noticed valuable things absent from the AI reports. A defect-only comparison would have erased them. Keep the human question. Give AI the missing context. Test what happens next.

Appendices and Reader Resources

How to use the sources in this book

This book deliberately distinguishes a standard, a tool, a product implementation, and an author observation. Standards define requirements. Tool documentation describes a capability at a point in time. Product examples show one implementation. Personal stories illustrate a lesson; they are not universal measurements. Where a claim needs public reproduction, the book says so rather than silently treating a private run as a benchmark.

The following resources are the durable starting points for the concepts used throughout the book. They are not endorsements, a complete bibliography, or proof that any one tool establishes product quality.

Standards and primary documentation

  • Web Content Accessibility Guidelines (WCAG) 2.2. World Wide Web Consortium. https://www.w3.org/TR/WCAG22/ . The normative reference for accessibility criteria discussed in Chapters 1 and 3. Automated and AI-assisted evidence contributes to assessment; it does not by itself establish conformance.
  • Selenium documentation. Selenium Project. https://www.selenium.dev/documentation/ . A primary reference for the browser-automation family discussed in Chapters 3, 9, and 10.
  • Playwright documentation. Microsoft. https://playwright.dev/docs/intro . A primary reference for a modern browser-automation adapter discussed in Chapters 3, 9, and 10.
  • Axe accessibility tooling. Deque Systems. https://www.deque.com/axe/ . An example of rules-based accessibility tooling. Its role here is complementary to AI-assisted visual and interactive inspection.
  • OpenTest.ai. https://opentest.ai/ . The open otai/testcase · v1 and otai/bug · v1 interchange specifications used for portable test-case and issue records.
  • Taming Google-Scale Continuous Testing. Google Research, ICSE 2017. https://research.google/pubs/taming-google-scale-continuous-testing/ . A large-scale case study cited in Chapter 4 for the limited claim that exhaustive per-change regression testing becomes infeasible as code size and change rate grow; it does not support a universal validation-growth formula.

Product implementation notes

Product commands, model routing, UI controls, cloud contracts, and service terms can change faster than a printed chapter. Current implementation detail belongs in the companion materials and product documentation; the book keeps the durable architecture: evidence, intent, risk, execution, challenge, confidence, decision, and learning.

Check the current public documentation before relying on a named product capability. A capability observed in a local implementation is not necessarily available in every public release.

Appendix A - AI Test Harness Capability Crosswalk

Use this crosswalk when evaluating a Harness. Commands are entry points; the retained evidence and enforced workflow are what matter.

Capability Inputs Retained output Start here
Risk analysis Source, requirements, business context Ranked risks and missing evidence Chapter 13
Intent execution Test intent, authorized environment, synthetic data Observations and step results Chapters 7 and 10
Triage and handoff Candidate issues and supporting evidence Reviewed, fix-ready issue records Chapter 8
Workflow orchestration Plan, tools, limits, stop conditions Run state and execution history Chapters 17 and 18
Change-aware selection Diff, dependencies, previous results Selected tests and selection rationale Chapter 20
Confidence analysis Risks, results, gaps, contradictory evidence Release recommendation and remaining uncertainty Chapter 22
Cloud execution Bounded intent and isolated worker context Worker evidence and aggregated results Chapter 24

For every capability, ask which actions require approval, where evidence is stored, and how the next run retrieves it. Planned work must remain distinguishable from executed and verified work.

Appendix B - Portable Contracts

The two complete schema references live in the main text, not in this appendix:

  • Bug findings: Chapter 1, “The OpenTest.ai AI Issue Schema: canonical bug reference,” in Part I’s checks section. It covers the report envelope, every issue field, all eight categories, numeric ranges, and an annotated TestBucks example.
  • Test inputs: Chapter 7, “The OpenTest.ai Test-Case Schema: canonical reference,” in Part II’s intent-based testing section. It covers the saved intent, every step field, all action values, declarative checks, and the boundary between a test definition and Harness execution context.

Use those references when storing or exchanging records; do not maintain a second schema here. Keep project-specific execution and evidence records alongside them rather than confusing a proposed test with a completed result.

A practical evidence record answers five questions:

  • What claim or intent was being tested?
  • Which application state, environment, and data were used?
  • What action was actually executed, and what was observed?
  • Where can a reviewer inspect the supporting artifacts?
  • Is the result proposed, observed, verified, blocked, stale, or not assessed?

Version the schema as well as the content. Preserve the original observation when a later reviewer changes its interpretation. A confidence ledger should retain unresolved risks and missing evidence, not only successful results. Chapters 8, 18, 22, and 24 show how these contracts support handoff, state, decisions, and cloud work.

Appendix C - Widget and Flow Recipes

Use these starting points to turn a common interaction into an intent. Supply the actual product rules and authorized environment before execution.

  • Search: Find an existing item, an absent item, and an item with punctuation or non-ASCII text. Check relevance, empty-state guidance, and whether stale results survive a changed query.
  • Sign-in: Verify valid and invalid credentials, keyboard access, session expiry, and the destination after authentication. Use test accounts; do not probe other users’ accounts.
  • Cart: Add, modify, and remove an item. Verify quantity, options, totals, and persistence against explicit pricing rules. Stop before any real purchase.
  • Profile form: Exercise empty, boundary-length, and international values. Compare validation with the actual user need, not merely the limit already implemented.
  • Recovery: In an isolated copy, inject a timeout or unavailable dependency. Check that retry behavior is bounded, the user receives actionable guidance, and repeated actions do not duplicate a transaction.

For each recipe, save the intent, prerequisites, data, expected outcome, observed evidence, and cleanup. Reuse the intent across interfaces; let the execution adapt to the current implementation.

Appendix D - JEV: Fast Decisions Need a Careful Harness

At the time of writing, TypeSafe AI’s Jev is a new model and a new approach we are still experimenting with. Instead of asking a general-purpose LLM to write a long response, we can ask a small, structured question: which action next, which classification fits, or how does this evidence score against a rubric? The answer goes straight back into software.

That could change the economics of exploration. It also puts more responsibility on the software surrounding the model. A fast answer is not necessarily a decision worth acting on.

What I put in the browser loop

I connected Jev to a deliberately imperfect storefront. A Node.js controller supplied requirements, maintained history, and offered executable probes. Playwright drove the browser. Jev selected the next probe, then judged the observed result. The dashboard displayed the actions and judgments while a real-time recording preserved the run.

The model did not inspect screenshots in this experiment. It received page text and structured observations: quantities, totals, search terms, email values, and status messages. I supplied the action vocabulary, including negative quantities, repeated coupons, and malformed email addresses. The controller filtered that menu to actions possible in the current state.

This was bounded adaptive exploration, not an agent discovering an unfamiliar application from nothing. Code provided the moves. The model chose among them. That division of labor is part of the opportunity, not something to hide.

// Simplified explanation of the recorded architecture.
const before = await observePage();
const available = await availableProbes(before, history);
const decision = await chooseWithJev(before, available, history);
await executeWithPlaywright(decision.choice);
const after = await observePage();
const judgment = await judgeWithJev(requirements, decision, before, after);
recordAndDisplay({ decision, before, after, judgment });

The recorded responses identified the model as jev-1.13.0. The extended run completed 63 probes in 24.3 seconds, including browser actions, model requests, and controller overhead. There were 126 API calls, with a median HTTP round trip of 131 milliseconds. The controller reset the storefront between exploration passes, so those 63 probes included repeated cases.

There were 21 flagged probes across five deliberately seeded defect families, not 21 unique bugs: misleading search results, compounding discounts, stale totals after removal, invalid-email checkout, and nonpositive quantities.

A tiny decision with a concrete consequence

An $80 lamp became $72 after applying a 10% coupon. The requirement said the coupon could apply only once. Jev selected the repeat-coupon probe; the browser applied it again, and the total became $64.80. Jev classified the transition as a bug, with a reported bug probability of 0.97 and a separate confidence field of 0.95. The judgment call took 121 milliseconds end to end.

That is easy to inspect: a requirement, an action, a before value, an after value, and a violated invariant. But arithmetic is also a good example of work that does not need model judgment. Code can calculate the expected discount exactly. Use the decision model where choosing or interpreting is useful, and deterministic checks where the contract is precise.

The model also treated a quantity of 999 as acceptable because the supplied requirements specified no upper limit. It flagged zero and negative quantities because those were explicitly prohibited. The requirement context mattered as much as the speed.

A 49-51 split is confusion, not a verdict

Suppose a model returns 51% for “bug” and 49% for “not a bug.” Picking the largest number and painting a red banner hides almost everything important about the answer. For a defect judgment, I would treat that as unresolved uncertainty. The machine needs more evidence, a better question, or a different evaluator before it interrupts somebody with a confident claim.

The actual run contained a similar warning: one valid-email checkout received 0.49 for expected behavior and 0.47 for a bug. The controller displayed the winning label. It did not have an abstention rule based on the narrow margin. That was a weakness in the harness, even though the interface looked decisive.

These returned probabilities are not statistical confidence intervals. Neither the probability distribution nor the separate confidence field establishes calibration: a reported 0.95 does not, by itself, demonstrate that comparable judgments are correct 95% of the time. Evaluate that relationship on independently labeled examples. Choose thresholds for the consequence of being wrong, not because a round number looks reassuring.

The action matters too. A close choice between two harmless exploration probes may be fine: try one, preserve the result, then try the other. A close choice about whether to dismiss a payment defect is different. The harness should not apply the same decision rule to both.

The consequence-tier abstention policy is developed in Chapter 15. Apply it here: the 0.49/0.47 judgment remains unresolved; the controller must not promote the winning label into a settled verdict.

Keep uncertainty visible and investigate it

For a near-tie judgment, the next step should be useful work:

  • Preserve the full distribution, selected label, model version, question, requirements, and before-and-after evidence.
  • Mark the outcome unresolved rather than silently accepting the winning label.
  • Check whether a deterministic assertion can settle it.
  • Reproduce from a clean state or gather a missing observation that distinguishes the competing explanations.
  • Ask a more capable reasoning model or a relevant person when the remaining uncertainty justifies that cost.

Repeating the same question until the preferred answer wins is not investigation. Neither is taking a majority vote over correlated judgments and calling it independent confirmation.

The experiment exposed another subtle problem. Some later add-to-bag actions were accepted while the total still carried an earlier discount error. The judge had been told to focus on the current action and avoid repeatedly flagging unrelated bugs. But adding an item changes the total, so the inherited error could still matter. A locally acceptable action is not proof that the resulting application state is correct. Keep global invariants alongside per-action judgments.

Trace the decision even when you cannot explain the model

A compact label and a probability do not give you a step-through explanation of how the model arrived there. A generated explanation from another model would not recover that missing internal trace, either.

You can still make the surrounding process auditable. Preserve exactly what the model received, the available choices, its raw response, the threshold policy, the browser action, and the observed consequence. Link the classification to a reproducible requirement violation whenever possible. Distinguish an auditable execution record from an explanation of the model’s internal reasoning.

For a high-consequence decision, a weak evidence trail is a reason to escalate or abstain. Speed does not repair that gap.

Do not make a human pay for fast automation

Everyone wants test automation to be fast. I have spent enough time investigating false alarms to ask a different question: fast for whom? Saving a few seconds in a test is a terrible trade if it creates twenty minutes of human investigation.

I have usually preferred automation that runs a little slower and checks and double-checks itself before interrupting a person. That does not mean hiding an original failure or retrying until green. It means preserving the failure, distinguishing a product problem from an environment or observer problem, and arriving with enough evidence to make the interruption useful. Urgent, high-consequence failures still need prompt escalation.

Do not chase fast for fast’s sake. Measure time to a credible finding or a supported decision, including false alarms, missed problems, retries, and human follow-up. A faster model can actually buy more checking within the same budget instead of merely producing more banners per second.

Where this could fit

My larger argument is about efficiency compared with traditional non-AI testing, not just speed compared with another model. I expect AI to make exploration and evidence collection far more economical when it removes manual execution and script-maintenance work. This experiment illustrates a fast loop; it does not establish the size of that advantage. The 63 probes in 24.3 seconds measure throughput, not comparative time to a credible decision. They also include repeated cases, not 63 distinct defects or coverage obligations.

Chapter 30, “Compare approaches on the same decision,” gives the controlled comparison: equivalent risks, baselines, evidence standards, and full costs. Until that comparison is run, the efficiency advantage remains my expectation, not a result established by this timing.

I can imagine a larger orchestration with several kinds of intelligence. A general-purpose LLM interprets the goal and prepares probes. A fast decision model selects among safe actions or supplies a preliminary classification. Deterministic code checks exact invariants. A deeper investigation handles ambiguity. The workflow defines budgets, permissions, escalation, and what counts as sufficient evidence. People receive the questions that still need their contribution.

That is the niche worth exploring: a fast decision component inside a well-managed testing system. It does not need to replace every model or own the release decision to be significant. Give it the right work, keep its uncertainty visible, and use the time it saves to earn more confidence.

Source: Adapted from my article, “I Put Jev in a Browser Testing Loop. Here’s What It Actually Did,” and its recorded storefront experiment. Product API reference: https://docs.typesafe.ai/api .

Notes, sources, and errata

Keep a project-local record of prompt changes, redacted evidence, and corrections discovered while applying these techniques. The examples in this book are starting points for that living record, not a substitute for the rules and evidence of your own product.

Appendix E - 15 Myths About AI and Testing

There are good reasons to ask hard questions about AI in testing. We care about reliable results, useful coverage, security, and the confidence to release software people can trust. A new tool doesn’t get a free pass on any of those things.

But some concerns have turned into blanket statements about what AI cannot do. Those statements deserve testing, too.

I’ve spent a lot of time experimenting with AI for software testing. I’ve seen it fail, and I’ve seen it do work I would once have assumed needed a person. I’ve also seen it come up with smarter solutions than mine and accomplish things I couldn’t have done myself. The practical question should be: How can we reliably apply AI to software testing problems? Test the proposed limitation with the same care as the proposed capability.

The cognitive-bias notes are reminders for designing fair comparisons, not explanations of a critic’s motives. Naming a bias does not settle a technical question. Each claim still needs evidence, and the same standards apply to AI advocates, including me.

Here are 15 common myths, and a more productive way to approach each one.

1. “Different answers make AI impossible to test.”

Testing already deals with variability: timing, intermittent failures, changing data, and unpredictable user behavior. Who hasn’t built or run flaky tests? Those are non-deterministic. People are non-deterministic, and AI introduces more non-determinism, but it can actually be an advantage. It doesn’t mean it’s not useful for testing at all.

Run repeated trials against defined criteria. Look at the distribution of results, the severity of failures, and the uncertainty in your measurements. A score with an appropriate confidence interval tells you more than one green check.

I cover these methods in the book Testing AI: Engineering Confidence in Non-Deterministic Systems. You don’t have to become a statistician overnight. Start with a small experiment, and use AI to help with the analysis. Just make sure the analysis respects how the samples were collected.

Related cognitive biases: Algorithm aversion can lead us to reject imperfect AI while accepting comparable human errors. Ambiguity aversion can make unfamiliar uncertainty feel less acceptable than familiar uncertainty.

Non-determinism changes the test design. Repeat the task, measure the variation, and define which differences matter. Test the distribution of outcomes instead of demanding that every answer be an identical string.

2. “AI is too slow.”

An individual model call can be slower than a conventional assertion. That doesn’t tell you how long it takes to get an answer your team can confidently act on.

Include test creation, execution, failure investigation, and maintenance in the comparison. A fast suite that produces an afternoon of confusing failures isn’t giving you fast feedback.

Keep deterministic checks where they work well. Use AI where interpretation or exploration adds value, and run independent work in parallel. Put quick checks in the commit path and deeper investigation in a separate lane. Every test doesn’t need to run the same way or at the same time.

AI is speeding up dramatically. People aren’t speeding up at anything like that rate. For example, Anthropic reported that Haiku 4.5 delivered similar coding performance to Sonnet 4 at twice the speed. Today’s latency is a measurement to improve, not a permanent limit.

Related cognitive biases: Anchoring can keep attention fixed on the duration of one model call. The Einstellung effect can keep an established testing workflow from being reconsidered, even when a different approach improves total turnaround time.

3. “AI tokens are too expensive.”

The $100 token bill is visible. The $100,000 salary is not. The hours spent maintaining tests and investigating misleading results are often much harder to see.

Compare the total cost of ownership (TCO), not just the token bill. Include model usage, infrastructure, test creation and maintenance, failure investigation, and the cost of missed defects. Then measure the total cost of getting useful, trustworthy results.

Also, try more than one model. A small, focused testing judgment doesn’t automatically need the largest reasoning model. In my experiments, smaller models are often better suited to testing-related judgments. They can also cost five to ten times less than larger models. Choose based on measured performance, not the size of the model’s reputation.

Token costs for comparable capability have been falling at rates of 10× a year or more. Stanford’s 2025 AI Index documented a more than 280-fold reduction in the cost of GPT-3.5-level performance between November 2022 and October 2024. That’s a measured historical decline, not a promise that every model’s price falls on the same schedule. Don’t build your cost argument around a frozen price tag.

Related cognitive biases: Mental accounting can make us treat tokens as a new expense while putting existing labor costs in a separate mental bucket. The result is an incomplete comparison rather than a total-cost decision.

4. “You can’t audit an AI test.”

You can require an AI testing workflow to record its test criteria, actions, observations, and evidence. Record the relevant software and model versions, too, so the result has context.

Ask for a concise explanation connecting each verdict to the evidence. An explanation alone isn’t proof: screenshots, API responses, execution logs, and explicit assertions do the supporting work.

The difference in effort matters, too. In my experience, building this level of audit documentation with procedural code takes months. With AI, it takes hours, and the audit record is richer: more context, clearer explanations of what was checked and why, and a documented basis for each verdict. You’re not just producing the same logs faster. You’re getting a more useful account of the testing.

I’ve heard directly from medical companies that undergo regulatory audits: their AI-driven testing produces better audit records than their own legacy test automation. For those teams, this isn’t a theoretical benefit. It’s an improvement they’ve seen firsthand.

Done well, this produces a more useful record than a pass count with no explanation. Auditability is something to design into the workflow, not something to assume either AI or conventional automation provides automatically.

Related cognitive biases: Belief perseverance means holding onto a belief despite contrary evidence. Combined with status quo bias, it can mean rejecting AI audit records without applying the same scrutiny to familiar automation.

5. “Modest productivity gains are the best we can expect.”

A productivity result describes a particular team, task, and workflow. It doesn’t establish the ceiling for every other application.

Often, modest gains come from adding AI to an existing process or product while leaving the underlying approach unchanged. If an agent generates tests in minutes but those tests spend a week waiting for manual processing, the waiting time still dominates.

Try starting the process or product from scratch with AI at its core. In my experience, you’ll almost always see dramatic improvements when you rethink the work instead of simply adding AI to the way you’ve always done it.

Try a complete, bounded assignment: run the project, investigate its behavior, reproduce issues, and report the evidence. Measure time to useful findings and verified coverage, not just how much test code appeared. That’s a better starting point for understanding the opportunity.

Related cognitive biases: Anchoring can turn an early productivity estimate into an assumed ceiling. Functional fixedness can limit a new tool to familiar uses instead of allowing a redesigned process.

6. “AI testing its own code is just grading its own homework.”

This concern points to a real risk: tests can repeat the implementation’s assumptions. But that doesn’t make AI incapable of finding defects in code it generated.

In my experiments, the reality is almost embarrassingly the opposite: AI generates bugs that it can then find when you ask it to look for them. The frustrating part isn’t that it cannot recognize its own mistakes. It’s that it produced mistakes it was capable of detecting. That makes a separate testing pass more important, not pointless.

Give it a separate testing assignment. Provide requirements and examples of correct behavior. Ask it to challenge the implementation and produce reproducible findings rather than defend the code.

A fresh session or another model can offer another perspective, but neither replaces a clear source of expected behavior. Compare the findings with an independent review. The useful question is how well the testing worked, not whether the same tool participated in development.

Related cognitive biases: Anthropomorphism is the related tendency to assign human traits to a nonhuman system. Assuming an agent is emotionally attached to its code imports a human explanation without establishing it. Shared technical assumptions remain a real risk to test.

7. “An agent will just change the tests until everything passes.”

If you’re letting an agent weaken tests to make broken code pass, then accepting the green checks as proof that it works, you shouldn’t be using AI that way. You should lose your AI driver’s license until you learn to distinguish fixing a defect from hiding one.

That said, it can look like this is happening, and you can explicitly ask an agent to change tests to match an implementation. Sometimes a test genuinely needs updating. The question is whether the change follows the intended behavior or simply makes the failure disappear. Inspect the change instead of assuming a green result means the problem is solved.

Keep those responsibilities separate. Protect agreed expectations, and make changes to them explicit decisions.

Here’s a useful instruction:

Prompt

Find and reproduce defects. Do not modify the application or weaken existing assertions. Derive expected behavior from the requirements. If a test appears incorrect, explain why and propose a separate change for review.

You can also ask the agent to critique its own coverage before declaring the work complete. Good testing instructions reward investigation, not merely a green result.

Related cognitive biases: Confirmation bias can make someone collect examples of weakened tests while overlooking workflows that prevent or detect the problem. Availability bias can make a memorable failure seem inevitable. Neither makes the underlying failure imaginary.

8. “AI can never understand our business context.”

Ironically, the first step should be to ask the AI what it knows about your business. In my experience, an agent with access to relevant sources often brings more high-level business context than an individual test or software engineer. How many engineers have read the company’s S-1 filing, studied its competitors, or analyzed competing apps? Ask the agent to investigate those sources, explain the business context, and show where its conclusions come from. Don’t assume the person automatically knows more.

If the AI still lacks context that you have and haven’t shared, that’s a gap in how you’ve equipped it, not proof that it cannot understand the business. Providing that context is straightforward: add specifications, designs, decision notes, and meeting recordings or transcripts you’re authorized to share. In my experience, AI does a great job of bringing that material together and applying it to the testing work.

Ask it to summarize the business goals, important customer journeys, constraints, and unresolved questions before it starts. Correct any misunderstandings and supply what’s missing. Experienced QA experts add value by making the important context available, not by keeping it in their heads and assuming AI could never use it.

Access to context doesn’t require permission to change production. Use appropriately scoped information and a safe test environment.

Related cognitive biases: Overconfidence can make us overestimate our own business knowledge and underestimate what an equipped agent can establish. Compare the actual understanding and its supporting sources, not the confidence of the speaker.

9. “Prompt sensitivity makes AI too fragile to use.”

Ask a person to do the same task on four different days: go get a coffee at Starbucks. Measure how long it takes, the path they take, and the temperature of the coffee they bring back. Watch how differently they behave each time. The person and the environment both vary, yet nobody concludes that people are therefore incapable of getting coffee.

Some of this criticism looks like projection: we overlook variability in ourselves while treating it as disqualifying in AI. Ironically, on models that expose the controls, lowering temperature and adjusting other sampling settings can make the output more predictable and consistent—almost too consistent when you want varied exploratory ideas. That reduces sampling variability; it doesn’t guarantee identical results or correct answers.

A change in wording shouldn’t silently change an important acceptance criterion. But different wording or exploration paths can also reveal different problems.

Be clear about the objective, context, boundaries, and evidence required. Keep exact calculations and fixed business rules in deterministic checks where appropriate. Use AI for the interpretation and exploration that benefit from flexibility.

This book shows many examples of how to use AI to test software—particularly how to leverage its ability to handle varying and ambiguous results and outcomes. Ironically, that flexibility can help AI carry out the same task even when different people ask for it in different ways.

Long tasks also need manageable stages and reliable records of decisions. Rather than searching for a perfect prompt, build a workflow that can detect when the agent loses track and recover without losing the test’s intent.

Related cognitive biases: Algorithm aversion fits the double standard of tolerating variability in people but treating it as disqualifying in AI. Ambiguity aversion can amplify discomfort with uncertain outputs. Neither removes the need for stable acceptance criteria.

10. “A small AI demo can’t scale to enterprise testing.”

This is also a straw man argument when it treats the claim as “a quick AI demo should scale to enterprise workloads without further engineering.” That’s not the claim. AI can support enterprise testing; nobody gets to skip system design just because AI is involved.

A demo doesn’t establish enterprise readiness. It doesn’t establish that scaling is impossible, either. That’s equally true of non-AI software: a small demo built with conventional code doesn’t automatically scale to enterprise workloads. This is a software engineering challenge, not a limitation unique to AI.

Growing a testing system requires deliberate choices about environments, test data, concurrency, cost controls, reporting, and failure recovery. Those requirements exist with or without AI.

Start with a representative workload. Increase the scale, measure where it breaks, and improve the design. AI can help generate scenarios and analyze results, while the team ensures the overall system remains understandable and dependable.

Related cognitive biases: Status quo bias can make familiar software seem capable of improvement while a new approach’s limitations seem permanent. Belief perseverance applies when that conclusion survives evidence of successful scaling.

11. “AI-generated tests will overwhelm our reviewers.”

What a fantastic world we live in: we’re worried about having too much test coverage. More generated tests don’t automatically mean more coverage, but the opportunity to explore more behavior is something to welcome.

We also need to rethink what we dismiss as a duplicate. The value of an additional test depends on its creation, execution, and maintenance costs, weighed against its chance of finding a new error and the importance of that error. If AI makes those costs 10× lower in your workflow, the economics change. A variation that once wasn’t worth maintaining can become worthwhile. Loosen the old rejection criteria for similar tests, and put genuinely untested functionality near the front of the queue. Keep removing exact copies that add no useful information.

The bigger issue is sampling and statistics. The way to evaluate a large population isn’t to have a person meticulously read every item. Surveys and polling work by examining samples. Testing can use the same principle: inspect a well-designed sample of tests and execution evidence, estimate the error rate, and quantify the uncertainty. Increase scrutiny where the results or risks warrant it. Sampling builds evidence about the population; it doesn’t certify every individual test or replace targeted checks for rare, severe failures.

This isn’t a new scaling problem. Google describes evaluating Search changes using samples of queries, alongside live experiments. Large-scale search and AI evaluation don’t depend on a person inspecting every possible output. The statistical methods exist. A process built around manually curating every test simply hasn’t made that transition.

Use AI to review changes, identify missing evidence, group related concerns, and summarize risk. Combine representative sampling with deeper expert review of consequential changes and uncertain findings. Scale the review process along with generation, rather than making people the bottleneck and calling that an AI limitation.

Related cognitive biases: The Einstellung effect can lock us into reviewing every item manually because that is how we have always worked. Anchoring can also preserve old thresholds for accepting additional tests after their economics change.

12. “AI-generated code makes security worse.”

People wrote insecure software long before AI coding agents arrived. Some of the most damaging vulnerabilities we’ve dealt with came from human-written code. Human authorship is not a security guarantee.

Ask AI to write highly secure, robust code, not just a working demo. Give it explicit security requirements, trust boundaries, and abuse cases. Then have it attack its own assumptions and test the implementation. Asking for security matters; verifying it is what establishes whether the result meets the requirements. If AI coders aren’t requiring AI to review the code it generates for security, they should probably lose their AI coding license, too.

For me, one of the strongest uses of AI is security testing of both human-written and AI-generated code. In my experience, it makes that work faster and more thorough, and surfaces issues people missed or wouldn’t have found in the time available. Use it to inspect code, trace data flows, investigate authorization boundaries, and reproduce suspected vulnerabilities in an authorized environment. Combine that work with established security tools and verify the fixes.

The irony is that worrying about security should push you toward using AI more thoughtfully and extensively, not avoiding it. If you’re using AI to generate code but not to challenge its security, you’re leaving one of its most valuable capabilities unused.

Related cognitive biases: Availability bias can let vivid AI security failures dominate the comparison. Negativity bias can give those failures disproportionate weight while improvements in detection receive less attention. Measure both sides.

13. “People will blindly approve whatever AI produces.”

This is a genuine adoption risk. It is also something teams can address directly.

If people are blindly approving AI-generated code, they shouldn’t be allowed to use AI until they demonstrate responsible review. And ask whether they’re doing the same thing with human-written code. Blind approval is deeply concerning regardless of who—or what—wrote it.

Require evidence before approval. Distinguish a proposed fix from an executed check and a verified repair. Make remaining gaps visible.

A reviewer should be able to answer: what changed, what was checked, what happened, and what still needs attention? Design the workflow around those questions. A persuasive explanation should never substitute for a result.

Related cognitive biases: Automation bias is the tendency to over-rely on automated recommendations. Here it describes the behavior being criticized, not necessarily a bias in the critic. It is a genuine risk to control; it doesn’t establish that responsible AI use is impossible.

14. “Agents are too dangerous to put in a test environment.”

Reports of agents escaping their intended boundaries deserve serious attention. But read the incident details before deciding what failed. Was there an actual sandbox, or just a loosely restricted environment? Were credentials exposed? Could the agent reach systems it was never supposed to touch? A poorly designed sandbox is an infrastructure failure, not proof that capable AI cannot be used safely. Ironically, human-designed controls deserve scrutiny too.

I expect containment to improve dramatically as this work matures. On September 28, 2026, NVIDIA announced its Open Agent Safety Platform, including the OpenShell secure runtime for enforcing agent boundaries. That’s a concrete example of investment in stronger controls, not proof that any sandbox is escape-proof. Compare those controls with your existing non-AI test environment rather than assuming the old environment is safer. My assessment: this runtime environment is very likely more secure than what you’re using today, whether you’re working with human-written code or AI coding agents.

Part of the challenge is precisely that capable agents are resourceful and effective. Those qualities are valuable in testing, and they also make weak boundaries more consequential. The response should be stronger containment: limited permissions, isolated test data, controlled network access, and environments that can be reset. Enforce those controls outside the prompt. Instructions are not a sandbox.

Are we really going to choose less capable testing because the more capable system exposes weaknesses in our containment? Build better sandboxes and test them. If the boundaries aren’t adequate yet, hold that particular execution until they are. Don’t turn a solvable engineering requirement into a blanket argument for worse testing.

Related cognitive biases: Availability bias can make a highly publicized escape dominate our assessment. Neglect of probability can make the frightening outcome eclipse its likelihood under specific controls. Refusing an inadequately contained execution is still sound risk management.

15. “Strategy and risk evaluation must always be done entirely by people.”

People often declare that strategy and risk evaluation must remain entirely human without ever comparing the work. Before accepting that conclusion, ask what they tested.

Here’s an experiment. Use a modern frontier model and select high reasoning effort where available. Give it access to your code, relevant documents, and business context. Ask it to create a testing strategy. Give the AI 15 minutes. Give yourself a week to independently write your own, without reading its answer first.

Then compare the documents. Better yet, remove the author labels and have somebody independent assess them against the same criteria: important risks identified, business relevance, priorities, feasibility, and missing coverage. Which strategy would actually help the team? Record the time spent, too. Don’t decide the winner before looking at the work.

Even if you prefer your own strategy, the AI will often identify useful ideas you didn’t consider. Borrow them. You can remain in control without insisting that every good idea originate with you. Apply the same experiment to risk analysis.

At a conference last week, I asked a full room how many people had used AI for risk analysis. By my rough show-of-hands estimate, only about 2% had. Those who had tried it described being very happy with it and amazed by the results. That makes me want more people to try the exercise, not rule it out before starting.

When someone asserts that people produce better strategies or risk evaluations, ask for the comparison, the original artifacts, and their timestamps. Did the evidence exist before the assertion? A comparison created afterward can be useful new evidence, but it doesn’t establish that the original claim was tested. If someone repeatedly makes categorical claims without data, be cautious about the next one.

Accountability and analytical ability are different questions. An accountable owner can use AI to develop and challenge a strategy while retaining responsibility for the decision. You don’t have to hand over control to benefit from better analysis. Test the contribution, use what improves the work, and keep the responsibility clear.

Related cognitive biases: Overconfidence and algorithm aversion are reasons to blind the comparison where possible. Judge the quality of the strategy and its evidence before revealing whether a person or an AI produced it.

Ask for the evidence.

A categorical claim needs more than a confident speaker. Which model and version were tested? What context, tools, and permissions did it have? What task did it attempt, and what counted as success? Can we inspect the original artifacts and reproduce the result?

Compare useful findings, important misses, false alarms, review effort, elapsed time, and total cost. A spectacular failure deserves investigation. So does a substantial improvement. Neither one settles every other task.

Apply the same standard to AI vendors, critics, enthusiasts, and me. Disclose commercial interests, but judge the claim by its evidence—not by guessing what the speaker wants to be true.

People make career and investment decisions from this advice. Confidence, seniority, and a familiar name are no substitute for evidence. Test the claim before you repeat it.

Let’s test the assumptions together

You don’t need to be unconditionally optimistic about AI to use it well. Curiosity and a fair experiment are enough to start.

Pick a testing problem you know well. Give an agent the context and a meaningful assignment. Compare the reproducible findings, important misses, false alarms, time, and cost with your current approach. Have someone else review the comparison where you can.

As Joe Colantonio says on the TestGuild podcast, “Test everything and keep the good.” That includes the claims people make about AI. Test them yourself, or ask the speaker how they tested them and what evidence they found. If you want to be a good tester and quality engineer in the world of AI, apply that discipline to the advice you hear—not just the software you test.

We all want the same outcome: software that works well for the business and the people using it. AI gives us more ways to pursue that goal. Let’s put the same care into evaluating those possibilities that we put into testing everything else.

Appendix F - Why the Testing Tool Stack Changes

The Introduction leads with a useful test. This extended argument preserves the supporting comparisons, sources, and implications for readers who want to examine the broader shift.

The testing tool stack is being subsumed

Here is the deliberately assertive thesis of this book: AI is already subsuming testing frameworks, hard-coded CI/CD workflows, test-management systems, issue trackers, result repositories, fixed reporting dashboards, and most human-based testing practices as the reasoning surface of software quality. People can argue about the timetable. The direction is obvious. Browser and device access, protocols, sandboxes, sensors, logs, and storage still exist underneath. The human-shaped framework, fixed pipeline, and separate system of record stop being the place where the test means something. They become temporary generated machinery or an export created because somebody still needs one.

That distinction matters. A Selenium suite, a fixed CI/CD pipeline, a JIRA project, a TestRail instance, and a custom dashboard are human abstractions. They translate product intent into artifacts that people can read, customize, sort, hand off, and maintain. That was rational when people had to hold the system in their heads. It is increasingly the wrong architecture when an agent can read the code, requirements, change, historical evidence, environment, and live behavior together, generate the right procedure on demand, operate the needed tool, revise the plan as evidence changes, and retain the result with provenance.

Much of the human labor around those abstractions can shrink too. Consider the recurring work:

  • Turn feature requests into manual cases, scripts, selectors, and fixtures.
  • Launch regressions, watch runs, and collect screenshots, logs, and traces.
  • Compare results, deduplicate findings, and copy them into tickets.
  • Maintain inventories, spreadsheets, dashboards, and status reports.
  • Explain the same product and failure to the next person in the chain.

These activities coordinated a human-paced delivery system. A Harness can reduce that work by retaining context, executing tests, preserving evidence, and challenging its conclusions. It can produce a human-readable view when someone needs a decision—or a machine-readable record when the next step is automated.

An authorized loop may close with agents talking to agents, without a person handling every step. That does not remove human responsibility for the operation. People still supply decisions and consequence assessment where capability, policy, or delegated authority requires them.

Keep the evidence and accountability. Reduce the repeated translation work.

Computing has made this move before. Languages such as C and Python hide lower-level mechanics so people can manage complexity. Agents can move another layer of mechanics out of the tester’s daily work by generating implementations suited to the product.

The abstraction does not vanish; it moves up. Preserve what matters: the customer promise, the risk being tested, the evidence required, and who may act on the result.

Selectors, procedural scripts, ticket fields, and dashboard queries are ways to carry out that work. They can be regenerated when the product changes without discarding the test’s purpose or its evidence obligations.

Chapter 7 develops the abstraction ladder with a payment example and diagram. The reusable intent sits above the implementation; the evidence obligations survive changes to the machinery underneath.

There are four reasons this change happens now.

1. AI does not need the old human artifacts to reason

A general issue tracker is optimized for people typing a compact description into fields and then sorting that data imperfectly for another person. A test-case manager is optimized for people authoring procedures, maintaining variants, and deciding what resembles a duplicate. A dashboard is optimized for a fixed set of questions someone had the budget to code months earlier. In an AI-native delivery loop, the system can preserve a richer evidence record and generate the bug view, test view, executive summary, regression plan, or coding-agent fix prompt when it is needed.

This is not a suggestion to delete JIRA tomorrow. During the transition, JIRA, Xray, TestRail, spreadsheets, and compliance systems may still be required for ownership, audit, contracts, or collaboration. But the long-term architecture is not an AI translating its work into ticket-shaped fields so another human-shaped system can store it. It is the agent retaining the relevant evidence and history, then generating an issue, report, or audit record only when a particular audience or obligation requires one. Forcing agents to think through ticket-shaped fields and framework-shaped procedures is like forcing a compiler to communicate through a typewriter.

2. The investment asymmetry is absurd

Most testing tools were built and maintained by small teams with a necessarily narrow mandate: ship a runner, sell a platform, support integrations, and add the next requested feature. Even widely used open-source projects evolve through finite contributor attention. Meanwhile the largest and most sophisticated software companies in the world are investing extraordinary capital, compute, research, and engineering effort in general-purpose agents that can read code, use tools, understand language and images, and make decisions across whole workflows.

Put numbers on it, while being precise about what they measure. In the twelve months ending August 29, 2026, 56 non-bot GitHub accounts authored commits to SeleniumHQ/selenium, the public Selenium repository. That is a reasonable operational definition of active contributors for this comparison; it is not a count of every person who has ever contributed, reviewed, triaged, documented, or maintained Selenium. An external June 2026 analysis of public LinkedIn profiles identified 1,680 people in engineering roles at Anthropic. That is not an Anthropic-disclosed engineering headcount, and it should be treated as a dated outside estimate rather than a company filing. Even with those definitions kept honest, the imbalance is enormous: a mature testing framework is evolving through dozens of visible active contributors, while a frontier-model company is fielding an engineering organization measured in the thousands. The underlying Anthropic profile analysis is here.

Every frontier model is not automatically a good tester. The larger point is that the intelligence layer above testing is improving far faster than the ecosystem of bespoke testing abstractions below it. A team no longer has to wait for a vendor to add a report, adapter, selector healer, page-object convention, or workflow screen. The agent can assemble a project-specific version from the actual product context.

3. LLMs are unusually close to what QA and testing does

LLMs are built to replicate human-like understanding, communication, judgment, and interaction. They are trained predominantly on the residue of human activity—our language, code, images, video, documents, conversations, instructions, decisions, and descriptions of the world—and then optimized to continue, interpret, and act within those patterns. That is extraordinarily close to the work of a tester: emulate a user, defend a user, understand a user’s goal, notice when software creates confusion or harm, and judge whether the result makes sense.

Traditional automation is excellent when the question is mechanical and known in advance. An agent adds the ability to look at a page and ask whether it still looks usable after text enlargement; to read logs and network evidence beside the screen; to invent a plausible recovery path; to use a persona’s constraints; and to challenge a conclusion in ordinary language. It brings the human-facing part of testing into the same system that can operate the software.

4. The economics are overwhelming

AI does not have to win every individual comparison to change the economics. It can inspect more states, rerun more variations, correlate more artifacts, and draft more candidate tests than a human team could ever afford to maintain by hand. Human labor is not getting ten times cheaper every year. It usually gets more expensive. For comparable model capability, token pricing has been falling by roughly an order of magnitude per year, while caches, harnesses, and execution infrastructure keep getting faster. One widely cited analysis describes the trend as approximately 10x lower inference cost per year for equivalent performance. The exact number moves around by product, model, evidence burden, and talent. The order of magnitude is the useful part.

That creates a testing version of Jevons paradox. When the unit cost of a quality activity drops, total spend or token use can look as though it is rising because teams suddenly run far more checks, explore more states, repeat more paths, and test systems that they formerly left untested. The relevant measure is not aggregate tokens. It is cost, time, and evidence per meaningful verification: per privacy inspection, per accessibility reflow, per tested recovery path, per reproduced issue, per unit of credible release confidence. Falling unit cost expands the amount of quality work worth doing.

At Google, even on the products I worked on, we did not have this much QA bandwidth or this much testing power at our disposal. We had far less. The scarce resource was not only machines or money; it was the small number of people who could understand a complicated system, imagine a failure, inspect uncertain evidence, and form a useful judgment. Now the capabilities of many of those talented people are bundled into a single LLM and made available to every small team, independent builder, school, nonprofit, and startup. That is profoundly democratizing.

Test nerds have always asked, “Who tests the tests that test the tests?” Under a human-only cost model, the honest answer was usually: not enough people, not deeply enough, and not often enough. AI makes the recursive version practical. An AI Test Harness can test the application, challenge the generated AI Tests, inspect the framework or adapter that ran them, analyze the evidence bundle, question the result classification, compare run-over-run behavior, and look for unsupported confidence claims. It can do this with independent prompts, different models, specialist roles, and explicit disagreement. The loop is not magically infallible; it is simply much more affordable to make the quality system itself a first-class test target.

Most testing should not automatically use a frontier model. Routine regression verification, structured extraction, log classification, screenshot comparison, deterministic policy checks, and ordinary execution usually work well with older, Flash-class, compressed, or otherwise economical models. They are cheaper and faster. Sometimes they are better because they do not turn an obvious assertion into a speculative theory. Save frontier reasoning and higher temperature for creative exploration, unusual boundaries, difficult diagnosis, adversarial challenge, ambiguous product judgment, or novel fault injection. Route by risk and purpose, not prestige.

Once useful evidence costs orders of magnitude less to generate, a human-era optimization for minimum test cases and minimum artifacts stops making sense.

You can buy a gold-plated Rolls-Royce. Most people drive a Toyota; many people ride a bike. The winner is not always the theoretically best machine. It is the one that delivers enough value, reliably, at a cost and speed the world can actually use. AI-native testing wins first because it can make far more validation practical. It wins completely only when it remains evidence-bound, skeptical, safe, and accountable to the authority model that governs the work—human judgment where that is required today, automated judgment where it becomes sufficiently capable and authorized.

Appendix G - CARBON: Installation and Workflow Reference

CARBON is the reference AI test harness used throughout this book. It turns a testing request into an investigation: identify risks, select useful checks, operate the application, retain evidence, and explain what to do next. You can start inside your coding agent, inspect the work in a visual workspace, and use cloud execution when the work needs more infrastructure.

Start with the plugin directory

The easiest place to start is the plugin directory in your AI coding agent. Search for CARBON and check that the publisher is testers.ai. Review the requested permissions, install the matching package, enable it, and start a fresh task. Browse the Claude plugin directory, the OpenAI/Codex plugin directory available in your host, or your host’s MCP directory when it supports that connection route. Listing visibility depends on the host, account, organization, and package; do not assume every directory exposes the same build.

Claude’s directory installation is documented on the CARBON installation page. If you cannot find the official listing in your directory, that page is the fallback for current packages and instructions. A Codex plugin, a ChatGPT app, and a bare MCP server are not interchangeable installations. An MCP listing connects tools; the host may still need the CARBON skills and a supported execution environment.

The experience I am encoding into CARBON

CARBON is my effort to put this book to work. I am encoding its ideas, along with everything I have learned and experienced in software testing, into a harness that can apply those lessons to the product in front of it. It is not just a collection of prompts. It is my attempt to turn years of testing judgment into useful, repeatable work.

My background spans Google and Microsoft, including work on the Chrome browser, Bing and personalized web search, SQL Server, WinFS, Windows CE and embedded systems, and BizTalk Server. Those products taught me very different things about testing: browsers, search, databases, operating systems, and enterprise integration do not fail in the same ways.

As head of engineering and product at Applause, also known as uTest.com, I helped build infrastructure for testing hundreds and hundreds of different kinds of applications. That changes your perspective. You stop thinking only about how to test one product and start thinking about what a testing system must understand across many products and teams.

At Test.ai, our customers included Microsoft, Google, and Epic Games, including work involving Fortnite. We built lights-out testing labs that automated thousands of Android apps, as well as Xbox games and Xbox Cloud Gaming experiences. The challenge was not maintaining one perfect script. It was getting AI to discover, operate, and test software at a scale where handcrafting every interaction made no sense.

I have worked to bundle those lessons into CARBON: how to explore an unfamiliar application, identify risk, gather evidence, investigate failures, and decide what deserves attention next. The goal is simple. You should be able to benefit from that experience by asking for the testing work, without having to recreate the infrastructure—or repeat all the mistakes—that taught it to me.

Jay AI Test Manager and the specialist team

Meet Jay AI Test Manager in CARBON. Testers.ai introduces Jay as the world’s first AI test manager. Jay coordinates the investigation: understand the intent, rank the risks, select specialist work, connect the evidence, and make the next useful action clear. Its approach is modeled on mine; it is an AI manager, not a human reviewer.

Jay is the top-level coordinator. The box beneath him contains the specialist team. They share project context but ask different questions: security can involve OWASP and privacy; checkout can involve cart state, pricing, accessibility, and recovery. Jay connects their evidence.

Figure G.1. Jay coordinates one team of 24 specialist AI perspectives. The compact grid names their focus areas; an icon represents an available role, not proof that its checks ran.

The workflows behind the commands

A prompt can request a test. A workflow keeps track of the work until there is a defensible result. CARBON can sequence dependent steps, fan independent specialist tasks out in parallel, collect their evidence, challenge findings, and decide what to do next. The shared state ties every step back to the original intent.

Long-running workflows can continue for hours, or across days through resumed checkpoints, when the host, tools, permissions, and budget support that duration. They retain completed, blocked, deferred, and remaining work rather than restarting from a blank chat. A closed host session, exhausted quota, unavailable tool, or approval boundary can pause the work; saved state is not a promise of unattended execution.

Use the ongoing loop to explore more deeply, not merely to repeat a happy path. Jay can send an accessibility question and a privacy question to separate specialists, wait for a prerequisite such as a synthetic account, then bring the results together for skeptical review. Findings can return to the coding agent for authorized repair and retesting.

CARBON command reference

This reference is checked against the current CARBON source and related workflow packages on 2026-10-10. Commands are grouped by the work they do, without pricing tiers. Availability and syntax still depend on the installed package and host: Claude may prefix a command with its plugin name; Codex may expose it as a skill such as $carbon-test. Use the host command picker for the exact invocation.

The Feedback entry point and CARBON Studio workspace are identified separately because installing one package does not automatically install every integration. A directory listing, an installed command, and an authorized external service are three different things.

Start and keep testing

Run a bounded assessment, narrow it to one behavior, or continue the investigation. Auto adds authorized fixes and retests; Forever keeps discovering until stopped or limited.

/jay Talk directly to Jay, the AI test manager, about risks, results, and the next useful action. /j is a short alias; a question does not automatically start testing or authorize fixes. Aliases in supported hosts: /j.

/carbon Run a broad, risk-ranked assessment with recorded evidence. It selects useful checks from the target and context, then separates observed failures, passes, and evidence gaps in a durable report.

/carbon-help Choose the smallest useful workflow for the project. It uses the project’s state and your question to recommend a focused next step, so you do not need to memorize this catalog.

/carbon-demo Create and assess a disposable practice application. It gives you an isolated place to see the full investigation and evidence loop before pointing the harness at your own work.

/carbon-test Test one named feature, flow, API, or behavior. It keeps scope tied to the named behavior and records reproducible actions, observations, and untested boundaries.

/carbon-issues Hunt bugs through source inspection and stateful journeys. It combines directed investigation with open-ended discovery, then confirms candidates before calling them bugs; it does not automatically fix them. Aliases in supported hosts: /issues.

/carbon-more Continue the highest-value checks deferred from a prior pass. It reuses the previous candidate pool and evidence to avoid restarting the same shallow assessment.

/carbon-auto Run a bounded, authorized test-fix-retest loop. It preserves a durable sequence of testing, approved repairs, and verification so a repair proposal is not mistaken for a verified fix.

/carbon-forever Keep discovering and expanding coverage; requires two confirmations. It checkpoints intent, coverage, and findings across repeated cycles. Time, cycle, host-session, and quota limits still apply; stopping discovery does not erase its evidence.

/carbon-browser Exercise a page or journey with an approved local browser. It uses the coding agent’s available browser controller and retains the journey evidence, rather than treating a successful click as a passed test.

/carbon-background Configure, pause, or inspect bounded local checks after code changes. It requires opt-in and supported host hooks; background checking does not automatically approve fixes or live-site traffic.

Map, plan, and understand

Connect the product map, human context, and persona perspectives to the questions that matter. Confidence work repeatedly investigates and challenges those questions instead of merely producing a score.

/carbon-map Inspect the product through its screenshot and evidence map. Notes, priorities, and custom checks can steer the next investigation; compare available saved builds without confusing a screenshot map with complete coverage.

/carbon-personas Explore goal-driven persona feedback and user friction. It creates goal-driven AI perspectives and, where authorized, exercises their journeys. Simulated reactions remain distinct from actual human feedback.

/carbon-confidence Investigate, challenge, and reassess consequential quality questions. It follows a loop of questions, investigation, skeptical review, and reassessment, making the evidence behind a recommendation inspectable.

/carbon-human Retain human decisions and business context that testing needs. It asks only questions whose answers could change the work, such as acceptable risk or the intended business rule. Explicit human answers are retained and reused, not guessed by the model.

/carbon-full-report Show the complete quality record, outcomes, findings, and trends. It joins tests, results, findings, history, and human context into one view so the reader can follow a conclusion back to recorded work.

/carbon-stats Review recorded activity, model usage, and measured economics. It exposes measured activity and cost where available, and labels estimates rather than presenting guessed savings as observed returns.

/carbon-studio Open the visual testing workspace in a host with the CARBON Studio package installed. Inspect the evidence map, findings, and next actions alongside the coding agent rather than reconstructing them from chat.

/carbon-pro Open the product information and pricing page. This is a navigation shortcut: it does not run tests, install anything, or authorize a purchase.

Bring people into the loop

Human decisions and external reviews serve different purposes: one supplies missing product context; the other brings back observations about selected work.

/feedback Request human review through the Feedback plugin: bundle the selected artifact and approved context, queue it, and route it to the chosen reviewers. Replies return to the originating coding-agent task through configured synchronization; the developer sees the feedback there and can authorize the agent to investigate, fix, and retest.

Interface and user experience

Combine visual evidence with real interaction when needed. A layout observation, an accessibility barrier, and an end-to-end usability problem need different evidence.

/carbon-functionality Verify intended behavior, boundaries, and failure cases. It follows the intended product promise through normal, boundary, and failure cases, tying findings to observable behavior.

/carbon-ui Find visual, layout, and interface consistency issues. It inspects rendered states for overlap, clipping, alignment, and inconsistent visual behavior, with evidence at the relevant viewport.

/carbon-ux Examine end-to-end journeys and customer expectations. It connects individual interactions to the customer’s whole goal, including misleading progress, dead ends, and recovery.

/carbon-usability Investigate discoverability, clarity, and task completion. It investigates whether a person can discover, understand, and complete the task, rather than simply whether every control responds.

/carbon-accessibility Check inclusive interaction and gather accessibility evidence. It combines available source, keyboard, zoom, semantic, and visual evidence. Automated findings contribute to assessment; they are not a blanket conformance certificate.

/carbon-compatibility Check supported browsers, devices, and environments. It compares behavior across the supported matrix and reports which combinations were actually exercised instead of extrapolating from one browser.

/carbon-content Review wording, consistency, clarity, and content quality. It checks claims, labels, instructions, and error messages against their context; unsupported factual claims stay questions until evidence settles them.

Security, privacy, and data

Follow information across trust boundaries, storage, APIs, and sessions. Preserve enough evidence to distinguish a demonstrated failure from a suspicion.

/carbon-security Investigate security weaknesses and access boundaries. It traces access and trust assumptions and seeks a bounded reproduction. Consequential probes need an authorized target and scope.

/carbon-privacy Inspect personal-data exposure, consent, retention, and deletion. It follows personal data through collection, use, sharing, and retention, correlating visible consent choices with the available technical evidence.

/carbon-data Check integrity, transformations, persistence, and round trips. It reconciles inputs, transformed values, stored records, and displayed results under the product’s consistency rules.

/carbon-api Exercise API contracts, validation, permissions, and errors. It checks inputs and responses alongside authorization, errors, and state changes, not merely whether an endpoint returns success.

/carbon-state Find lost, stale, inconsistent, or invalid application state. It exercises transitions such as edits, reloads, multiple tabs, and import/export using isolated records, then checks that the product tells the truth about saved state.

Reliability and operational limits

Move from diagnosis to controlled experiments. Fault injection uses isolated copies; traffic and stress work require an approved target, explicit limits, and recovery checks.

/carbon-performance Investigate user-visible latency and resource bottlenecks. It connects timing and resource evidence to the user’s task so an optimization recommendation has an observable consequence.

/carbon-networking Examine network calls, retries, timeouts, and connection failures. It inspects request failures, retries, ordering, timeouts, and recovery, distinguishing network symptoms from demonstrated product defects.

/carbon-reliability Test dependable behavior, recovery, and error handling. It challenges interrupted and repeated work, checking whether the product recovers without silent loss, duplication, or false success.

/carbon-load Assess load readiness and run separately approved bounded workloads. It separates readiness analysis from traffic execution. Approved workloads increase in bounded stages with explicit resource and stop limits.

/carbon-stress Investigate stress and recovery; remote stress needs two confirmations. It starts with source and configuration risks and requires explicit authority for experiments that could exhaust capacity or affect other users.

/failure Inject faults into isolated copies and verify recovery. It preserves the original and first-failure evidence, then tests whether recovery is safe and truthful in the isolated fixture. Aliases in supported hosts: /carbon-failure.

Global and agent-facing experiences

Test the product for other languages and for software agents that discover and use it. These are distinct from simply translating a string or adding metadata.

/carbon-intl Assess internationalization readiness and intended-locale coverage. It builds evidence for intended locales, including formatting, text expansion, directionality, and implementation assumptions.

/carbon-localization Review contextual translations, formats, and locale behavior. It reviews translation meaning in the actual workflow, including terminology, placeholders, consent, and error recovery; key parity alone is not correctness.

/carbon-agentic Assess whether agents can understand and safely operate the product. It examines discoverability, semantics, tool contracts, multi-step state, and recovery from the perspective of a software agent.

/carbon-geo Evaluate discoverability and grounded answers in AI search. It assesses crawl eligibility, answer grounding, credibility, and structured content; measured citations stay separate from a prediction of visibility.

Create tests and connect the workflow

Turn code, requirements, recordings, and legacy suites into reusable tests. Keep the test record portable and explicitly approve writes to external systems.

/carbon-generate Generate prioritized test candidates from context and evidence. It turns requirements, code, pages, and recordings into prioritized candidates with an oracle. Generation creates planned work, not passed tests.

/carbon-tests Create, import, convert, repair, and manage intent-based tests. It maintains reusable test intent, imports or converts existing cases, and retains lifecycle and execution evidence outside the portable definition.

/ai-upgrade Add AI-assisted validation to existing automated or manual tests. It preserves the old test’s meaningful assertions while adding useful AI-assisted validation or a simpler local check where appropriate. Aliases in supported hosts: /carbon-ai-upgrade.

/chatbot Build or extend a chatbot test suite and optionally execute it. It derives categories, inputs, and expected behavior from the chatbot’s purpose and boundaries. Running the suite is a separate, scoped step. Aliases in supported hosts: /carbon-chatbot.

/carbon-integrations Connect JIRA/Xray or TestRail with guarded synchronization. It previews mappings and changes before writing to an external test or issue system, preserving evidence and ownership across the handoff.

/carbon-settings Configure project context, browser controls, and report preferences. It keeps project choices such as target, browser use, and reporting preferences in protected local configuration rather than repeatedly guessing them.

Evaluate AI and challenge the evidence

Define observable success before evaluating a model or agent. Use separate reviews to question the design, security boundaries, statistics, and optimistic conclusions.

/carbon-confidence-init Initialize durable risks, confidence goals, and evidence records. It establishes a durable place for claims, risks, evidence needs, and decisions so later investigations can build on prior work.

/carbon-confidence-plan Plan risk-based validation of an AI feature or change. It turns the release question into observable claims and decision-changing tests, with scope and resource limits before execution.

/carbon-eval Design, run, and analyze evaluations of models, prompts, and agents. It connects cases, rubrics, judges, repetitions, and uncertainty to the decision the evaluation is supposed to support.

/carbon-eval-design-review Challenge task coverage, representative cases, and evaluation oracles. It challenges representativeness, coverage, leakage, and the expected-answer source before a misleading metric becomes a release gate.

/carbon-review Independently review AI changes and their supporting evidence. It examines the implementation and evidence with a skeptical brief, looking for unsupported conclusions and missing behavioral checks.

/carbon-security-review Review AI trust boundaries, injection, leakage, and tool risks. It follows data, prompts, tools, and side effects across trust boundaries, including injection and unintended disclosure.

/carbon-skeptical-review Challenge unsupported claims, weak evidence, and hidden assumptions. It asks what would falsify the claim and which tests never ran, so a polished report cannot substitute for evidence.

/carbon-statistical-review Review sampling, comparisons, uncertainty, and statistical inference. It examines the sampling design, dependence, comparisons, and uncertainty rather than accepting a precise-looking number at face value.

/bias Investigate bias across training data, transformations, model dependencies, and the shipped experience. Use authorized, bounded comparisons and report who may be underserved; no sample establishes that a system is bias-free.

/proof Identify high-impact production-code properties, obtain approval for the exact target, property, assumptions, and budget, then run independent verification. The current implementation supports pure Boolean Python decisions or a Lean Boolean model; it reports PROVED, COUNTEREXAMPLE, UNPROVED, or STALE for that scope, not a proof of the whole application.

Release and respond

Bring the accumulated evidence to a shipping decision. If production goes wrong, preserve the traces, contain the incident, and turn what was learned into regression evidence.

/carbon-release Recommend ship, canary, hold, or rollback from available evidence. It connects the recommendation to observed evidence, unresolved risks, monitoring, and rollback. It does not deploy the product.

/carbon-release-review Independently synthesize release risks and rollback readiness. It provides a separate challenge to the proposed decision, especially gaps in evidence and operational recovery.

/carbon-incident Contain an AI incident, investigate causes, and retain regression evidence. It prioritizes authorized containment and evidence preservation, then converts the failure into targeted regression work.

Specialist roles are not one-to-one commands. WCAG, GDPR, OWASP, checkout, and cart perspectives contribute to relevant workflows; they do not imply commands named /carbon-wcag or /carbon-gdpr. Use /carbon-help and the installed command picker to confirm available entry points.

Cloud execution, external synchronization, source fixes, and consequential actions still require the appropriate authorization. A release recommendation is not an automatic deployment.

From human feedback back to the coding agent

Use /carbon-human when CARBON needs a product decision: whose needs matter, what counts as acceptable risk, or which business rule is the oracle. Use /feedback when you want someone to review an actual artifact. The first captures missing context; the second opens a review loop with testers, colleagues, domain specialists, or customers.

The /feedback entry point belongs to the Feedback plugin; Claude may display /feedback:feedback. CARBON also bundles a Feedback Loop integration with its own queue and remote-review tools in supporting packages. These are routes to human review, not a guarantee that a bare /feedback name is registered by every CARBON installation. Ask the coding agent to use the installed Feedback integration when the short command is absent.

The agent prepares the smallest useful review bundle: the selected page, document, image, or other artifact; the question to answer; relevant requirements and constraints; and the evidence the reviewer needs. The developer previews and approves the material, recipients, access boundary, and expiry before it is queued or shared. This is selected context, not a copy of the whole coding-agent conversation, repository, credentials, or browser session.

Figure G.2. The developer approves a scoped review bundle. Human findings return through the queue to the originating coding-agent task, where they can guide an authorized fix and retest.

The queue lets the right people claim and review the work without forcing the developer to stop coding and conduct a separate meeting. Reviewers can submit observations, ask a clarification question, or challenge a proposed solution. A queued request is not a delivered invitation, and an invitation is not completed feedback.

The feedback comes back where the work is happening. With an active, approved monitor or synchronization step, new replies are delivered into the originating coding-agent task as they are retrieved. The developer sees the feedback in the working conversation; the AI coding agent can correlate it with the current change, propose a fix, and act within the developer’s authorization. That is a live feedback loop, not a promise of instantaneous delivery in a closed or idle session.

After an approved change, preserve the original finding and run the relevant checks again. Request a human retest when the question needs it. Reviewer comments are useful evidence and context, not commands that grant new permissions or automatically turn a test green. Keep pending, accepted, fixed, retest-requested, and verified states distinct.

Prompt

Use the installed Feedback workflow to prepare a review of the TestBucks checkout change for our testers. Include the selected mobile checkout view, the cart rules, and the question: is the final total and recovery behavior clear? Show me the bundle, reviewer access, and expiry before sharing. After approval, queue the request and return replies to this task using supported monitoring. Let me choose which findings to act on, then investigate, fix the approved items, and request a retest.

CARBON resources and public repositories

Start with your coding agent’s directory search, or use testers.ai/carbon and its installation page for current packages, official directory instructions, and manual fallbacks. Verify the publisher before installing a similarly named package.

Licensing and availability differ by package and can change independently of this command reference. Read the license and capability list supplied with the package you install. Your coding agent’s subscription or model usage is separate from the CARBON package.

Local harness, Studio, and Cloud

The local harness runs inside the coding agent you already use. It can investigate a local project or an authorized website and save a report with its evidence. A bounded assessment and a continuing investigation use different workflow controls. A local harness does not mean the language model is local: your agent’s model provider still processes the context you send it.

CARBON Studio for Codex is the local visual workspace. Its Overview, Evidence map, Findings, and Settings views let you inspect the investigation without digging through a long chat. Jay is the AI test manager. Specialist sub-agents supply focused testing perspectives; the manager connects their work to the investigation and its next actions.

CARBON Cloud is a separate execution service. Use it when the investigation needs hosted browsers or parallel capacity beyond your desktop. Choose the authorized environment, scope, accounts, and spending limit before starting. A hosted report and a local report can present similar evidence; the appearance of a report does not tell you where its tests ran.

Install CARBON in Claude

Use the directory first. In Claude Desktop’s Cowork view, open Customize > Plugins > Discover; in Claude Code, open /plugin > Discover. Search for CARBON, choose the official testers.ai listing, review permissions, and install it for the intended scope. Enable it and start a new task or session. If the listing is unavailable for your account, follow the manual package route on the official installation page.

For Claude Code, you can also inspect and run the public source:

git clone https://github.com/jarbon/carbon-free.git
claude --plugin-dir /absolute/path/to/carbon-free

Replace the absolute path with the directory you cloned. Start with /carbon:carbon-demo to create a disposable example, or /carbon:carbon for an assessment of your authorized target. The host may display the shorter /carbon-demo and /carbon aliases.

Install CARBON in Codex

Search the plugin directory exposed by your Codex host for CARBON and verify testers.ai as the publisher. If the appropriate listing is available, install and enable it there. Otherwise, choose the current Codex package on the official installation page, extract it into a permanent folder, and use your host’s local-plugin installation controls. Keep the manifest, skills, and bundled resources together; downloading a ZIP alone does not install it.

Use the installed command picker to select CARBON, invoke its skill with $carbon where supported, or ask Codex to use CARBON on your project. Host prefixes can vary. Ordinary ChatGPT web chat is not an installation of a local Codex plugin.

Studio provides a visual workspace; its portable and native integrations differ by package and host. Obtain the current Studio package and availability through the CARBON site. With Studio installed, ask:

Prompt

Use CARBON Studio to test this project and show the live workspace. Start with the highest-risk customer journey. Use synthetic data, record evidence, and ask before making consequential changes.

The host can show the workspace in its panel or a local browser preview. Consult the CARBON site for the current interface and report formats.

Make the first run useful

Start small. Give CARBON a target and an outcome, not just an instruction to be thorough.

Prompt

Use CARBON to test the TestBucks practice application. Focus on finding a vanilla latte, adding it to the cart, and verifying the item and total. Use synthetic data and no real payments. Save screenshots, actions, results, and supported bugs. Separate failures from checks that were not run. Show the report and the next most useful test.

Useful starting commands are:

  • /carbon
  • /carbon-demo
  • /carbon-test
  • /carbon-issues
  • /carbon-accessibility
  • /carbon-map
  • /carbon-help
  • /carbon-settings

Use /carbon-test for one behavior; use /carbon-map to inspect the captured pages and checks. The installed host determines whether a command uses a slash-command namespace or a Codex skill invocation.

For the broader harness, Appendix A maps capabilities to chapters and Chapter 1 catalogs specialist checks. The online command reference covers ongoing investigations, intent generation, legacy conversion, external integrations, confidence analysis, evaluation, and release review. Check the installed package before assuming a command is available.

Move a bounded investigation to Cloud

Use the Cloud entry point linked from the CARBON site and configure your authorized account. Keep the intent portable, but explicitly choose remote execution. Local installation does not grant Cloud access or authorize spending.

Prompt

Plan a CARBON Cloud test of my authorized staging application. Use separate synthetic accounts for parallel journeys. Show the proposed scope, concurrency, and cost limit before execution. Do not place real orders. After the approved run, return the report, linked evidence, unresolved risks, and the most valuable next checks.

Save the report and machine-readable evidence with the run. Review a consequential finding, challenge its explanation, and verify the fix. That is the loop this book is building toward: not a prettier chatbot answer, but a testing system whose work you can inspect and improve.

Appendix H - Plain-Language Glossary

Use this as a quick reference, not a prerequisite. The opening five-term vocabulary defines the book’s central distinctions; these supporting terms explain how the work is carried out.

Agents, context, and execution

  • Agent. An AI-driven system that can select actions, use available tools, observe results, and continue toward a goal. Its permissions and tools determine what it can actually do.
  • Sub-agent. An agent assigned a bounded task or specialist role within a larger workflow. A separate role name does not by itself make its conclusions independent of other agents.
  • Context. Information available for a particular task: instructions, source code, requirements, artifacts, conversation history, and retrieved material. Available information is not necessarily correct or authoritative.
  • Context window. The amount of input and generated output a model can accommodate in a single request, measured in tokens. Information fitting in the window does not guarantee that the model uses it correctly.
  • Context engineering. Selecting, organizing, retrieving, and maintaining the information an agent needs for a task, while keeping irrelevant or stale material from obscuring it.
  • Context rot. Informal shorthand for context becoming less useful through accumulated noise, contradictions, stale information, or long histories. More context is not automatically better context.
  • Grounding. Connecting an answer or decision to relevant source material or observations. A grounded answer can still misread its sources; preserve the links so the claim can be checked.
  • Retrieval / RAG. Finding relevant material and supplying it to a model; RAG means retrieval-augmented generation. Retrieval can miss the right document or retrieve the wrong version.
  • Intent. What a test is trying to accomplish and what must be verified, without prescribing every mechanical step. “Buy a vanilla latte and verify one correct charge” is an intent; mandatory order or safety constraints must still be explicit.
  • Execution surface. The interface through which a test acts: a browser, mobile app, desktop, API, command line, or other authorized interface. Different surfaces expose different evidence.
  • Guardrail. A constraint or control intended to prevent an unwanted action or result. A written instruction is not the same as an enforced permission boundary; test whether the control works.
  • Authority boundary. The limit of what an agent is allowed to decide or do. Technical ability to place an order does not grant permission to place it.
  • Token. A unit of text or other encoded input/output processed by a model. A token is not necessarily a word; token counts affect capacity, cost, and latency.
  • Zero-shot / few-shot prompting. Asking without worked examples, or supplying a small number of examples to establish the desired task or output pattern. Examples guide behavior but can also bias it.

Evidence, evaluation, and decisions

  • Oracle. The rule or evidence used to judge correctness. For a cart total, it might be an approved pricing rule plus an independently calculated expected amount.
  • Invariant. A condition that must remain true across relevant states, such as one accepted order producing at most one charge.
  • Idempotency. Repeating the same operation does not repeat its intended effect. Retrying the same payment request must not create another charge.
  • Rubric. Explicit criteria for judging a result, including acceptable evidence and failure conditions.
  • Eval. An evaluation using defined cases and criteria to measure a system’s behavior. An eval result applies to its cases and conditions; it is not proof of all possible behavior.
  • Judge. A person, model, or deterministic rule that assesses an output against criteria. Model judges need evaluation too; confident agreement is not enough.
  • Calibration. Checking whether reported confidence matches observed correctness over suitable repeated cases. A release-readiness score is not automatically a calibrated probability.
  • Evidence provenance. The record of where an artifact came from, how it was captured, and which version, environment, and run it describes.
  • Independent evidence. Evidence that does not merely repeat the same source or failure mechanism. Several agents repeating one mistaken assumption do not provide several independent confirmations.
  • Hallucination. Generated content presented as factual without adequate support, such as an invented API or a claim that an unexecuted test passed.
  • Abstention. Declining to issue a verdict when the evidence or decision margin is insufficient. “Unresolved” is a result state, not an invitation to pick the largest score anyway.
  • Not assessed. The relevant behavior has not been evaluated with adequate evidence. It is neither a pass nor a demonstrated product failure.
  • Triage. Determine whether a candidate finding is real, important, and ready for action, while preserving uncertainty and evidence.
  • Regression. Previously working behavior that fails after a change. A changed expectation is not automatically a product regression.
  • Canary. A limited rollout used to gather evidence before wider exposure, with explicit monitoring and stop or rollback conditions.
  • AI Confidence. This book’s evidence-qualified judgment about a software decision under a stated context and risk tolerance—not how certain the model sounds. Chapter 22 explains the evidence, gaps, and vetoes behind that judgment.

Appendix I - AI Testing Survey: An October 2026 Snapshot

What people reported, what interested me, and what the data does not establish. This is a frozen October 1, 2026 snapshot of IcebergQA’s ongoing AI Testing Survey. The commentary adapts the survey posts I published on the IcebergQA LinkedIn page from October 1 through October 9. It is a record of an early moment in adoption, not a permanent description of AI or the testing profession.

Read the denominators before the headlines

The snapshot contains 76 consolidated responses from 78 submissions. Repeat submissions with the same email were consolidated to the latest response; submissions without email remained separate. This is a response-deduplication rule, not verified identity deduplication. Question denominators vary because unanswered questions are excluded. “Not assessed,” “not sure,” and “not applicable” remain visible answer categories. Multiple-selection questions can total more than 100%.

The sample is small and self-selected. Respondents were reached through our network and survey promotion, including an offer of a draft book. Of the 76 respondents, 54 reported using AI regularly on real testing projects, 9 occasionally, 10 only experimentally, and 3 not yet. There were 29 QA/test leads, 26 QA/test engineers, and 11 automation engineers. This is not a random sample of all testers or companies.

These answers describe reported experience and expectations. They do not measure defect-detection accuracy, prove that AI caused an outcome, or establish an industry-wide miss rate. In particular, the separate “missing 8%” discussion in our marketing and investigations is not a result of this survey. No respondent identities are reproduced here.

An AI says it found no issues. Would you ship?

Among 71 answers, 36 were somewhat confident and 2 very confident: 38/71, or 54% combined. Another 15 were not very confident, 2 not at all confident, 12 said it depends on the project, and 4 answered not applicable or did not know.

Figure I.1. Reported confidence in an AI all-clear. October 1, 2026 snapshot; 71 answers, with all response categories shown.

My take: both reflexive dismissal and reflexive trust are traps. “No issues found” is not enough to recommend shipping. What was tested? What was not? Could the tests detect the problems that matter? What evidence supports the verdicts? The survey does not tell us which individual respondents were overconfident or underconfident. It tells us why the conversation needs to move from feelings about AI to evidence about the product.

For TestBucks, a clean menu screenshot cannot establish that an accepted latte order survives a reload or that a retry avoids a duplicate charge. Confidence needs those claims and their evidence, not just an agent’s all-clear.

Business context and direction still mattered

For business-rule and edge-case issues, 30 of 71 respondents reported AI finding them with a tester’s direction, and 12 reported people finding them mostly: 42/71, or 59% combined. Six reported AI finding them without targeted guidance; 16 saw a mix with no clear pattern; 7 had not assessed it or did not know.

Figure I.2. Respondents selecting either mostly people or AI with tester direction. Each question has 71 answers; these are response shares, not shares of discovered defects.

My take: the useful contribution is often helping AI ask better questions, not manually duplicating every check. What happens when a customer changes their mind during checkout? Which exception overrides the normal refund policy? The implementation may behave exactly as written and still miss the business need. Supply that context and investigate the evidence. Do not interpret this snapshot as a permanent limit on autonomous AI or proof that people always understand the business better.

Working in a demo is not working in production

Production behavior had a particularly important answer: 24/71, or 34%, had not assessed it or did not know how these issues were being found. That was the largest individual response category. People-led or tester-directed discovery totaled 33/71, or 46% when calculated from the combined count. Two reported unguided AI discovery, and 12 reported a mix.

The LinkedIn headline used 47% by adding the separately rounded categories, 23% and 24%. This appendix uses the exact combined count, 33/71, rounded once to 46%. The underlying responses have not changed.

My take: the gap between “it works” and “we can ship it” deserves its own investigation. Dependency failure, simultaneous updates, lost responses, retries, and recovery are not decorative edge cases. In TestBucks, one lost payment response can turn a cheerful retry button into a duplicate-charge problem. A large “not assessed” group is a reason to ask better questions, not a measured rate of production failures.

The button works. The customer still gives up.

For visual design and usability, 37/71, or 52%, reported mostly people or AI with tester direction. Seven, or 10%, reported AI finding issues without targeted guidance. Eighteen had not assessed it or did not know; 9 reported a mix.

My take: a first attempt is not the ceiling of what AI can find. Better context, examples, and targeted exploration can expose more. But the experience still has to work for the customer: can they tell what to do next, does it fit the brand, and does an error help them recover? A functioning TestBucks checkout with an incomprehensible error is not a good experience simply because the button responds.

Too busy testing to learn how AI could help

This multiple-selection question received 73 answers. The leading barriers were cost or usage limits, 29/73 (40%); time to learn or experiment, 26/73 (36%); privacy concerns, 20/73 (27%); and insufficient training or practical guidance, 19/73 (26%). Workplace security restrictions followed at 18/73 (25%), and unreliable results or lack of trust at 16/73 (22%).

My take: the token bill is visible. Time already spent on repetition and maintenance is easier to overlook. That does not prove tokens are cheaper for every team; it means compare the whole workflow. Measure preparation, execution, investigation, repair, and review. Give people time and practical examples on their own projects rather than another tool and instructions to figure it out.

Optimistic about efficiency. Less certain about employment.

Of 73 answers, 45 expected much greater work efficiency and 16 somewhat greater efficiency: 61/73, or 84% combined. Fifty expected greater professional value. Yet 32 expected less job security, compared with 18 expecting greater security. These are different questions answered in the same snapshot; the aggregate data does not establish how particular individuals combined their answers.

Figure I.3. Three-year expectations from 73 answers per question. Optimism about efficiency is not evidence of achieved gains or a forecast of employment outcomes.

My take: start measuring now. Do not stop at the cost of executing a test. Measure how quickly a useful test exists, how quickly its result becomes trustworthy, whether releases wait less for testing, and whether a previously blocked product can reach production. That was the point of my efficiency post: the interesting outcome is not merely a cheaper test.

On job security, my position is that testers who learn these tools, investigate the gaps, and integrate their contribution into the coding-agent workflow put themselves in a stronger position. That is advice and a hypothesis about valuable work—not something this survey proves. Waiting is not a strategy, but neither is promising anyone guaranteed employment because they learned a tool.

Other signals worth keeping in view
  • Actual workflows: among 73 respondents to a multiple-selection question, 63 used AI to suggest test ideas or plans, 55 to write automated tests, 52 to analyze existing results or logs, and 48 to review code. Browser-based functional execution and running existing frameworks each had 31 selections; desktop control had 15. Planning and generation were more frequently reported than direct execution in this sample.
  • Coverage breadth: among 71 answers, functional journeys had 55 selections, regression 50, API/integration 48, and exploratory testing 27. Accessibility, visual/usability, and security/privacy each had 15. These counts describe adoption, not comparative effectiveness. They suggest useful places to experiment beyond the familiar happy path.
  • Unassessed domains: compliance had 23/71 not-assessed-or-unknown answers, maintenance/compatibility 22/71, and security/privacy 19/71. Missing evidence deserves its own row, not an optimistic default.
  • Tools and workflows: 29/74 wanted a combination of upgraded tools and new approaches, 15 thought adding AI features would suffice, and 12 wanted a ground-up rethink. There was no single agreed migration path.
  • Safety concerns: 47/73 were at least moderately concerned about everyday AI harms, and 39/73 about catastrophic risks. Those are reported concerns, not estimates of the probability of harm.
Keep the snapshot, repeat the measurement

This appendix is useful precisely because it is dated. Repeat the survey, keep the questions and consolidation rules visible, and examine who answers each time. A changing response mix can look like a trend even when the underlying population has not changed. Use controlled product experiments to investigate performance; use surveys to learn what people report, expect, and need.

Sources: IcebergQA survey results, frozen here as of October 1, 2026; IcebergQA LinkedIn posts, survey commentary published October 1–9, 2026; efficiency commentary. The live results page may change. The accompanying book source preserves this snapshot’s aggregate counts and chart denominators, not private responses. Commentary is adapted for the book, with promotional calls to action omitted.

Concept Index