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
- #1 Questions come from a committed corpus of reader personas (for example casual fan, price-chasing punter, fantasy player, journalist) and intents, with several natural phrasings per intent including short, lowercase and misspelt forms
- #2 Follow-ups are chosen per intent and read as a reply to the previous answer, not a fixed sentence
- #3 Reader ids are stable per persona and ratings vary by persona and by answer outcome
- #4 The site-browser CronJob draws from the same corpus
- #5 The prompt-injection probe questions still reach the injection guard, and the existing loadgen tests are updated rather than deleted
Definition of Done
- #1 just check
Implementation Plan
- 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.