Voice & Persona
Conversation Coherence & Unification
Fix the two real defects fast, then remove the *causes* of drift by sharing one Conversation primitive across feed, Chat-to-Q, and voice.
Situation
A grounded review found the app reads as several apps stitched together. Two real defects: QConversation.svelte lays messages out with flex-direction: column so alignment is on the wrong axis (no right-float for user messages), has no auto-scroll, doesn't thread the persona accent, and lacks day separators; separately, BriefPanel renders inline in the scroll stream with no max-height or collapse, pushing the conversation off-screen.
Beyond the bugs, three composer/surface patterns and per-surface persona logic (PersonaChip, SceneMarker, the voice context-chip each reimplementing badge/shape/name logic) mean surfaces drift from each other. The SceneMarker persona-handoff divider is the one elegant primitive — the strategy is to unify every conversational surface around it and a shared Conversation component.
Key decisions
Sprint 0 — tactical fix first
Fix Chat-to-Q's row layout/auto-scroll/persona-threading/empty-state and make BriefPanel scrollable + collapsible, in place, no new abstractions.
Brief collapses to a sticky line
Default: collapse in place to a one-line summary (tap to expand) rather than a bottom-sheet move — kept available without blocking the discussion.
Shared persona atoms
Extract PersonaBadge / PersonaDivider / PersonaLabel from the duplicated logic in PersonaChip/SceneMarker/voice chip; SceneMarker becomes composed from them.
One Conversation primitive
Extract the feed's message-list + scroll-follow + day-separators + scene-marker-weaving into a shared component used by the feed, Chat-to-Q, and the voice canvas transcript.
Composer-model unification
Pick one composer behaviour and document it (or consciously omit it with a rationale) per surface.
Execution routing via Q
Sprint 0's two defects are ideal first dev-driver delegations to Q; the Conversation extraction is judgement-heavy and stays a Claude Code round or a strongly-reviewed complex-tier Q build.
Architecture
Presentational-only unification — no Worker/D1/persona-registry changes.
max-height + internal scroll + collapse-to-line toggle, keeping the existing ✕ dismiss.Risks & guardrails
Conversation refactor coupling
Cross-surface coupling makes the full extraction judgement-heavy — the diff choice (full now vs. incremental) is an explicit open design question.
Brief collapse UX undecided
In-place collapse vs. a bottom-sheet move is left open to spec review; default is in-place.
Regression risk on shared primitive
Once feed/Chat-to-Q/voice share one component, a bug in it surfaces everywhere at once — mitigated by keeping MessageView/Composer untouched and only lifting list/scroll/markers.
Delivery
Sprint 0 — quick defects
Chat-to-Q alignment/scroll/accent fix + Brief scroll/collapse; PRs via Q, operator reviews & merges.
Phase 1 — unification
Persona atoms (→ Q), Conversation primitive (→ Claude Code, judgement-heavy), composer model resolved by audit; each independently shippable.
Rollout
Spec review → implementation plan → Sprint 0 merge/deploy → Phase 1 merge/deploy → spec the memory & search sub-project next.
Out of scope
docs/superpowers/specs/2026-06-20-conversation-coherence-design.mdplan ·
docs/superpowers/plans/2026-06-20-conversation-coherence.mdplan ·
docs/superpowers/plans/2026-06-20-conversation-unification.md