Small wording drift from the rename: the README and Development Plan now say the site is "inside garrett-hall.com only", while this header and the test's line-75 comment still say "LAN only" (the…
Solid, well-scoped PR that I'd be comfortable merging. It faithfully implements the decided design and the architecture: the vault is one local copy with memory/ mounted read-only on top so the…
This "LAN only" guarantee holds only if remote_ip is the real client. If Caddy is fronted by anything that rewrites the source — a CDN/WAF, a reverse proxy, or hairpin-NAT'd traffic — an…
M6.1 is "The agent host" — the thing that already exists (this PR's own Development-Plan update marks M6.1's host as present). The agents' containers come later under a different milestone. As…
nisse-review couldn't review this at eafe1b9f4a5b (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…
Follow-up review of dev/nisse#165 at 369b6ed5 (one commit since my last look, CI green): it does exactly what the outstanding point asked. DecliningClient now raises the real _refused(model)…
Verified at head and confirmed addressed: DecliningClient raises _refused(model) (test_expert.py:150) and the test asserts the full handback string (165-169), so a wording change in either…
Small, well-scoped fix that reads like the code around it: a ModelRefused(LLMError) mirroring the existing TruncatedResponse pattern, raised from both routes at the exact wire shapes described…
This handback check matches DecliningClient's own hand-rolled message (line 150), not the production wording from _refused() in llm.py — which is only ever asserted at the route level in…
This is the right fix, and the test reads clearly. The root cause is correct: Gitea v28 queues the dismissal (dismiss_stale_approvals) as a job on the push, not in the push itself, so the…
This loop makes up to DISMISS_WAIT_S / 0.5 ≈ 60 GET calls, so it has far more exposure to a transient Gitea error (a 5xx, a dropped connection) than any single call elsewhere in the test. A…
nisse-review couldn't review this at 76d8e36f43e4 (2 tries; the last: hit the 40-turn cap). 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…
Solid milestone: the run kinds (first/later/replies/summary) are cleanly separated, the tool surface per kind is exactly right (replies can't draft, a happy later review is offered still_happy…
This legacy guess (no posts, reviewed non-empty → one review) meets M7.3's unnumbered marker at a collision: marker() keeps the first review's form when n <= 1, so a crashed second review…
The done settle (replies run, and the crash-recovery settle with nothing left) clears fresh but leaves full and happy as they were. If a replies run follows an operator's review comment…
A command comment is never taken in (continue above, so its key stays out of seen), which is what makes stop/review idempotent — good. But it also means _acknowledge runs again on every…
The documented fallback ("the whole PR's diff if they can't be listed") only covers Gitea refusing to list the commits: commit_diff here raises on any failure (a 404 on a dropped commit, a…
nisse-review couldn't review this at 8a366b076d53 (2 tries; the last: the driver's call failed: LLM request failed: The read operation timed out). It tries again after the next push.
Clean, well-scoped follow-up to #154. The wait logic in _next/_ci_settled is correct across all four documented behaviours (I traced every branch: pending, pending-past-limit, no-CI-grace,…