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

  1. Send setup.confirm_mount only in response to the pending-mount prompt; after the first answer the state is consumed.
  2. Debounce the confirm dialog in the frontend and disable it after one submit.
  3. 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

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


AI-assisted analysis of usestrix/strix@8551339130 (2026-08-15). Data as JSON: /api/errors/0b79336734ff477c. Report an issue: GitHub.