Before each driver call, over compact_at (0.6) of the prompt budget, the same model is asked for notes over the very request it was about to get, plus one message, so the server's cache covers all but the notes. The notes, with code's list of the calls they replace, become a compaction event that renders in place of its range, keeping word for word what started the work and the last few turns. Rare, large steps keep the prompt's start unchanged between them. A later compaction folds in the earlier; one from an earlier run's view is hidden. Failed notes are logged and fitting takes over. Fitting now applies compactions before it measures, records what it cuts (Trim) and logs each cut as context.trimmed. Wired into both agents' drivers and the benchmark; nisse-dev's helper loop is a follow-up. 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.clones: each repository as a git clone kept between runs (the latest one), checked out at the PR's head and, when read, its base.reader: those trees, read-only, as 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.