Four hours to save fifteen minutes.

I was only trying to get out of UAT.

I'm lazy in a specific way. I'll spend four hours building something to avoid fifteen minutes of doing it by hand.

The thing I was avoiding was UAT.

A six-panel comic: a self-documenting UAT agent walks the app in Chrome, screenshots every step, and turns the click-through into a reusable walkthrough that never goes stale — so UAT never has to be done by hand again.

It's not the bugs — API and browser tests already catch those. It's the soft, subjective pass: does the copy land, does the spacing hold, does the flow feel right. Which meant me, after every deploy, clicking through the whole journey by hand — job card, invoice, payment — just to look at it. So I handed the clicking to an agent that walks the journey and screenshots every step.

Self-documenting walkthroughs that never go stale

Then the support questions started. Cashiers would ask things like:

How do I cancel an incorrect money receipt?

Before, I'd write the steps out or hop on a call myself. Now I just forward the question to the agent. It builds a walkthrough for that exact need — pulls the right screenshots, marks the buttons to press, and sends back something you click through instead of read. It's the same walk it does for UAT — the click-through I built to get out of doing myself, now handed to whoever asked.

What comes back — click through, don't read.

Most user docs are written once and quietly go stale the moment the UI moves. This is the opposite — built on the spot, always matching the app as it stands today, and shaped around the person who asked. A live walkthrough that's never out of date, because it's never written in advance.

I didn't set out to build a support tool. I was trying to get out of UAT.

Why it barely costs a token to run

People assume this costs a fortune in tokens. It doesn't — only the part that needs judgment runs on the pricey model; everything repeatable is pushed down to things that run for free:

┌────────────────────────────────────────────────────────┐
│ Claude · frontier · ONE-TIME                           │
│ writes the test once, as plain intent                  │
└────────────────────────────────────────────────────────┘
                             │
                             ▼ test spec
┌────────────────────────────────────────────────────────┐
│ Python · EVERY RUN — the runner                        │
│ drives Chrome · screenshots · highlights · PASS/FAIL   │
└────────────────────────────────────────────────────────┘
                │                       ▲  the click to perform
                ▼  here's the page      │
┌────────────────────────────────────────────────────────┐
│ Qwen 3.5 35B · local · FREE — per-step decision        │
│                                                        │
│ TEXT   snapshot (DOM/buttons) → picks the click        │
│ VISION (pixels) → for what text can't see:             │
│        error box · canvas · toast · dead click ·       │
│        stuck spinner · overlay over a button           │
│                                                        │
│ resolves known + visual surprises LOCALLY (free)       │
└────────────────────────────────────────────────────────┘
                             │
                             ▼ novel surprise Qwen can't resolve
┌────────────────────────────────────────────────────────┐
│ Claude · ESCALATION ONLY (rare)                        │
│ gets Qwen's 2-line text — NOT the image — decides,     │
│ then hands the answer back to the run                  │
└────────────────────────────────────────────────────────┘
                             │
                             ▼
┌────────────────────────────────────────────────────────┐
│ PASS / FAIL · deterministic backend check              │
│ no model vote · no vision vote                         │
└────────────────────────────────────────────────────────┘

The expensive model runs once (plus the odd escalation); everything per-run is local or free — and PASS/FAIL stays a deterministic backend check, no model vote and no vision vote. A full job-card-to-payment walkthrough burns ~70,000 tokens through Qwen 3.5 35B on my Mac Pro, so re-run it a hundred times and the bill stays flat at zero.

Look at that long enough and it's an org chart. I delegate to Claude, Claude delegates to Qwen, Qwen delegates to Python. Best team I've ever run.

Yoda meme about model cost-routing: ‘Delegate to the cheapest model, you must. Middle management, this is.’ — the frontier model decides once, the free local model does the repeatable work.
Middle management, this is.

Straight answers, for humans and crawlers alike

Do self-documenting walkthroughs go stale when the UI changes?

No. Each walkthrough is generated on demand against the live app, so it matches the UI as it stands today. Nothing is written in advance, so there’s nothing to fall out of date.

How much does it cost to run an AI agent for UAT testing?

Almost nothing. The frontier model writes the test once as plain intent; every run after that is a local model plus Python driving Chrome. A full job-card-to-payment walkthrough is ~70,000 tokens through a local Qwen 3.5 35B on my own Mac Pro — re-run it a hundred times and the bill stays flat at zero.

Can a local LLM drive browser-based UAT?

Yes. A local Qwen 3.5 35B makes the per-step click decision from a DOM snapshot, and reads pixels when text can’t see an error box, toast, or stuck spinner. It escalates to a frontier model only for the rare novel surprise it can’t resolve itself.

Let's build something with intention.

I've done this before — for early-stage startups, a publicly listed enterprise, and most stages in between. If it overlaps with what you're working through, I'm glad to share what I learned.

Grab 30 minutes → Or email me

I take these calls because I genuinely enjoy them — comparing notes with founders is how I keep learning, and the best conversations usually drift into motorcycles or cocktails anyway.