Fix sheet — 16 changes, 5 patterns

The 59-finding audit collapses into five repeated mistakes. Fixing the pattern once fixes most of its instances, so these are grouped by shared fix, not by feature area. Every line below is a real file:line that was opened and confirmed. All 5 critical issues are in here; the remaining 43 findings are lower-priority polish and live in the backlog.

1. Irreversible actions fire on a single click

Five destructive actions have no confirm step, while message-delete and vault-delete both do. There is no shared confirm-dialog component in the codebase — building one and using it five times is the whole fix.

Where What happens now Fix
ToolRow.tsx:86 "All" grants a tool access to every stored secret, instantly Inline confirm before switching a vault grant to All
RoomMemberDialog.tsx:260 "Remove from group" kicks the member and their paired agent, no warning Confirm naming both the member and their agent
ConnectionDetailView.tsx:271 Plain-text "Disconnect" revokes access on click Confirm mirroring DeleteSecretsConfirmModal
ItemActionsMenu.tsx:269 Uninstall removes a self-built app immediately Confirm reusing ShareDialog's footer pattern
DeleteMessageModal.tsx:46 Dialog auto-focuses red Delete and binds bare Enter Default focus to Cancel

2. Copy says one thing, code does another

Three strings are contradicted by the code shipping beside them. Two are one-line copy edits; one is a behaviour change.

Where What happens now Fix
BuildProgressPanel.tsx:58 Dialog says the agent builds "right here, in your workspace" — this effect router.replace()s the user out to the chat room seconds later Drop the auto-navigate; offer an explicit "Open room" button
WorkflowsDemoClient.tsx:394 Subtitle: "Every workflow pauses for your approval before it acts." There is no approval block in the step palette; a send workflow runs unattended Soften the subtitle, or restore an addable approval block
ToolApprovalCard.tsx:70 "Allow Always" creates a standing grant, never says so One subline: won't ask again for this tool

3. Failures lose the user's work

Four flows drop work or dead-end on failure. Their siblings in the same files already do this right.

Where What happens now Fix
CreateWorkflowClient.tsx:51 Empty catch stops the spinner; the localStorage draft was already deleted at CreateWorkflowView.tsx:1149, so the built workflow is gone with no message Surface e.message; delete the draft only after success
CommandCenterTab.tsx:2338 Snooze/dismiss vanish permanently — Resolve, next to it, gets a toast with Undo Route both through the shared toast with Undo
CalendarPage.tsx:244 Call-history error is static text; the transcript fetch in the same panel has a Retry Retry button calling the existing refetch
BuildProgressPanel.tsx:271 Failed build offers only "Dismiss" — the prompt and transcript are lost "Try again" that resends the last prompt
Where What happens now Fix
LiveCallCard.tsx:50 The only signal a call is being recorded and transcribed is an ambient "Live meeting stream" label shown after listening starts. No opt-in exists anywhere One-time notice or opt-in before the first AI-listened call

Needs a product/legal call on wording, not just an engineering fix — two-party-consent jurisdictions make this the highest-exposure item in the audit.

5. UI advertises actions that can't be reached

Where What happens now Fix
UsageLimitBanner.tsx:20 File begins return null; — when the usage cap disables the composer, the only cue is a greyed input Delete the return null; (one line)
YoursRow.tsx:59 Parent wires state, a mutation and a dialog for scoped installs; no menu item opens it Add "Install to a room…" to ItemActionsMenu
BuildProgressPanel.tsx:224 A finished build offers a preview toggle and refine box — no Publish Primary "Publish" opening the existing PublishDialog

Ordering

  1. UsageLimitBanner.tsx:20 — one deleted line, restores a paywall message users currently never see.
  2. Pattern 2 — two copy edits and one deleted navigateToRoom call. Highest trust return per line changed.
  3. CreateWorkflowClient.tsx:51 — silent data loss.
  4. Pattern 1 — build the confirm dialog once, apply five times.
  5. LiveCallCard.tsx:50 — start the product conversation now; it will outlast the code change.
  6. Pattern 3 and 5 remainders — ordinary sprint work.

Provenance

Static code audit, 2026-08-18 — no runtime observation, so states were read from JSX and handlers. Full scoring and all 59 findings: 2026-08-18-ux-audit.html. Searchable ticket table: 2026-08-18-backlog.html (.csv for import). Two findings not listed here are contested (one verifier refuted each) and flagged as such in the full report.