Actual Behavior
Run the local SQLite service with uv run uvicorn openhands.automation.app:app, create several scheduled runs, and update automation definitions through the Canvas while dispatcher bookkeeping is writing. A short concurrent write can raise sqlite3.OperationalError: database is locked while persisting conversation_id. The entrypoint has already started, but the run remains RUNNING without its conversation, command, or sandbox identifiers and its Docker runtime requires manual recovery.
SQLite is the documented local/self-hosted database, so ordinary concurrent scheduler, dispatcher, watchdog, callback, and API writes should tolerate short-lived lock contention.
Acceptance Criteria
Live Reproduction
This occurred in the isolated Canvas factory on 2026-09-14 while four five-minute role schedules were being paused and recreated through the UI. The failed run had already started its Docker entrypoint, then failed while persisting conversation_id; the subsequent failure-state update encountered the same lock and left the run orphaned.
Actual Behavior
Run the local SQLite service with
uv run uvicorn openhands.automation.app:app, create several scheduled runs, and update automation definitions through the Canvas while dispatcher bookkeeping is writing. A short concurrent write can raisesqlite3.OperationalError: database is lockedwhile persistingconversation_id. The entrypoint has already started, but the run remainsRUNNINGwithout its conversation, command, or sandbox identifiers and its Docker runtime requires manual recovery.SQLite is the documented local/self-hosted database, so ordinary concurrent scheduler, dispatcher, watchdog, callback, and API writes should tolerate short-lived lock contention.
Acceptance Criteria
database is locked.Live Reproduction
This occurred in the isolated Canvas factory on 2026-09-14 while four five-minute role schedules were being paused and recreated through the UI. The failed run had already started its Docker entrypoint, then failed while persisting
conversation_id; the subsequent failure-state update encountered the same lock and left the run orphaned.