MalloryEstate Briefing
M·034Approved in brainstorm — pending spec review
← All briefings

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.

Dated 2026-06-20Programme Voice & Persona

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

src/persona/index.ts (new)
Single-source PERSONAS registry consolidating today's Mallory/Q definitions plus new Moneypenny content.
src/persona/resolve.ts (new, pure)
resolvePersona(mode, surface) — Q on R&D surfaces, else Moneypenny for commuting/off/personal-hat, else Mallory; unit-tested over the full matrix.
Voice routing (/speak)
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.
Persona-aware call sites
Orchestrator chat reply, composeTeaser, EOD (explicitly stays Mallory) each resolve and use the active persona's system prompt.
Updates provenance
Migration 020 adds nudges.persona; Q's items map from hermes_events; UpdatesView renders a per-item agent badge.
Web theming + scene marker
web/src/lib/persona.ts + personaTheme(id) thread --persona/--persona-fill through caret, waveform, mic ring, and the scene-marker handoff divider.
Android notification identity
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

Per-persona notification channels (one channel, varied per message)Distinct per-persona small icons (tint-only route chosen)A manual persona switcher UI (auto-by-mode + existing override deemed enough for v1)Wiring Hub jobs to set persona on nudges (column + plumbing land now, sources adopt later)Full per-persona surface skin (background tint)
spec · docs/superpowers/specs/2026-06-20-round-b-voices-personas-design.md
plan · docs/superpowers/plans/2026-06-20-round-b-voices-personas.md
Mallory · Estate briefing