Skip to content

0.0.147

Choose a tag to compare

@github-actions github-actions released this 29 Jul 15:37
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.