Back on a PR it reviewed: a new head gets a later review of the commits since (each one's diff, through the API) and of its earlier points; what was said since gets replies, answered where it was said or skipped with a reason. It signs off once and stays quiet while still happy. Past tuning.review.max_rounds it sums up for the operator and goes quiet, until a push or someone other than the PR's author joins in. An operator's `stop` quiets it; `review` asks for a fresh review. Reviews carry numbered markers and replies their point's key, so recovery posts nothing twice. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
nisse-review
The Review Agent (Part R of the architecture): it reviews every pull request that is ready, in the repositories its Gitea account can read, and posts its review on the PR as a COMMENT review. It reads and comments; it never changes code, approves, or requests changes.
A thin application over nisse-core, with its own small scheduler:
config: its YAML configuration (nisse-review.example.yaml).state: its state store, and a review item (one per PR).scheduler: the duty (ready PRs), one review at a time, recovery after a crash.reader: the repository at the PR's head and base, read-only, from Gitea's archives: the run's executor.review: one review run, and posting it.build,main: putting it together, and the access check at startup.
Bring-up on the development VM: scripts/review-bringup.sh.