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.
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 |
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 |
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.
| 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 |
UsageLimitBanner.tsx:20 — one deleted
line, restores a paywall message users currently never see.navigateToRoom call. Highest trust return per line
changed.CreateWorkflowClient.tsx:51 — silent
data loss.LiveCallCard.tsx:50 — start the
product conversation now; it will outlast the code change.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.