amplifier-simulated-user-research

Scripted personas run genuine first-run sessions against your real app, in a real browser — and hand back a prioritized, implementation-ready findings spec.

v0.1.0 · Beta MIT · Public repo github.com/microsoft/amplifier-app-simulated-user-research
“It makes your first real user session worth running — it does not replace it.” Positioning line, from the repo

You can't get real users on demand.
And simulated ones lie.

🕑

Real users are slow to reach

Recruiting, scheduling and running a genuine first-run study takes real calendar time. Meanwhile the build keeps moving and the obvious usability holes ship anyway.

🤖

The obvious shortcut is worse

“Just ask a model to pretend to be a user” produces confident, fluent fiction. It reads exactly like a finding. Nothing in it tells you which parts a machine could actually check.

🎭

Agreement is not evidence

“Confirmed by 3/3 personas is one model agreeing with itself in three costumes.”
— line landed by a review council on this tool

So the design problem was never can we simulate a user. It was can we tell which parts of a simulation are worth acting on — and can we prove which is which.

Seed a real instance. Drive a real browser. Grade the output.

01 · Seed

Disposable instance

Stands up a throwaway instance of your app loaded with realistic data.

02 · Walk

Every screen, two viewports

Real Chrome, phone (390×844) and desktop (1280×900), screenshots at each stop.

03 · Critique

Two design passes, in parallel

Run against your actual source, not a description of it.

04 · Role-play

Three personas, first-run

A non-technical small-business owner, an impatient power user, a privacy-adversarial IT pro — each clicking real buttons.

05 · Synthesize

One findings spec

Prioritized and implementation-ready, not a wall of observations.

06 · Gate

Approve or revise

The spec stops here for a human decision before anything downstream runs.

07 · Triage

Real / noise / won't-fix

Every finding gets a verdict recorded to a ledger. That ledger computes a precision number.

Personas are supplied as plain .md briefs. They must be rewritten for your product — see Limits.

Every finding is labeled with how it was known.

Observed

A machine saw it.

  • Machine-checkable — the harness recorded a state change, not an opinion
  • Must carry reproduction steps. No steps, no tier
  • This is the tier you can hand to an engineer and expect a fix
Simulated

A persona thought it.

  • Persona judgment — confusion, hesitation, distrust, unmet expectation
  • Labeled hypothesis, not testimony. Genuinely useful, never counted as measurement
  • This is the tier that tells your first real session what to look for
“Simulation must never impersonate measurement… This is the tool's claim to exist: an audit filter run before real user research, never a replacement.” PRINCIPLES.md, amplifier-app-simulated-user-research

Across two products and two workspaces, the author never once typed a CLI command for this tool.

Every invocation was plain conversational language to Amplifier. The interesting part is how the phrasing collapsed as the tool became routine.

1 · Describe the mechanism
“…you might need to spin up personas and do them through agents mocking humans (which actually works well if you build good personas…)”
Before the tool existed. A paragraph describing a technique.
2 · Name the tool
“Yep, do it. Also, don't forget we have amplifier-bundle-simulated-user-research that we can throw at this as we go as well.”
Pointing it at a second product. The technique now has a name.
3 · Drop to a verb
“run this by the product-council and your simulated user research group”
“continue w/ round 7.”
Once routine. No setup, no explanation, no command.
From a paragraph, to a tool name, to a verb. That arc is the adoption curve.

Say this to Amplifier.

Install and run the microsoft/amplifier-app-simulated-user-research and report back findings

That's the recommended pattern. Ask it at any point in a project's life — the tool is not tied to a phase.

Moment 1

Early design

Point it at a mockup before any implementation exists. You find the structural problems while they're still cheap.

Moment 2

Post-v0 development

Run it against the live app between builds. It reads your actual source and drives your actual UI.

Moment 3

Deciding what's next

A prioritized findings spec is a defensible input to the roadmap conversation, with each item labeled by how it was known.

Seven rounds against a live app.

Attention Firewall — a live, shipping WhatsApp / notification triage web app, v0.8.0. Each triaged round grades every finding real, noise, or won't-fix, and the ledger computes precision from that.

RoundFindingsGraded realPrecisionNote
Round 26 P1 bugsnot triagedFirst proof-run of the new pipeline
Round 3232087%
Round 4251872%Published as a mixed result, unsmoothed
Round 5241979%
Round 6201890%
Round 7191684%
Round 8never triagedReached the gate; no verdicts recorded
Rounds 3–71119182%The graded set
Day one, before any of this was automated. One afternoon, zero humans in the loop: 3 HIGH-severity real bugs, a privacy leak from CDN font requests, and consent copy that overclaimed. A later automated round found 6 cross-confirmed P1s — including a regression shipped that same day.
“Round 4 completed and reached the gate — and it's a genuinely mixed result that I will not spin.” The author, on the 72% round

Read these as self-audit. Every number above was measured on products the authors built themselves. See Limits.

Pointed at a static HTML mockup. Every finding held up.

14 / 14 findings graded real — 100% — against Cortex, an internal per-person AI assistant, at a stage where the only artifact was a static HTML mockup.
Two criticals

Found before implementation

No responsive layout — core actions were unreachable on mobile.

Mid-altitude action buttons permanently dead — the primary interaction of the screen did nothing.

Both of those would have been built, shipped, and then found. It audits a design before you build it — it is not only a shipped-product tool.

Same caveat as the previous slide: this is a product the authors built. Self-audit, not independent validation.

The harness lied to itself for three consecutive rounds.

What happened

A CRITICAL finding — “Rules Edit button does nothing” — was reported in rounds 3, 4 and 5. Round 5 even marked it REPRODUCED across two sessions.

Manual browser checks passed every single time. The button worked.

Root cause

When the browser automation clicked a control that was outside the viewport, it reported success — but the click never landed. A DOM check afterwards then “confirmed” the control was broken.

Three rounds of a confident, cross-referenced, entirely fictional CRITICAL.

The fix shipped into the tool's own prompts: scroll, and confirm the element's box, before clicking. The principle was recorded in the pipeline header so nobody simplifies it away —
“A click is not evidence. A state change is.” Recorded in the pipeline header
“Oh, we should fix that bug in the simulated user research codebase since we were the ones who wrote it… let's pause, fix that, then we can resume.” The author, on discovering it

Findings became shipped code — including the ones that stung.

Permanently embedded

A finding, living in the source

F-03 (research round 5): steering an EXISTING draft used to regenerate a fresh reply…

A research finding that survived into the product as a source comment explaining why the code is shaped the way it is.

Not flattering, kept anyway

The team's own regressions

Round 4 found three regressions that were the team's own.

Round 6's worst finding was, in the author's words, “ours.”

The denominator is kept honest. Findings graded noise or won't-fix stay in it. One example graded won't-fix: “the pairing key is meant to be visible.” The author's framing — those “are exactly the kind of honest denominators that make the 87% mean something.”

The process definition is a graph. Everything else is an adapter.

1,275lines of Graphviz DOT — the entire process definition
38nodes in that graph, run by the attractor engine
3thin adapters over it: Python library, Amplifier tool module, CLI
100%of work nodes wrapped by a quality gate

The gates inspect disk, not claims

Every work node is wrapped by a quality gate that inspects the artifact on disk. It never trusts an agent's self-reported success.

Browser stages must prove navigation

A browser stage has to demonstrate the browser actually navigated. That rule exists because of the story two slides back.

Engine: github.com/microsoft/amplifier-bundle-attractor

A deck that oversells this tool defeats the tool.

It is a pre-filter, not a replacement

It runs before real user research to make that research worth the calendar time. It does not substitute for it, and no result here should be presented as a user study.

n = 0 external pilots

Every precision figure in this deck is self-audit on our own products. KNOWN_ISSUES.md states plainly that finding-validity on a product the authors did not build is n=0. Treat 87% as “measured on us,” never as independent validation.

Persona briefs must be rewritten per product

Running unchanged default personas against a different product produces fiction. The doctor subcommand warns you about exactly this.

The SIMULATED tier is hypothesis

It is a lead worth chasing, not testimony. Only OBSERVED findings carry machine-checkable reproduction steps. Do not quote a simulated finding as if a user said it.

Status: v0.1.0, beta. The repo is public and MIT-licensed, but is not accepting external contributions yet.

Setup is three inputs.

Input 1

A seed command

Whatever stands up a disposable instance of your app with realistic data in it.

Input 2

A URL + a credential

Where the seeded instance lives, and how to get in.

Input 3

A roster of persona .md files

Rewritten for your product. This is the input that decides whether you get findings or fiction.

The conversational path — how it has actually been used:

Install and run the microsoft/amplifier-app-simulated-user-research and report back findings

The CLI path, if you want it:

uv tool install git+https://github.com/microsoft/amplifier-app-simulated-user-research amplifier-simulated-user-research doctor amplifier-simulated-user-research init --dir my-round amplifier-simulated-user-research run --config my-round/project.yaml

Where every number came from.

Data

  • Data as of: 31 July 2026
  • Status: v0.1.0, beta, active. MIT, public.
  • Tool: microsoft/amplifier-app-simulated-user-research
  • Engine: microsoft/amplifier-bundle-attractor
  • Round counts & precision: on-disk run ledgers, rounds 2–8 against Attention Firewall v0.8.0, and the single round against the Cortex mockup
  • Quotes: repo PRINCIPLES.md, KNOWN_ISSUES.md, the pipeline .dot header, and session logs of the invocation phrasing
  • Architecture figures: line and node count of the pipeline DOT graph

Gaps and disclosures

  • Round 2 was a proof-run and was never triaged — it has no precision number.
  • Round 8 reached the gate and was never triaged. Rounds 3–7 are the graded set: 111 findings, 91 real, 82% aggregate.
  • Zero external pilots. All precision figures are self-audit on products the authors built.
  • Who graded: the triage gate records a verdict per finding to a ledger, and the ledger computes precision. During the recorded rounds the author was away from keyboard and authorized the AI to drive the gate as proxy. This deck describes the mechanism, and does not claim a human sat and graded each item.
  • Attribution: the rounds cited were driven by a single author across two products and two workspaces.
amplifier-simulated-user-research · v0.1.0 beta
More Amplifier Stories