usestrix/strix · warning · RuntimeError
No mount confirmation is pending
Error message
No mount confirmation is pending
What it means
Raised by _confirm_mount (strix/interface/tui/backend/controller.py:347) when a setup.confirm_mount command arrives but pending_workspace_mount is None — i.e. no working-directory mount question is outstanding. The handler exists solely to answer the one-shot confirmation that _start raised; answering twice, or answering before any question was asked, is a state-machine violation.
Source
Thrown at strix/interface/tui/backend/controller.py:347
return {"started": True}
async def _begin_scan(self, verify: bool) -> None:
if self._on_start is None:
raise RuntimeError("Scan start is unavailable")
self._start_in_progress = True
try:
await self._on_start(verify)
finally:
self._start_in_progress = False
self.setup_mode = False
self.scan_started = True
self.scan_state = "running"
async def _confirm_mount(self, payload: dict[str, Any]) -> dict[str, Any]:
"""Answer the pending working-directory mount asked for in the live view."""
mount = self.pending_workspace_mount
if mount is None:
raise RuntimeError("No mount confirmation is pending")
approved = payload.get("approved")
if not isinstance(approved, bool):
raise TypeError("approved must be a boolean")
self.pending_workspace_mount = None
# Declining skips the mount, it does not abandon the scan. The prompt is
# the whole of the input either way; the working directory is only an
# extra the agent may look at, so the run goes ahead without one.
self.workspace_mount = mount if approved else None
await self._begin_scan(self._pending_verify)
return {"approved": approved}
async def _send_message(self, payload: dict[str, Any]) -> dict[str, Any]:
agent_id = self._required_string(payload, "agent_id")
message = self._required_string(payload, "message")
if self.coordinator is None:
raise RuntimeError("Agent coordinator is unavailable")
if self.scan_loop is None or self.scan_loop.is_closed():
raise RuntimeError("Scan loop is not ready")View on GitHub (pinned to 8551339130)
Solutions
- Send setup.confirm_mount only in response to the pending-mount prompt; after the first answer the state is consumed.
- Debounce the confirm dialog in the frontend and disable it after one submit.
- For drivers, track whether a mount prompt is outstanding (exposed via state) before answering.
Example fix
// before
dialog.onConfirm = () => send("setup.confirm_mount", { approved }); // fires twice on key-repeat
// after
let answered = false;
dialog.onConfirm = () => { if (!answered) { answered = true; send("setup.confirm_mount", { approved }); } }; Defensive patterns
Strategy: validation
Validate before calling
if controller.pending_workspace_mount is None:
print('no mount prompt outstanding; skip setup.confirm_mount')
else:
await controller.handle("setup.confirm_mount", {"approved": approved}) Type guard
def mount_confirmation_pending(controller) -> bool:
return getattr(controller, 'pending_workspace_mount', None) is not None Try / catch
try:
await controller.handle("setup.confirm_mount", payload)
except RuntimeError as exc:
if 'No mount confirmation is pending' in str(exc):
pass # duplicate/late answer; nothing to confirm
else:
raise Prevention
- One-shot the confirm dialog: disable it after the first answer.
- Only send confirm_mount when the UI actually shows the mount prompt.
- Ignore stale queued confirmations after state resets.
When it happens
Trigger: Sending setup.confirm_mount twice (double-answer of the dialog); sending it before a target-free setup.start with mount_working_dir=true; frontend replaying queued commands after a state reset.
Common situations: Dialog double-submit from Enter key repeat; message queues redelivering the confirmation; clients that unconditionally send confirm_mount on every state change.
Related errors
- Scan is already starting or running
- The interactive interface could not start: {exc}
- Unknown command: {command}
- instruction must be a string
- verify must be a boolean
AI-assisted analysis of usestrix/strix@8551339130 (2026-08-15).
Data as JSON: /api/errors/0b79336734ff477c.
Report an issue: GitHub.