Voice & Persona
Round B — Voices & Personas
Three distinct personas — Mallory, Q, Moneypenny — each with their own ElevenLabs voice, accent, and character; mode hands the desk to whoever suits the moment.
Situation
Today everything speaks in Mallory's single voice and renders in one undifferentiated style. This round adds Moneypenny as a net-new persona — the warm front-desk voice for personal/commuting/off mode — gives Q and Moneypenny distinct ElevenLabs voices, threads a per-persona accent through every live element (scene marker, message stripe, caret, waveform, mic ring), and badges Updates/push notifications by the agent they came from.
The persona model splits by role: Mallory (handler — strategy/recall/briefings, dry and clipped), Q (quartermaster — builds/ships the estate, precise and dryly witty), and Moneypenny (front desk — reminders/wellbeing, warm by default and grounded under pressure). Each carries a distinct text accent, badge fill, and badge shape so recognition never relies on colour alone.
Key decisions
Flair level: accented (B)
One shared dark app; each persona owns an accent threaded through live elements — not a full per-persona skin.
Non-colour cue: badge shape
Circle (Mallory) / rounded-square (Q) / squircle (Moneypenny), with the letter spelled out in the badge — satisfies WCAG 1.4.1.
Persona name renders white
Only the badge and live elements carry the accent colour; the name text itself stays --text white so the header doesn't visually "change skin."
Voice fallback is graceful
Unset persona voice ids fall back to Mallory's ElevenLabs voice, so the feature ships correctly before the new voices are chosen.
Crisis handling stays persona-appropriate
Whoever is active handles a crisis in their own register — no detection or override routing layered on top.
Q is orthogonal to mode
Q is always resolved on the R&D/Q-chat/delegate surface regardless of the current activity/hat.
Architecture
Spans Worker (registry, resolution, voice routing, updates), web (theming, scene marker), and Android (notification identity).
PERSONAS registry consolidating today's Mallory/Q definitions plus new Moneypenny content.resolvePersona(mode, surface) — Q on R&D surfaces, else Moneypenny for commuting/off/personal-hat, else Mallory; unit-tested over the full matrix.persona param maps to the persona's voice-id secret with fallback to Mallory's; R2 cache key already includes voice id so no cache poisoning.composeTeaser, EOD (explicitly stays Mallory) each resolve and use the active persona's system prompt.nudges.persona; Q's items map from hermes_events; UpdatesView renders a per-item agent badge.web/src/lib/persona.ts + personaTheme(id) thread --persona/--persona-fill through caret, waveform, mic ring, and the scene-marker handoff divider.MalloryMessagingService maps data.persona to tint colour, large-icon badge, and title, on one shared retained notification channel.Risks & guardrails
Voice ids not yet picked
All personas fall back to Mallory's voice until Alex sets the ElevenLabs secrets — visuals/text still ship and work in the interim.
Nullable migration column
nudges.persona is nullable and treated as 'mallory' when null — existing rows must read correctly unmigrated.
Android notification icon change
Swapping the current launcher icon for a proper monochrome silhouette is a small correctness change that needs on-device verification per persona.
Incomplete provenance wiring
Hub jobs (calendar/mention) aren't wired to set persona on nudges in this round — sources adopt the new column incrementally, so most nudges stay Mallory-attributed for now.
Delivery
P1 — Registry, resolution, Moneypenny content
Pure; no surface change; full test coverage of resolvePersona.
P2 — Voice routing
/speak persona param + voice-id env + Mallory fallback; orchestrator/teaser/EOD persona-aware.
P3 — Web theming + scene marker + chip
--persona token, threaded elements, scene marker, persistent chip, holding-phrase rotation.
P4 — Updates provenance
Migration 020, plumbing, agent badge in UpdatesView.
P5 — Android notification identity
Colour/badge/title mapping; build + on-device verify (Alex).
P6 — Design/a11y pass + docs
Capability-registry entry, estate/ROADMAP/design-guide refresh.
P7 — Voice selection & tuning
Alex-led voice picks in ElevenLabs plus supporting voiceSettings and R2 cache-warming build.
Out of scope
docs/superpowers/specs/2026-06-20-round-b-voices-personas-design.mdplan ·
docs/superpowers/plans/2026-06-20-round-b-voices-personas.md