for agents/demos/vaults/llms.txtv0.2.78 · 16 Sep 2026

Home / Vaults / Synthetic users

Synthetic users — five people who do not exist, shopping

Five invented buyers were walked through store.sgit.ai one screenshot at a time, asked what they made of each screen, and interviewed at the end. The vault holds all of it: 43 screenshots, 43 steps, 15 questions the site did not answer, 10 places somebody got lost, and 18 findings — three of them costing a sale. It is the most useful vault published here that contains no real data at all.

Open it yourself — the key is the whole credential.
Read key: b70c317b7aa4b6084e05669795dc89e6bf1e46b4e948b9f6c475948ae502823c:g2hei4u6
In the official UI: open it read-only in a new tab · From the CLI: sgit clone b70c317b7aa4b6084e05669795dc89e6bf1e46b4e948b9f6c475948ae502823c:g2hei4u6
Derived one-way from a vault key that is not published and never will be.
Everybody in it is invented, and the vault says so first. The personas are fictional, the names are fictional, and every word attributed to them was written by a language model reading screenshots. The vault's own banner calls this out before you can scroll past it: it is not user research, and no sentence in it is evidence about a real person. What is evidence is the part a machine produced — the screenshots, the URLs, the step order, the viewport sizes and the page-error counts, captured by driving Chromium against the store's built bytes at v0.1.12, verified byte-identical to the live site by SHA-256.

See it live, here

Open the vault in a new tab ↗A five-person rail with a run, an interview and a findings list behind each — roomier in its own tab than in the frame below.

Five people, five outcomes, and the disclosure above the fold rather than in a footnote.

The idea worth stealing: hand the agent the screenshot, not the DOM

This is the whole method, and the vault states it in one sentence:

“An agent that drives a store by reading the DOM finds the buy button every time, and therefore finds no confusion — which is the only thing worth running this for.”

So the loop is deliberately crippled. The agent gets a screenshot, the same thing a person would have, and has to work out what to do from it. Seven steps, run until the persona buys, leaves, or runs out of patience — and patience is a field on their record, not a judgement call made mid-run:

StepWhy it is there
1ObserveScreenshot at the persona's own window size. Do not read the DOM. Do not read the markdown twin unless this persona would
2Say what you seeAt the level of detail this persona would take in — “a skimmer sees three things; a slow reader sees the caveat under the price”
3ThinkWhat they are weighing, and what they are suspicious of. The vault calls this “the part that is worth more than the click path”
4Record a questionSomething the page raised and did not answer. Null when there is none. These are the output
5Record confusionWhere the page lost them, or where they guessed. “A run with no confusion anywhere is a run that was not done properly”
6ActOne action, with the reason given in the persona's terms, not the site's
7LoopUntil bought, left, or out of patience
The protocol is published inside the vault, which is what makes a second run in a month's time comparable rather than merely later.

The five runs, and what each one cost

Every number below is computed from the run records, not from the summary:

PersonaOutcomeStepsQuestionsConfusionsViewport
Priya Raghavan — staff engineer, pays on her own cardbought10321440×900
Tomás Beckett — technical co-founder, £500 is his call alonestalled1054390×844
Marguerite Okonjo — fund partnerleft, favourably8211440×900
Dan Whitlock — COO, signs to £10,000left7431512×820
Ines Halvorsen — security engineer, never the buyerleft, and sent it on8101680×1050

Read the viewport column. The persona carrying the largest decision a single person makes alone on that site did the whole thing on a phone — and produced the most questions and the most confusion of anyone. That is not a finding the vault announces; it falls out of the table once the numbers are in one place.

Zero page errors across all five runs, which is worth stating because it means none of the confusion below was a bug in the store's code. It was the copy.

Every step pairs the image with four things: what they saw, what they thought, what they asked, what they did. The screenshot is the citation.

What it found: 18 things, three of them costing a sale

The findings are ordered by what they cost rather than by who found them, and each one points at a page you can go and check. The three blockers:

  1. The £500 page carries no duration of any kind. The buyer's single decisive question is how long does this take, and it was answerable nowhere before purchase. Earlier copy had carried a figure and it was lost in an edit three versions back. Found by the persona who left without buying and said so in the interview.
  2. The same page describes its own process two ways, and the post-sale page a third. A buyer would have had to pay to find out which was true.
  3. The add-on built for a board has no price, no range and no next action — on a page whose heading is exactly the question its buyer arrives with.
Grouped by cost, tagged by page, and attributed to the run that produced them.

Four are already marked fixed, in the store release that followed the runs — and they are kept, annotated, rather than deleted, on the stated grounds that “a findings list that loses the fixed ones cannot be compared with the next set of runs.” That is the same instinct as this site's own version log, applied to somebody else's bugs.

One fix is better than the finding asked for. The duration problem was not answered by inventing a number: the page now says that the time from a buyer's reply has never run for a paying buyer, so there is no measurement to quote — with a ledger row to match. A synthetic user asked for a figure and got a disclosure instead, which is the more honest answer and the harder one to write.

Where it stops being a checklist

The interviews are the part that does not read like tooling output. The adversarial persona — a security engineer who reads vendor sites for sport and is never the buyer — was asked whether she believed it:

“More than any vendor site I have read this year, and I read them for sport. The reason is narrow and specific: three times I found the weak point and the site had already written it down, in stronger words than I would have used.

And the buyer who stalled, asked what made him believe it:

“Two things did it: the ‘never sold once’ chip on the thing they want me to buy, and the deposit split I did not ask for. Nobody invents either of those to sell harder.

Then, asked what he still did not know at the end: “The date. I have a term sheet expected in six weeks and this site does not contain a single duration for the thing I would buy.” The same gap as finding #1, in the voice of the person it cost.

The same questions for everyone, so the answers can be read down a column as well as across a run.

What it refuses to claim

The thing that makes this publishable rather than embarrassing is how hard it works to be less than it appears:

What to take from it

Shape

Vaultg2hei4u6 · 67 files · 6.4 MB · 43 PNG screenshots
Appindex.html with CSS, JS and a fallback copy of the data inlined — so it renders outside a vault host too, which is how the screenshots on this page were taken
Permissionsapp.json declares none — no filesystem, no network, no LLM. It reads its own bundle and draws
Datapersonas, journeys (written before the runs), protocol, runs, and bundle.json — the concatenation the app actually reads
Toolsrunner.mjs drives the browser, narrate.py adds the persona layer, bundle.py rebuilds the app's data

The pre-publication audit

Run with the read key printed above, against a full clone, before this page existed:

Published as row #27 on the vaults table. The store it examines is store.sgit.ai; the method is the one on publishing a vault. ← All published vaults