Follow-up to M7.5 (the small PR of the two agreed; the clone reader comes next).
Clean stop
Scheduler.stop() also sets the driver's cancel flag: a review run ends at its next turn.
nisse_core.models.Interruptible wraps the model client (the reviewer's and ask_expert's). Built.stop(), called from the SIGTERM handler, breaks off a model call in flight by raising Stopped (a BaseException) inside it. Outside a call it does nothing, so a post or a write is never interrupted.
A stopped run: the item goes back to READY, no attempt counted, nothing drafted posted, review.interrupted logged. Replies already posted carry their markers, so the next run doesn't repeat them.
Quieter intake
intake.repo_failed is logged when a repository starts failing or the reason changes; intake.repo_ok once when it lists again.
Tests:nisse-review/tests/test_review_stop.py: stop at the next turn, a model call broken off, interrupt outside a call is a no-op, replies not repeated after a stop, build wiring, and the logging.
Docs: Architecture R5, Development Plan M7.5 follow-ups.
Follow-up to M7.5 (the small PR of the two agreed; the clone reader comes next).
**Clean stop**
- `Scheduler.stop()` also sets the driver's cancel flag: a review run ends at its next turn.
- `nisse_core.models.Interruptible` wraps the model client (the reviewer's and `ask_expert`'s). `Built.stop()`, called from the SIGTERM handler, breaks off a model call in flight by raising `Stopped` (a `BaseException`) inside it. Outside a call it does nothing, so a post or a write is never interrupted.
- A stopped run: the item goes back to READY, no attempt counted, nothing drafted posted, `review.interrupted` logged. Replies already posted carry their markers, so the next run doesn't repeat them.
**Quieter intake**
- `intake.repo_failed` is logged when a repository starts failing or the reason changes; `intake.repo_ok` once when it lists again.
**Tests:** `nisse-review/tests/test_review_stop.py`: stop at the next turn, a model call broken off, `interrupt` outside a call is a no-op, replies not repeated after a stop, build wiring, and the logging.
**Docs:** Architecture R5, Development Plan M7.5 follow-ups.
Not included: the same for nisse-dev's stop.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
nisse-review couldn't review this at 080205db7e (2 tries; the last: the driver's call failed: LLM request failed: The read operation timed out). It tries again after the next push, or an operator's review.
nisse-review couldn't review this at 080205db7e67 (2 tries; the last: the driver's call failed: LLM request failed: The read operation timed out). It tries again after the next push, or an operator's `review`.
SIGTERM used to stop only new rounds: a review in progress ran on until
systemd killed it 90s later. Now the scheduler's stop sets the driver's
cancel flag, so the run ends at its next turn, and a model call in flight
is broken off (Interruptible, raising Stopped from the signal handler, only
ever inside a model call). The item goes back to ready, with nothing
drafted posted and no failure counted; replies already posted carry their
markers and are not repeated.
intake.repo_failed is logged when a repository starts failing or the reason
changes, and intake.repo_ok when it lists again, not every round.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Follow-up to M7.5 (the small PR of the two agreed; the clone reader comes next).
Clean stop
Scheduler.stop()also sets the driver's cancel flag: a review run ends at its next turn.nisse_core.models.Interruptiblewraps the model client (the reviewer's andask_expert's).Built.stop(), called from the SIGTERM handler, breaks off a model call in flight by raisingStopped(aBaseException) inside it. Outside a call it does nothing, so a post or a write is never interrupted.review.interruptedlogged. Replies already posted carry their markers, so the next run doesn't repeat them.Quieter intake
intake.repo_failedis logged when a repository starts failing or the reason changes;intake.repo_okonce when it lists again.Tests:
nisse-review/tests/test_review_stop.py: stop at the next turn, a model call broken off,interruptoutside a call is a no-op, replies not repeated after a stop, build wiring, and the logging.Docs: Architecture R5, Development Plan M7.5 follow-ups.
Not included: the same for nisse-dev's stop.
🤖 Generated with Claude Code
https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
nisse-review couldn't review this at
080205db7e(2 tries; the last: the driver's call failed: LLM request failed: The read operation timed out). It tries again after the next push, or an operator'sreview.080205db7etoa85e855fc2