Twinned from https://github.com/cfsh/ninefold/issues/831 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer review of #828 (poll.py unreplied-human marker, design 006 piece 7). All three are below the gate floor — that PR is CONVERGED. Unclaimed.
1. empty_review_note scopes by author, not by unanswered state — tools/pr/poll.py:172-195
theirs collects the paths of *every* inline comment that author has on the PR, whatever thread it sits in and whichever review it belongs to. So a bare empty-bodied APPROVED review — the common shape after an inline round has already been answered in-thread — renders:
``` REV aedanpope [APPROVED] …: (body empty — the ask is in the INL line(s) below: CLAUDE.md) ```
asserting an ask that the ledger three lines above has already decided does not exist. It over-signals rather than under-signals, so it is the safe direction. owed is already in hand at the call site, so the annotation can be gated on it; otherwise the wording drops *"the ask is"* for *"this author inline comments are"*. A pointer should predict what is at the other end of it (DEV_PRINCIPLES C1).
2. The pointer lines outdent from their own header — tools/pr/poll.py:341-342
Unanswered.render() (tools/nflib/ledger.py) emits a two-space indent, so each ask prints level with ⚠ YOU OWE … and *left* of the Each ask FULL text … line it is subordinate to, while its own reply-cmd continuation sits at six:
``` ⚠ YOU OWE aedanpope A REPLY — 1 unanswered ask(s), oldest first. Each ask FULL text is printed verbatim below; these are pointers. [inline CLAUDE.md] aedanpope @ … reply-cmd: … ```
In a block whose whole value is scannability at line 4. print(" " + item.render()) at the call site fixes it without touching nflib (denied by the perimeter, and #827 territory), and leaves merge_pr.py rendering unchanged.
3. wrap_up.py asks "is my chunk done" without the ledger — the third caller
After #827/#828, nflib.ledger has two callers: merge_pr.py (refuse the merge) and poll.py (shout in the digest). tools/pr/wrap_up.py asks the same question a third time — it re-checks open PRs, held issues and the tracked file against GitHub and refuses on live work — and its only notion of "ledger" is tracked-prs.txt, not feedback. So poll.py can now suppress WRAP_UP on an unanswered ask while wrap_up.py reports clean, which is the digest-vs-gate divergence #732 is about, one surface over. notes/chunks.md:133 already asserts the behaviour in prose (*"An owed ledger still blocks regardless"*).
This is also the 3-caller point DEV_PRINCIPLES B9 asks for, so the shape is settled rather than guessed.
None.
No comments.