A new question supersedes the running one in the conversation (default) or
runs concurrently; the soft per-user cap supersedes the oldest. Stop works
on any replica and on dead runs, and is idempotent. Orphans are reaped once
their lease lapses (45 s) instead of after maxTurnSeconds + 60 s. 503
SHUTTING_DOWN while a replica stops. turn.phase events and startedAt on
message.start. UI API extension assistant 1.2.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A per-turn watchdog (the user's own session) renews the lease, picks up a
Stop requested on another replica, enforces maxTurnSeconds and force-
finalises a wedged engine. One idempotent finaliser: accounting or event
failures can no longer leave a turn RUNNING or registered. On shutdown the
runtime stops taking turns, cancels, waits a grace and finalises the rest
as interrupted. The in-memory concurrent counter is gone. Runs are
published through the AssistantRunTracker stand-in SPI (qqq#1210).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
heartbeat_at, lease_owner, cancel_requested_at, phase and concurrency_mode,
a (user_id, status) index, and a partial unique index so a turn gets one
message.end even when two replicas reap it. Store helpers for a conditional
update of a still-running turn.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>