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().quoteoutputs. - 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.