Skip to content

Persona voice

The biggest failure mode of “AI as user” reports is page-string regurgitation: the model quotes the literal copy on screen as if a user said it. That output reads like a test log, not user research.

We make persona voice load-bearing in three places.

1. The react() tool

Inside the Pi agent loop, the model has a side-effect-free react() tool. It calls it whenever it wants to express how the persona feels about what’s on screen:

react({ feeling: "confused", quote: "Issue? I have client tasks, not issues." });

These reactions are stored in DO SQLite as a first-class artifact, separate from page snapshots. The agent is prompted to call react() opportunistically at every meaningful UI moment — not just when something breaks.

2. The synthesis pass prefers reactions

When the run ends, we synthesize the report from reactions first, transcript second. The synthesizer is constrained to:

  • Pull quotes verbatim from react().quote outputs.
  • Use the transcript only for the journey narrative and ordering.

This means the quotes section is grounded in something the agent actively wrote in the persona’s voice, not a page-string the model half-noticed.

3. enforceQuotesFromReactions() guard

A final deterministic check rejects synthesized quotes whose strings don’t appear in any react().quote. Synthesis re-runs once on rejection; a second failure flips termination_kind: "synthesis_failure" and the report is emitted with empty quotes rather than hallucinated ones.

Why this matters

We learned this the hard way. An early version without the reaction tool produced thin reports full of on-screen copy dressed up as user quotes. Adding the react() tool and writing the report from reactions first brought the quality back — same model, same target site. The voice machinery, not the model, was the difference.

What you can do as a customer

  • Don’t over-task the agent. Specific tasks (“fill in the signup form”) reduce reactive moments. Open-ended tasks (“Try to figure out what this product does”) produce richer voice.
  • Pick a persona with strong opinions. “Anxious first-time user” and “Non-tech executive” produce louder reactions than “Power user”.
  • Run more personas. Voice diversifies across personas — three runs give you three angles on the same UI.