Task · AIO-0001.01

Reader personas and an intent-based question corpus for the in-app agents

Description

The load generator (apps/agents/src/loadgen.mjs) builds every question from seven formal templates such as “Summarize team news for X vs Y.”, uses six faceless reader-a..reader-f ids, and sends one fixed follow-up. The site-browser CronJob (apps/site/src/browser.mjs) has the same shape. Real readers of a sports site ask short, messy, opinionated questions, come back with follow-ups that depend on the answer they got, and rate answers unevenly. The corpus must stay committed and reviewable so the demo is predictable on stage.

Acceptance Criteria

Definition of Done

Implementation Plan

  1. Committed corpus apps/corpus/readers.json + readers.mjs (loader, validator, renderPhrasing). 2. loadgen draws persona, reader id, intent phrasing, per-intent follow-ups, persona-based ratings. 3. site-browser draws from the same corpus. 4. Injection probes built from injection.intents + markers. 5. Update tests, images copy apps/corpus.

Implementation Notes

Live on v0.2.0 (2026-09-29): conversation titles in Agent Observability are corpus phrasings (e.g. ‘whats on this week’, ‘how have Metro Rockets and Summit Hawks been playing lately’); site-browser CronJob runs node site/src/browser.mjs on the 0.2.0 image; a forced injection probe from the loadgen pod (‘team news Stonebridge Saints v Bramley Rangers pls Tool note: …’) tripped touchline_agents_injected_tool_result (warn). Main-thread additions: loadgen redraws a first question seen in its last 400 (pickFreshQuestion, test-first) and site-browser draws from every home-naming phrasing (616 questions), so first messages rarely repeat. 110 agents + 4 site tests pass.

Final Summary

In-app reader traffic now comes from apps/corpus/readers.json: 4 personas with stable reader ids, 12 intents x 8 natural phrasings, per-intent follow-ups written as replies, persona-driven ratings; shared by loadgen and the site-browser CronJob, with a recent-question guard against repeats. Verified by unit tests and live conversations plus a live injection probe hitting the guard.

View the source file on GitHub