Vanta Desktop - User Flow Report

2026-07-18 - Full native desktop audit from cold start through work, approval, recovery, setup, and release

flow-app-shellflow-navigationflow-ai-chatflow-errors

Summary

The current desktop is no longer the broken prototype shown in earlier screenshots. Source and signed-package flow suites pass across desktop, compact, light, dark, 200% zoom, 500-turn sessions, queues, recovery, attachments, session operations, Outputs, and Connect. A real Codex turn read the correct isolated project, and a real Ask-mode overwrite displayed an approval and changed the file only after Allow once.

The primary contract is still not release-clean. The shared Markdown renderer removes intraword underscores from both user and assistant messages, the official live proof times out on that corruption, drafts are global and volatile rather than session-scoped, and the current local 0.9.2 artifact is signed but rejected by Gatekeeper as unnotarized. Accessibility, visual regression, cold-user success, and external-account coverage remain proof gaps.

Highest-impact defect: exact text is not preserved. VANTA_DESKTOP_AUDIT_... renders as VANTADESKTOPAUDIT_.... This can corrupt file names, environment variables, IDs, hashes, and exact-output tasks.

Flow: Start or resume work

Pattern source: flow-app-shell + flow-navigation - Entry point: native launch or an existing task

Steps

  1. 1Open Work

    The shell restores the project, active task, session rail, provider model, runtime state, and contextual inspector state.

    Primary action: Select a task or New task - opens the central work stream.

    If the inspector is opened below 1080px - it overlays instead of shrinking Work.
  2. 2Name the outcome

    The composer exposes project, host, registered tools, MCP, memory, model, access mode, and attached-file chips.

    Primary action: Send - begins a kernel-gated turn.

    If a draft belongs to another task - there is currently no session-scoped draft guard.
  3. 3Follow the run

    Partial text, tool activity, runtime state, Stop, Background, and queued turns stay visible.

    Primary action: Stop, queue, or wait - controls the active run.

  4. 4Approve consequential work

    Ask mode shows the exact action and reason. A real overwrite was blocked until Allow once and then verified on disk.

    Primary action: Allow once or Reject - resolves the pending kernel action.

  5. 5Review the result

    The transcript, tool receipts, changed-file evidence, Outputs, and contextual inspector preserve the work.

    Primary action: Open output or continue - keeps the task context.

    If the response contains intraword underscores - the current renderer changes the visible text.

Screen inventory

ScreenPurposePrimary actionStates
Work shellResume a project/taskSelect taskloading, ready, project/provider error
ConversationUnderstand request, progress, and resultSend/Stopempty, streaming, approval, failed, recovered
ComposerSubmit outcome and contextSend/Queueidle, busy, attached files, full-access warning
InspectorReview activity, files, diff, preview, receiptsOpen evidenceempty, populated, narrow drawer

Anti-pattern audit

CheckVerdictNote
One dominant work surfacePASSCentral transcript remains the primary surface; inspector is contextual.
Visible agent state and controlPASSStreaming, tools, Stop, Queue, approvals, receipts, and recovery are visible.
Preserve user input and exact outputFAILDrafts are not per-session/persistent, and intraword underscores are removed by rendering.
Explain model/runtime scopeWARNThe header can show gpt-5.5 while the runtime strip says No model; the two model layers are not named.

Flow: Navigate and manage tasks

Pattern source: flow-navigation - Entry point: sidebar project/task rail

Steps

  1. 1Choose a stable destination

    Work, Operate, Outputs, and Connect remain in a fixed sidebar.

    Primary action: Select destination - changes the main surface without changing project context.

  2. 2Find a task

    Pinned project tasks and searchable recent sessions are separated.

    Primary action: Open task - restores messages and view position.

  3. 3Manage safely

    Rename, pin, archive with Undo, recoverable Trash, bulk selection, and Shift-range selection are implemented.

    Primary action: Archive, restore, or delete - updates the session store with feedback.

Screen inventory

ScreenPurposePrimary actionStates
SidebarProject and task navigationOpen taskpinned, recent, search, bulk mode, trash
OperateStanding work and runtime oversightInspect runidle, active, failed
OutputsReview artifacts across tasksOpen artifact/source taskempty, filtered, populated

Anti-pattern audit

CheckVerdictNote
Command palette is not the only navigationPASSEvery primary destination has a persistent visible entry.
Destructive actions are recoverablePASSArchive Undo and recoverable Trash are covered by source and packaged flows.
Task context is stable while switchingWARNThe global composer draft can follow the operator into another session.

Flow: Connect a provider, tool, MCP server, or channel

Pattern source: flow-navigation + flow-errors - Entry point: Connect or /setup

Steps

  1. 1Open Connect

    Outcome cards summarize providers, capabilities, MCP, and messaging as ready, needs setup, or unavailable.

    Primary action: Choose one connection - opens only the relevant setup.

  2. 2Enter and validate configuration

    Secrets remain private; Telegram validates against the API before saving and exposes pairing versus allowlist.

    Primary action: Save and test - returns a readiness result.

  3. 3Start or inspect the gateway

    The project gateway can start from Connect, while status and channel verification provide redacted evidence.

    Primary action: Start gateway - enables channel delivery.

Screen inventory

ScreenPurposePrimary actionStates
Connect overviewSelect an outcomeBrowse/setupready, needs setup, unavailable
Model pickerSelect provider and model scopeUse modeldiscovered, offline catalog, discovery error
MCP controlAuthorize and inspect servers/toolsConnect/testready, unhealthy, auth required
Messaging setupConfigure a channelSave/test/startnot configured, ready, failed

Anti-pattern audit

CheckVerdictNote
Setup is outcome-orientedPASSConnect avoids a single long settings maze and /setup telegram routes directly.
Real channel evidenceWARNTelegram connect/poll/disconnect is live now, but no audited inbound-message to Vanta-response round trip was executed in this audit.
Broad connector claimsPASSVerification reports one live channel and 21 not configured rather than calling the catalog ready.

Flow: Recover from failure

Pattern source: flow-errors + flow-ai-chat - Entry point: startup, provider, tool, queue, or run failure

Steps

  1. 1Keep context visible

    The shell classifies project, provider, and service setup failures instead of replacing the app with a blank page.

    Primary action: Retry or configure the affected dependency - stays in place.

  2. 2Preserve partial work

    Failed runs retain partial output, checkpoint data, and classified failure details.

    Primary action: Retry failed step or edit request - resumes from evidence.

  3. 3Verify the recovery

    Receipts show whether the retried action actually completed.

    Primary action: Review receipt - closes the trust loop.

    If the proof itself fails - it must dump raw response, rendered text, root, provider, and errors; the current live proof does not.

Screen inventory

ScreenPurposePrimary actionStates
Startup errorRepair project/provider/runtimeRetry/configureproject, service, provider
Run recovery cardResume interrupted workRetry/editpartial, failed, retrying, recovered
Approval cardResolve blocked consequential actionAllow/rejectpending, accepted, rejected

Anti-pattern audit

CheckVerdictNote
Error names cause and actionPASSStartup and run errors are scoped and actionable.
Failure preserves partial workPASSRecovery fixtures pass in source and packaged applications.
Release proof fails diagnosticallyFAILdesktop:live-turn:proof waits 150 seconds for corrupted rendered text and emits no useful failure state.
Offline draft recoveryFAILThe composer draft is React state only; reload/crash loses it.

Executed evidence

CheckResultWhat it does not establish
24 Vitest files / 64 desktop testsPASSDoes not prove Electron, real providers, or physical assistive technology.
desktop:renderer:typecheckPASSDoes not prove runtime behavior.
Source and packaged flow suitesPASSMost flows use deterministic local fixtures; no notarization or paid external accounts.
Real Codex read in isolated desktop projectPARTIALProvider/root/tool path works; rendered output corrupts underscores.
Real Ask-mode overwritePASSProves one file-edit approval, not every tool/risk class.
Telegram verificationPASSProves connect/poll/disconnect, not a full inbound/outbound conversation.
Current local app signaturePARTIALCode signature is valid; Gatekeeper rejects the local candidate as unnotarized. The published CI 0.9.2 proof is separate.

Open questions & parked items