nisse-review: read long files in parts; a retry starts afresh
CI / checks (push) Skipped
CI / checks (pull_request) Successful in 1m51s
CI / e2e (pull_request) Successful in 4m38s

From its failed review of #156: read_file stopped at 20,000 characters
with no way on, so the reviewer hunted each file's end a definition at a
time and ran out of turns; its retry carried every read before it, and a
model call timed out. Both drafts were lost.

- read_file takes a start line and says where the next part starts.
- Each run's view starts at its brief (Transcript.since); the log keeps
  the rest.
- A run out of turns with points drafted posts them as a partial 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-17 06:48:47 +00:00
1 parent 082631eafe
commit 1a7836167d
7 files changed
+141 -12

No files matched your search

+16 -2
View File
@@ -38,6 +38,12 @@ from nisse_review.state import (
pr_of,
)
PARTIAL = (
"A partial review: I ran out of turns before finishing, so these are the "
"{n} point(s) I had drafted, without an overall view. A new push gets a "
"full look."
)
_WIP = re.compile(r"^\s*(\[wip\]|wip\b)", re.IGNORECASE)
@@ -238,10 +244,18 @@ class Scheduler:
outcome, draft = self._reviewer.run(item.id, pr, repo)
finally:
repo.close()
if outcome.kind != "wait":
if outcome.kind == "capped" and draft.comments:
# Out of turns with points drafted: they're worth more posted
# than lost (#156), as a review that says it's partial.
self._oplog.emit(
"review.partial", cause=outcome.note, work_item=item.id
)
summary = PARTIAL.format(n=len(draft.comments))
elif outcome.kind != "wait":
self._failed(item, known, pr, outcome.note or outcome.kind)
return
summary = str((outcome.arguments or {}).get("summary", ""))
else:
summary = str((outcome.arguments or {}).get("summary", ""))
posted = self._reviewer.post(item.id, known.repo, pr, summary, draft)
except GiteaError as exc:
self._failed(item, known, None, f"Gitea: {exc}")