Twinned from https://github.com/cfsh/ninefold/issues/854 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer's review of #853. Unclaimed, unlabelled — nothing here blocked that PR (it landed at CONVERGED).
1. notes/merging.md is one output short. Lines ~86–102 describe --why as answering *"for three refusals, not one"* and enumerate them. #853 adds a fourth always-printed output that is deliberately not a refusal (the reviewer's verdict, reported as an answer), so a session reading that section never learns it exists. #853's body states this as a deliberate residual — that file is perimeter.GOVERNANCE, so folding it in cost the same approval and would have taken the diff outside part (d) of #844, which is what @aedanpope asked to avoid. One bullet in that list.
2. verdict_report's short-sha guard runs before the result check, so a GAPS ledger gets the wrong remedy. tools/pr/merge_pr.py, verdict_report(): the len(found.sha) < 7 return sits above if found.label != "rev:pass", so a GAPS verdict carrying a short sha prints
``` reviewer: result=GAPS at sha=abc — too short to identify a commit, so it certifies nothing. ./tools/pr/review_now.py <n> ```
losing the thread.sh pointer and prescribing a fresh ~12-min/~$5 pass at a PR whose ledger is unworked — the loop #844 exists to stop. tier1_authority orders the same two checks the other way (condition 3 result, *then* condition 4 short-sha), and the guard's own rationale is about a green vouching for a family of heads, which a GAPS never does. Move the guard below the label branch; the existing test_a_SHORT_verdict_sha_is_not_reported_as_green only exercises CONVERGED, which is why this is untested either way.
3. The rev:off early return also hides a verdict that is still granting authority. rev:off is exempt in stale_verdict() and unconverged(), but not in tier1_authority() — its comment says so explicitly (*"muting the bot means no verdict, and no verdict already fails below"*). So a PR muted after a green pass that certifies the head is Tier-1 mergeable on that verdict, while --why now prints *"there is nothing to converge with and no verdict is coming"* a few lines above *"would merge — TIER 1"*. poll.py:284 prints its mute line in addition to the verdict and gates only the dead-end review_now.py nudge (poll.py:425, :451) — the same shape here keeps both facts and still kills the dead end.
2 and 3 are the same shape: an early return that discards the answer the line was added to give.
None.
No comments.