fix: durable assistant turns - lease, heartbeat, cross-pod Stop, never refuse a question #49

Merged
KofTwentyTwo merged 6 commits from feature/durable-turns into develop 2026-10-14 22:06:19 +00:00
6 Commits
Author SHA1 Message Date
james.maes 3d288ddfe9 Merge remote-tracking branch 'origin/develop' into feature/durable-turns
# Conflicts:
#	CHANGELOG.md
#	UPGRADE.md
2026-10-14 16:59:47 -05:00
james.maesandClaude Opus 5.5 c751fc055c docs: durable turns upgrade notes and changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:36:43 -05:00
james.maesandClaude Opus 5.5 50898a927d test(turns): completion, error after streaming, disconnect, refresh, supersede, concurrency, wedged provider, pod kill, rolling deploy, cross-pod Stop
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:36:42 -05:00
james.maesandClaude Opus 5.5 f60009f595 feat(api): never refuse a question; cross-pod Stop; GET /turns/active
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>
2026-10-14 16:36:41 -05:00
james.maesandClaude Opus 5.5 ffa7e25bf4 fix(turns): every turn is finalised: watchdog, lease, hard deadline, shutdown
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>
2026-10-14 16:36:41 -05:00
james.maesandClaude Opus 5.5 00861af42c feat(turns): lease, heartbeat, cancel request and phase columns on assistant_turn
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>
2026-10-14 16:36:39 -05:00