design.morehead-media.com / interaction-patterns / ai-surface
Pattern
Screen
Switch patterns to compare. Switch screens to feel scope behavior — most useful in Pattern C, where the conversation list changes with the screen.

Pattern A · Top contextual panel

Click "Ask Janus" in the top bar to slide a contextual panel down. Conversation lives only inside the panel. Dismiss → it's gone. Try opening it on Proposals, dismissing, navigating to the Journal screen, and opening it again — note the conversation does not persist.
Pros
  • Doesn't take horizontal canvas
  • Modal-feel keeps focus
  • Cheapest to ship
Cons
  • Conversations are ephemeral
  • "Bolted-on AI" smell — common pattern, no wedge
  • Cannot reference earlier conversation
  • Provenance is awkward — proposals have no traceable origin chat
Workspace/Proposals
ACME-US
Ask Janus Ephemeral · dismiss to clear
Why was the AP tolerance for MSP vendors raised to 5%?
Janus · Explain Agent
On 2026-04-22, John approved a proposal to raise ap.matching.tolerance_pct from 2% to 5% for vendors tagged category=msp, citing recurring 3-4% variance on consumable line items. See decision_log#2841 and ai_proposal#118.

Pattern B · Persistent right rail

The rail is always present. Conversations persist. A flat thread list lets you switch between past chats. The hard question — should an open conversation persist or scope to the screen — is unsolved here. Switch screens; note the rail stays the same regardless of context.
Pros
  • AI is genuinely always there
  • Conversation survives navigation
  • History browsable like Slack DMs
  • Maps to LE's stack cleanly
Cons
  • Burns 320–360px of canvas
  • "Chat-heavy" feel — fights records-app posture
  • Persist-vs-scope question unsolved
  • Multi-conversation gets messy fast
Workspace/Proposals
ACME-US
Search…⌘K

Pattern C · Conversations as first-class objects ⭐ recommended

Same surface as B, but each conversation has a scope. Switch screens in the top control bar — note how the conversation list filters to conversations relevant to the current screen, plus globals. Click a conversation to load it. The rail header shows the active conversation's scope as a chip. Conversations persist server-side; the UI just shows what's relevant where you are.
Pros
  • Solves persist-vs-scope — scope is a property of data, not UI
  • Provenance native — proposals link to their originating conversation
  • "Show me everything Janus knows about this vendor" works
  • Same model as decision_log + ai_proposal — consistent with Janus design philosophy
  • Ships simple now (one conversation visible), grows into history browsing without rearchitecting
Cons
  • More upfront engineering — real conversation table, scope unions
  • Power users may prefer top-panel speed for quick questions (V1 can add it as a surface mode)
  • Privacy/sharing model needs explicit design (private by default proposed)
Workspace/Proposals
ACME-US
Ask Janus on this screen…⌘K