M7.3: nisse-review's first slice
CI / checks (push) Skipped
CI / checks (pull_request) Successful in 1m49s
CI / e2e (pull_request) Successful in 3m18s

A new package over nisse-core: it reviews every ready PR in the
repositories its account can read, and posts one COMMENT review.

- scheduler: each round, open PRs per readable repository (or the
  configured repositories); an item per PR, ready unless draft or WIP;
  closed with the PR. One review at a time, oldest first.
- reader: the repository at head and base from Gitea archives, unpacked
  and read in Python (read_file, list_files, search_code), and its issues;
  bound to the item's repository; no git, no shell.
- review: starts from the PR, commits, diff, comments, closed issues, CI;
  comment drafts a point on any existing line; post_review posts one
  COMMENT review at the head, inline where Gitea takes it, else as links in
  the summary. ask_expert; vault and memory (memory/nisse-review).
- L8: posting is an intent; recovery asks Gitea for the marked review and
  never posts twice; with Gitea down, the item waits.
- Failures retried, then said on the PR until the next push.
- Startup refuses an account that can push to or administer any repo.
- nisse-core gitea: readable_repositories, open_pull_requests, diff,
  commits, archive, issue, search_issues, reviews, post_review; PR fields.
- Bring-up: scripts/review-bringup.sh; nisse-review.example.yaml.
- Tests: unit over a fake Gitea and scripted model; a live test
  (NISSE_REVIEW_GITEA_TOKEN) reviews a PR in a fresh test repository.
- Docs: Development Plan M7.3, Tuning Guide (tuning.review.*).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
This commit is contained in:
dongarandClaude Opus 5.5 committed 2026-10-13 22:34:02 +00:00
1 parent fc71d3da75
commit f59d974a95
24 files changed
+2330 -7

No files matched your search

+38
View File
@@ -0,0 +1,38 @@
# Example configuration for nisse-review (Part R). Copy to nisse-review.yaml
# (or point NISSE_CONFIG at your copy) and edit.
#
# - Secrets are ${VARIABLE} references, resolved from the environment (or the
# .env file NISSE_ENV names) at startup. Nothing else goes there.
# - Unknown keys are errors.
# - Its Gitea account must have read access only, to every repository it can
# see: startup refuses an account that can push to one (R3).
state_db: ~/nisse-review/state.db
llm: # L9: LiteLLM is the only LLM destination
base_url: http://litellm.example:4000
token: ${NISSE_LLM_TOKEN}
# max_output_tokens: 8192
# request_timeout_s: 600
roles:
reviewer: qwen3.8-27b # drives the review: the local model (R5)
expert: claude-opus-5-5 # ask_expert's
gitea:
url: https://gitea.example
token: ${NISSE_GITEA_TOKEN} # the nisse-review account's
operators: [operator] # whose comments are the operator's (R4)
# repositories: [owner/repo] # only these; unset, every one it can read
# vault: # L10; memory/nisse-review rw for its memory
# root: ~/vault
# folders:
# memory/nisse-review: rw
# notes: ro
# tuning: # docs/Tuning-Guide.md
# review: {poll_s: 60, max_turns: 40, diff_chars: 60000, attempts: 2}
# expert: {consult_budget: 3}
# context: {keep_recent_turns: 6, safety_margin: 0.1}