███╗   ███╗ ██╗   ██╗  ██████╗ ███████╗ ██╗
████╗ ████║ ╚██╗ ██╔╝ ██╔════╝ ██╔════╝ ██║
██╔████╔██║  ╚████╔╝  ██║      █████╗   ██║
██║╚██╔╝██║   ╚██╔╝   ██║      ██╔══╝   ██║
██║ ╚═╝ ██║    ██║    ╚██████╗ ███████╗ ███████╗
╚═╝     ╚═╝    ╚═╝     ╚═════╝ ╚══════╝ ╚══════╝
DemoAcademyPricing
Sign inBook a meeting

Building the harness · August 16, 2026 · 9 min

Simulating clients who remember

A scripted synthetic client can only prove your transitions exist. The loop that earns a retainer is different: v1 goes out, the client objects to one thing, v2 comes back, and they ask the only question that matters — did they fix the thing I said? That needs memory.

By Islam Hachimi, Founder

Any waiter can carry a plate to a table. That is not what makes a restaurant good. What makes it good is what happens when you send something back.

We wanted to test whether our product actually works, end to end, without a human clicking through it. So we built fake customers. The first version was useless, and the reason why is the interesting part.

Version one, one complaint, version two, and the question that follows
The only question that matters on version two — and a fake customer with no memory cannot ask it.

Why the first version was useless

It worked exactly as designed. It signed up, ordered work, received the result, approved it, and checked the invoice appeared. Everything passed.

But it approved because the script said approve. It complained because the script said complain. It never actually wanted anything, so it could never be let down.

It could prove the buttons worked. The buttons were never the risk.

The moment that decides whether you get paid again

Real service work is not "deliver, approve, done." Month two is almost entirely fixing things.

You send the first version. The client comes back with one specific complaint — the VAT figure is for the wrong quarter. You send a second version. And now the client looks at it while remembering the first one, and asks the only question that actually matters:

Did they fix the thing I said?

A beautiful second version that ignores your complaint is worse than a plain one that fixes it. The first one is not listening. And "they don't listen" is the reason people leave that never shows up in a complaint form.

To test that, your fake customer has to remember. That is the whole thing.

What our fake customers carry around

  • every version they have been sent
  • every complaint they made, and how many times it has been ignored
  • how often they have been asked to go find something — people get tired of homework
  • how much patience is left

And they can do the two things most tests forget about: go quiet and leave.

Real clients rarely send an angry final email. They just stop replying, and you find out at renewal. A test that only knows about explicit rejection never sees that coming — which is precisely the thing it should have been built to catch.

Let the AI have an opinion, not the verdict

This is the decision that makes the difference between a useful test and an expensive story generator.

"Did this version fix my complaint?" needs actual reading and judgement. So an AI answers it — and it gets to see what a real customer sees: the page, the document, the questions stacked above the work.

Everything else is arithmetic. How much patience being ignored costs versus being late. When somebody gives up. Whether this is a new complaint or the same one worded differently. That lives in plain rules that can be tested on their own.

If the AI decides both what it thinks and what that means, every run produces a believable story and no run produces an answer. That is how AI simulations end up beautiful and worthless.

Looking at the page, not the text

A customer does not receive a paragraph. They get an email, click a link, and look at a page. And the things that lose customers live in that gap.

A document that opens as a grey wall with the number they wanted on page three. An "Approve" button next to work that is obviously not finished. Three questions stacked above the deliverable, so the first thing they feel is homework rather than progress.

None of that is in the words. All of it is in the picture.

Small things that mattered

  • One complaint, not a list. Real customers write one sentence and press send. Nobody writes a nine-point review, and a list gives you nothing to fix first.
  • Put the old complaint front and center. Mention it in passing and you get an answer in passing — and that question was the entire point.
  • A confused answer is not approval. The tempting shortcut is to treat a garbled response as "fine, carry on" so the test does not fail. That makes your test lie in the flattering direction, exactly when things were confusing — which is when you needed it most.
  • Use several different customers. The same report can read perfectly to a marketing agency and be useless to a dentist. One fake customer never shows you that.

The number it gives us

Alongside all this we track something simple: a real engagement passes through fifteen stages, from first contact to renewal. How far has any real customer ever actually got?

Not "do the tests pass." How far has this thing ever taken somebody.

That number has been useful every single time we have looked at it, which is more than we can say for the test count.

Everything described here is in the kernel that runs Mycel — the scheduler, the wedges, the guards, and the tests that hold them.

Read the kernel →More writing →

Read next

  • Services are data, not codeA bookkeeping service in our system is a JSON manifest, a folder of markdown, and an output schema. No module, no deploy, no engineer. The consequence that matters is not speed — it is that domain expertise stops being something only a programmer can add.
  • Output schemas are completion contractsMost agent frameworks treat a schema as validation applied after the fact. Treat it instead as the definition of done — the run ends the moment a valid result is written — and three unrelated problems disappear at once: unbounded loops, unresumable runs, and work nobody can grade.
  • One config for every task is the original sin"Build a website for this business" and "decide the next step on this overdue invoice" are not the same job, and giving them the same tools, permissions and credentials is how an agent system becomes unsafe. Three shapes, and a build run that can never hold a send token.

Take the client you turned down last month.

Describe what you deliver and the first draft exists before you have finished your coffee.

Start 7 days free

The first AI delivery firm. You sign.

All systems operational

Ask an AI about us

  • Claude
  • ChatGPT
  • Perplexity

It reads the site and answers on its own. We do not get to edit what it says.

Product

  • What you get
  • Pricing
  • Changelog
  • What it runs
  • Free reports
  • Product map
  • Team
  • Blog
  • Glossary
  • AI Visibility Index
  • Sign in
  • Docs

Compare

  • vs ChatGPT, Claude, or whichever tab is already open
  • vs Grok Bot and the AI-employee platforms
  • vs Hiring an account manager
  • vs Profound
  • vs Otterly
  • vs Building it yourself
  • vs Zapier & n8n
  • vs Temporal
  • vs LangGraph
  • vs CrewAI & AutoGen
  • All comparisons

Legal

  • Privacy
  • Sub-processors
  • Terms
  • DPA
  • Security
███╗   ███╗ ██╗   ██╗  ██████╗ ███████╗ ██╗
████╗ ████║ ╚██╗ ██╔╝ ██╔════╝ ██╔════╝ ██║
██╔████╔██║  ╚████╔╝  ██║      █████╗   ██║
██║╚██╔╝██║   ╚██╔╝   ██║      ██╔══╝   ██║
██║ ╚═╝ ██║    ██║    ╚██████╗ ███████╗ ███████╗
╚═╝     ╚═╝    ╚═╝     ╚═════╝ ╚══════╝ ╚══════╝