You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Review runs: stop them, narrate them, survive a restart
The review screen could start a pass but never end one. A run had no
stop button, the chat lane said nothing beyond "Working…", clearing the
annotation queue left the reviewer addressing annotations that no longer
existed, and a restart stranded the review on `running` forever — the
completion listener only sees turns the current process started, so
nothing was left to move it and Run pass stayed disabled.
- Stop: POST /api/doc-reviews/{id}/stop interrupts the session, dismisses
the question a killed run leaves parked, logs the same `interrupt`
event the sessions route logs, and hands `running`/`needs_input` back
to `annotating`. Surfaced as Stop pass in the header and a Stop on the
chat lane's working row.
- The working row now names the reviewer's open tool call and updates in
place, so tool traffic never grows the feed.
- Deleting the last open annotation kills the annotation pass it emptied,
identified by the turn text — a chat-lane turn is never collateral.
- Chatting on an approved review no longer drags it back through
`running` → `annotating`; the conversation continues on the same
session either way.
- Boot recovery (`resume_running_reviews`, called from main after the
worker resume, so upgrades get it too via the self-update re-exec):
a `running` review whose turn was genuinely in flight is re-dispatched
verbatim on the same session with the document injection re-armed;
anything else — session gone, turn already finished, user had hit Stop,
dispatch that cannot start — is handed back to `annotating`.
`needs_input` stays parked: answering it spawns the next turn itself.
- The mock reviewer gains `[mock:block]`, a run that parks until
interrupted, so the e2e suite can drive all of this deterministically.
Tests: 6 boot-recovery cases, the resumed-pass kill regression, the
stop/kill/approved-chat cases, and three e2e scenarios. Verified against
a real restart: the pass resumes on the same session and the lane says
so.