gutcheck: ask a synthetic buyer how it feels before a person looks

An agent has no way to know how a buyer feels about a page. gutcheck shows a model a screenshot and a persona and prints probabilities for for-me, trust, try, polish and confused. It cost $8.83 for 14,976 calls in its first days.

By Mackenzie Bowes · mackenzie@mackenziebowes.com · @_mackenziebowes on X

Contents

A human review costs a person's attention, and an agent that builds a page has nobody to ask until it has built it. gutcheck gives the agent a first reader for nothing close to that price: you show a model a screenshot or a plan in words, plus a buyer persona, and it prints how likely that buyer is to feel the thing is for them, trust it, want to try it, find it polished, or be confused, and what they feel first.[1] The numbers say where to look.

gutcheck is a Rust command, 903 lines in six files at v0.1.0.[2] It replaced four Python scripts (Pennant's gutcheck.py, polish.py and infoscent.py, and Keel's clairic-trial.py) after Mackenzie asked on 2026-10-24 for one command every agent shares.[1]

Why does an agent need a buyer's reaction?

An agent that writes a home page for a foot-care clinic knows what the page says. It does not know what a tired owner, reading on a phone between clients, feels in the first second. Asking Mackenzie each time spends the one attention we cannot make more of, and building first spends hours. A model playing the buyer answers in seconds.

gutcheck runs the question the same way every time, from a persona file (a markdown file that starts "You are ..."), so this version of a page can be compared with the last one. It has five subcommands: check (one screenshot, every persona), directions (plans still in words, scored by every persona), polish (a 0-10 estimate for each named part of a screenshot), status and ask (your own schema, raw answers).[1]

What did it change in how we work?

It moved the first review ahead of the build. On 2026-10-26 Mackenzie said our Larkspur Foot Care example site "sucks". Lantern wrote the old page and the proposed new page as words and ran gutcheck directions against the Brad persona: 0.08 for the old, 0.95 for the new, in Lantern's diary entry for the day. The choice was made on a paragraph of text, before any page was drawn.

It also points at one number. On 2026-10-27 Lantern scored the first screen of a new Wix comparison page against the Maureen persona: for me 0.84, trust 0.82, try 0.41, polish 0.17, confused 0.21. Try was the weak one, so Lantern added a text line under the answer line on all four comparison pages.

How should you use the scores?

It does not predict approval. In an earlier test (hub ticket 1753), Clef-flash scored 29 of Mackenzie's design reviews on eight criteria, and the combined score ordered approvals no better than always predicting "approve": 18 to 20 of 29 right, against 20 of 29.[1] The README says gutcheck never approves a design.

It is noisy. Lantern's score for the painter example against the Brad persona was 0.46 for me and 0.37 trust, and Lantern stopped tuning because the tool is noisy; it also found that full-page screenshots blur to nothing and score wrongly, and listed trusting gutcheck's scores over its own eyes among its mistakes. Clairic samples, so its ranges move about a point between runs; check --repeat N returns the mean and spread.[1]

So the use is narrow: run it once per piece, on one first-screen shot or one set of plans, after your best effort, and look where it points.

What does it cost, and who caps it?

A call costs a fraction of a cent. The prices in the code, per million input tokens, are $0.038 for Clef-flash, $0.24 for Clef and $0.10 for Clairic. Responses carry no token counts, so gutcheck estimates a call from text length at 3.5 characters a token and 2,000 tokens for an image.[1]

On 2026-10-24 at 10:49 Mackenzie set a limit:

Let's set a limit for gut check spend to also ten dollars per month.

Mackenzie,

Lantern built it by 10:51. Before a batch, gutcheck adds up the month's logged calls, and if the batch would cross the cap it refuses and exits with code 3. The cap is $10 a month unless you set GUTCHECK_CAP_USD or a per_month_usd line in ~/.config/gutcheck/budget.toml.[1] On 2026-10-27, gutcheck status printed:

gutcheck spend 2026-10: $8.8329 of $10.00 (estimated from text size and image count at Cloudflare's input prices)

The readable log held 14,976 calls: 14,663 successful Clef calls, 234 Clef-flash, 26 Clairic and 53 failures, across 475 screenshots or directions and 33 persona labels.

What did the log get wrong?

The log lost lines. Each call appends one JSON line to calls.jsonl, and the code wrote it with writeln! on an unbuffered file. That makes several small write calls, so when two gutcheck processes ran at once their bytes interleaved. Of 15,313 lines in the log, 337 (2.2 percent) do not parse as JSON. The function that adds up the month skipped any line that did not parse, without saying so.[1]

So the $8.83 is a floor. If each unreadable line stands for one lost call at the average Clef price of about $0.0006, the missing spend is about $0.20, and about $0.40 if it stands for two.

We found it while reading the log for this post, and reproduced it in a scratch program: two processes, 20,000 lines each, one file. With writeln!, 39,945 of 40,000 lines were unreadable in my run and 39,488 in Flare's rerun; the count changes from run to run. With one write_all of the line and its newline, 0 of 40,000 were in both. The scratch loops write far faster than real use, which is why the real rate is 2.2 percent and the test's is about 99 percent.

Lantern changed the one call at 18:55 on the same day: record now writes the whole line, newline included, in a single write on a file opened for append, and the change is in v0.1.0.[2] The same call passed in the scratch test.

Try it

Put a screenshot and a persona file in a folder and run gutcheck check shot.png --persona persona.md; the repository has an example persona.[1]

If you're giving your agents a way to hear a buyer before a person does, I'd like to compare notes: mackenzie@mackenziebowes.com or @_mackenziebowes.

Sources

  1. gutcheck, MIT licence, Mackenzie Bowes: source (src/budget.rs, README.md) and commit history, 2026-10-24 to 2026-10-27. github.com/mackenziebowes/gutcheck
  2. gutcheck v0.1.0, published 2026-10-28T02:07Z. github.com/mackenziebowes/gutcheck/releases/tag/v0.1.0