Skip to content

RFC-012 — Assistant v0.8 polish

RFC-011 landed the conversation-first IA for /assistant across seed-c7a1 → seed-c7a6 and was deployed live on 2026-05-21. The reducer-owned ephemerality, ?conversationId filter on GET /api/atlas/runs, mobile drawers, Esc / / shortcuts, externalized assistantStrings.ts, and eslint guards against phantom semantic tokens all shipped per the accepted spec. Conversations are the unit of history; the SSE wire contract auto-creates threads on first submit; legacy ?runId= deep links redirect with a two-week deprecation console.warn.

But a senior visual + interaction audit on the live surface — performed against a real keystone-oracle turn for “BKPF fields and key relationships” — flagged that several gaps remained between spec and customer experience. PipelineHealthStrip (an operator batch-pressure banner) was leaking onto /assistant. The scope chip rendered the raw Zitadel org id (360767468626575366 · atlas) instead of a human label. The 7-mode picker appeared twice — once as hero cards, once as composer tabs — which on the primary action surface is too many simultaneous controls. liveNarrativeSteps printed “0 statements prepared” when the resolver returned zero rows. The right rail still rendered Run details alone; EvidenceInspector (promised in RFC-011 §2) had not landed because it depended on package work. The Answer-length toggle occupied a third control row between the message list and the composer. window.prompt was the conversation-rename UX.

Three RFC-011 follow-ups were still queued: Phase 6b multiline composer (blocked on djed-evidence-ui next-minor publish), inline [¹] superscripts in answer prose (blocked on djed-ai-copilot 1.1.0’s renderAssistantContent slot), and Playwright /assistant visual baselines (Phase 7 noted but not landed). v0.8 closes those follow-ups and lifts the surface from “implemented per spec” to “productively beautiful for a SAP consultant.”

  1. Operator banner scoped to operator surfaces. AppShell.tsx’s PipelineHealthStrip gate inverts from a negative list (“not home”) to a positive allowlist (/ops/* and /home). Customer surfaces (/assistant, /knowledge, /build, /govern) stay clean. The operator-mode pill in the shell still signals operator context for privileged users; the batch-pressure banner is no longer the first thing a SAP consultant sees.
  2. Human-readable scope chip. A new useHumanScopeLabel() composes useMemberships() (the seam ProjectSwitcherLite already uses) and useScope() into Project · Workspace · cell (e.g. Acme · 2025-Q2 Migration · atlas). Numeric Zitadel ids move behind an aria-describedby tooltip so operators can still copy the raw id when needed.
  3. Auto mode + compact override. ATLAS_COMPOSER_MODES gains an auto entry that becomes the default. A multi-mode classifier (a generalization of the existing lookupModeLikely) infers the mode from the query at submit time. The composer renders a single mode chip near Send showing the resolved mode; an override popover lists the seven explicit modes. The hero retains the 7 cards as a discovery surface, with one lucide-react icon per mode (Answer ≈ Sparkles, Lookup ≈ Table2, Compare ≈ Columns2, Trace ≈ GitBranch, Audit ≈ ShieldCheck, Screen ≈ Filter, Plan ≈ ListChecks). AtlasComposerMode grows one icon: LucideIcon field.
  4. Tabbed right rail: Evidence / Activity / Run. AssistantContextRail wraps a Tabs shell. The default tab is phase-aware: Activity while streaming, Evidence when the answer settles with citations, Run on terminal error. EvidenceInspector from djed-evidence-ui adopts here per RFC-011 §2 — the deferred follow-up now lands.
  5. Inline [¹] superscript citations. djed-ai-copilot 1.1.0 adds renderAssistantContent?: (msg) => ReactNode to AssistantMessageListProps. Atlas plugs in <AtlasCitationAnchor> which parses [N] markers in answer prose and replaces them with focusable superscript anchors. Clicking an anchor switches the rail to the Evidence tab and highlights the matching item via a useCitationFocus() context (data-citation-id target, scroll into view, brief flash).
  6. Multiline composer. djed-evidence-ui’s QueryComposer gains multiline?: boolean: autosize <textarea>, Shift+Enter newline, ⌘/Ctrl+Enter submit. The Answer-length toggle moves into the composer actions slot as a single dropdown next to Send, retiring its standalone row between message list and composer.
  7. Conversation list polish. Inline rename replaces window.prompt: AssistantConversationList.ConversationRow swaps to an editable label (Enter commits, Esc cancels) via the existing renameConversation mutation. The flat list groups into time buckets (Today / Yesterday / This week / Older) via a pure helper next to sortByUpdated. A client-side filter input above the list enables fast scanning when the thread count grows.
  8. Live-status copy hardening. assistantStepCopy.liveNarrativeSteps no longer prints “0 statements prepared”; when retrievalCount === 0 mid-stream it shows “Resolver returned no statements yet…”, and on a terminal done it shows “No supporting evidence found.” When the citations_map event carries source_type_breakdown, the rail surfaces “12 BAPI docs · 4 CDS views · 2 SAP notes” instead of just a total.
  9. Confidence + gaps signals. The planner emits confidence: { score, label } on every answer event meta and gaps: string[] when audit mode flagged unverified claims. The rail surfaces a soft warning chip on low confidence; the answer renders a “What we couldn’t verify” callout when gaps is non-empty.
  10. no_evidence becomes constructive. The AssistantErrorRecovery no-evidence branch suggests pivoting to Screen or Lookup mode (1-click via the existing mode-changed telemetry path), with Retry demoted to a tertiary action.
  • RFC-011 follow-ups closed. Phase 6b (multiline composer), inline [¹] citation superscripts, and Playwright /assistant baselines all land in this seed.
  • Upstream package bumps. djed-ai-copilot 1.1.0 and djed-evidence-ui next-minor ship via the cell’s Verdaccio workflow (/opt/djed). Atlas wires both via the existing file: link during dev and adopts after publish.
  • Atlas-design tokens unchanged. tokens.css continues to be the single source; v0.8 introduces no new color, motion, or spacing primitives.
  • No URL contract changes. ?c=<conversationId>, ?runId=<id>, and ?q= continue to resolve exactly as RFC-011 §1 defined.
  • assistantStrings.ts grows. New sections: hero.*, history.buckets.*, history.filterPlaceholder, error.noEvidenceRecovery.*, rail.tabs.*, rail.evidence.*. The default-export shape is preserved; the i18n channel still swaps a single module.
  • New telemetry events. assistant-rail-tab-changed, assistant-citation-anchor-clicked, assistant-mode-auto-resolved (with inferredMode and confidence). All flow through reportAtlasEventatlas-ui-gateway → analytics; no dashboard config change required to ship.

Accepted — landing across seed-c8a1 Phases A–J.

PhaseSubject
ACustomer-shell hygiene (operator-only banner, human scope label, header palette hint)
BComposer mode UX (Auto + compact override)
CConversation-list polish (inline rename, time buckets, filter)
DAtlas adopts djed-ai-copilot 1.1.0 + djed-evidence-ui multiline (chat renderer + answer-length-in-composer)
ERight-rail tabs (Evidence / Activity / Run, EvidenceInspector)
FLive-status copy hardening
GPlanner signal upgrades (source_type_breakdown, confidence, gaps)
HTests scaffold (reducer round-trip, orchestration, Playwright)
Idjed package extensions (renderAssistantContent, multiline, modePickerVariant)
JRFC-012 + atlas-design pointer