Twinned from https://github.com/cfsh/ninefold/issues/377 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer's review of #375. All advisory — the PR reached result=CONVERGED with these deliberately left out rather than folded back in.
1. tools/pr/poll.sh:68 — test("^REVIEWER-VERDICT";"m") anchors at start-of-body, not start-of-line.
In gh's gojq, m means *dot matches newline*; it does not enable multi-line ^, and Go's regexp anchors ^ at start-of-text by default. Measured:
``` "prefix line\nREVIEWER-VERDICT sha=abc" | test("^REVIEWER-VERDICT";"m") -> false "prefix line\nREVIEWER-VERDICT sha=abc" | test("(?m)^REVIEWER-VERDICT") -> true ```
So a bot post whose verdict line is not line 1 is filtered out of nfr entirely — which makes the fallback at poll.sh:72-76 ("*the verdict line is not always line 1 — repeat-gap escalations are prepended above it*") unreachable, and would silently fall back to an older verdict, taking gaps_pointers and the ⚠⚠ GAPS-REPEAT line with it. It also diverges from dispatch.sh:88-95, whose grep -oE is unanchored. No verdict posted so far has this shape (scanned PRs 333/340/341/342/343/346/349/350/360/362/368/375 — zero hits), so this is latent. Fix is one token: (?m).
2. tools/pr/rebuild_f5.sh — hand HEAD back on the verify-failure paths too.
With set -euo pipefail and the checkout at :116-119 sitting after the push, a failed dotnet build (:86) or ./run_tests.sh (:89) exits with HEAD still on f5/integration — the same foot-gun #375 closed for the success path, on the branch of execution where walking away and editing is most likely. The unrecorded-conflict exit at :70 should *stay* parked (you resolve in place), so a blanket trap … EXIT is wrong; guarding the two verify failures is what's needed.
3. tools/reviewer/dispatch.sh:366-395 — the delta compare runs before the decision tree.
Three API calls (pulls/$n for .base.ref, plus two compares) are spent on every moved-head PR each tick, including ones the activity > verdict branch at :400 will spawn a full review for regardless. Moving the block into the branch that consumes it makes the cost proportional to the benefit.
4. Docs say "two API calls"; it's three. README.md:26 and DESIGN.md:71 both undercount by the .base.ref fetch.
5. Worth documenting next to the delta block: it fires only when the base branch's intervening commits touch none of the PR's files.
The digest keys on head-side blob shas, so a rebuild onto a main that also modified the PR's files yields different blobs on each side and falls through to a full review. That is correct and safe, but it means the hit rate on a stacked *reviewer-tooling* rebuild is meaningfully lower than on an unrelated-files one. Writing it down where the code lives stops the token claim from being over-read a third time.
6. #375's body still says "touches tools/reviewer/ only" — it also touches CLAUDE.md, tools/pr/poll.sh and tools/pr/rebuild_f5.sh, and its Test plan / "Not verified" sections predate both. Cosmetic if #375 merges as-is; noted only because CLAUDE.md asks for the body to track the shape.
None.
No comments.