RFC-012 — Assistant v0.8 polish
RFC-012 — Assistant v0.8 polish
Section titled “RFC-012 — Assistant v0.8 polish”Context
Section titled “Context”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.”
Decision
Section titled “Decision”- Operator banner scoped to operator surfaces.
AppShell.tsx’sPipelineHealthStripgate 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. - Human-readable scope chip. A new
useHumanScopeLabel()composesuseMemberships()(the seamProjectSwitcherLitealready uses) anduseScope()intoProject · Workspace · cell(e.g.Acme · 2025-Q2 Migration · atlas). Numeric Zitadel ids move behind anaria-describedbytooltip so operators can still copy the raw id when needed. - Auto mode + compact override.
ATLAS_COMPOSER_MODESgains anautoentry that becomes the default. A multi-mode classifier (a generalization of the existinglookupModeLikely) 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 onelucide-reacticon per mode (Answer ≈Sparkles, Lookup ≈Table2, Compare ≈Columns2, Trace ≈GitBranch, Audit ≈ShieldCheck, Screen ≈Filter, Plan ≈ListChecks).AtlasComposerModegrows oneicon: LucideIconfield. - Tabbed right rail: Evidence / Activity / Run.
AssistantContextRailwraps a Tabs shell. The default tab is phase-aware: Activity while streaming, Evidence when the answer settles with citations, Run on terminal error.EvidenceInspectorfromdjed-evidence-uiadopts here per RFC-011 §2 — the deferred follow-up now lands. - Inline
[¹]superscript citations.djed-ai-copilot1.1.0 addsrenderAssistantContent?: (msg) => ReactNodetoAssistantMessageListProps. 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 auseCitationFocus()context (data-citation-idtarget, scroll into view, brief flash). - Multiline composer.
djed-evidence-ui’sQueryComposergainsmultiline?: 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. - Conversation list polish. Inline rename replaces
window.prompt:AssistantConversationList.ConversationRowswaps to an editable label (Enter commits, Esc cancels) via the existingrenameConversationmutation. The flat list groups into time buckets (Today / Yesterday / This week / Older) via a pure helper next tosortByUpdated. A client-side filter input above the list enables fast scanning when the thread count grows. - Live-status copy hardening.
assistantStepCopy.liveNarrativeStepsno longer prints “0 statements prepared”; whenretrievalCount === 0mid-stream it shows “Resolver returned no statements yet…”, and on a terminaldoneit shows “No supporting evidence found.” When thecitations_mapevent carriessource_type_breakdown, the rail surfaces “12 BAPI docs · 4 CDS views · 2 SAP notes” instead of just a total. - Confidence + gaps signals. The planner emits
confidence: { score, label }on everyanswerevent meta andgaps: 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 whengapsis non-empty. no_evidencebecomes constructive. TheAssistantErrorRecoveryno-evidence branch suggests pivoting to Screen or Lookup mode (1-click via the existingmode-changedtelemetry path), with Retry demoted to a tertiary action.
Consequences
Section titled “Consequences”- RFC-011 follow-ups closed. Phase 6b (multiline composer), inline
[¹]citation superscripts, and Playwright/assistantbaselines all land in this seed. - Upstream package bumps.
djed-ai-copilot1.1.0 anddjed-evidence-uinext-minor ship via the cell’s Verdaccio workflow (/opt/djed). Atlas wires both via the existingfile:link during dev and adopts after publish. - Atlas-design tokens unchanged.
tokens.csscontinues 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.tsgrows. 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(withinferredModeandconfidence). All flow throughreportAtlasEvent→atlas-ui-gateway→ analytics; no dashboard config change required to ship.
Status
Section titled “Status”Accepted — landing across seed-c8a1 Phases A–J.
| Phase | Subject |
|---|---|
| A | Customer-shell hygiene (operator-only banner, human scope label, header palette hint) |
| B | Composer mode UX (Auto + compact override) |
| C | Conversation-list polish (inline rename, time buckets, filter) |
| D | Atlas adopts djed-ai-copilot 1.1.0 + djed-evidence-ui multiline (chat renderer + answer-length-in-composer) |
| E | Right-rail tabs (Evidence / Activity / Run, EvidenceInspector) |
| F | Live-status copy hardening |
| G | Planner signal upgrades (source_type_breakdown, confidence, gaps) |
| H | Tests scaffold (reducer round-trip, orchestration, Playwright) |
| I | djed package extensions (renderAssistantContent, multiline, modePickerVariant) |
| J | RFC-012 + atlas-design pointer |