Twinned from https://github.com/cfsh/ninefold/issues/616 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer's review of #600. All three are below that PR's gate floor — filed so the thread can close, not to hold anything.
poll.py:279 is a line citation into a live file, and it has already rottedtools/nflib/verdict.py cites it twice — in the module docstring (*"poll.py:279 (a startswith)"*) and again in find_line's docstring (*"dispatch.sh:266 used an UNANCHORED grep -oE and poll.py:279 used…"*).
On main today, tools/pr/poll.py:279 is record = json.loads(path.read_text(...)) in the heartbeat parser. The startswith it means is at poll.py:413, inside first_verdict_line.
This is not #600's doing and #600 was right not to widen its scope — but it is the same defect class, in the same two docstrings #600 edited for exactly this reason, and #600's sweep ([A-Za-z_0-9-]+\.md:[0-9]+) is by construction blind to it.
It belongs in #614's scope, not a separate fix. The *.sh:NN citations throughout tools/ are a different animal — they point at the deleted pre-port shell scripts, so they are frozen snapshots and cannot rot. A citation into a file that still exists can, and does. Worth #614 deciding that boundary explicitly.
notes/ yourself" is not true of the reviewerCHARTER.md §B, as added by #600:
> ⚠️ Your checkout is on main, so globbing notes/ yourself would compare main's directory against the branch's list and mis-fire on exactly the PR that got it right
The instruction is right and should stay. The justification is not: §4 of the same charter documents gh api "repos/cfsh/ninefold/contents/<path>?ref=<headRefOid>", and all three prior verdicts on #600 used precisely that to list the *branch's* notes/ (G5, each round). The reviewer's checkout being on main does not stop it seeing the branch's tree.
Low consequence — the rule it supports is correct and now test-backed. But it is a durable statement about the machinery, in a prompt file, that is false, and a future reader may act on the capability claim rather than the rule. Suggested rewording: keep "do not raise list drift against the PR"; ground it in *test_charter_notes.py already gates this on the branch, so it is not your job* rather than in *you cannot see it*.
test_charter_notes.py never checks that the carve-outs existtest_every_listed_file_exists exists because "§B points the reviewer at nothing" is the louder failure. The two CARVE_OUTS — notes/history.md, notes/README.md — get no such check: they are subtracted from on_disk, and the third test only asserts they are *absent from the list* and *named in the prose*.
So renaming or deleting either one leaves the charter pointing the reviewer at a file that does not exist, with the gate green. Unlikely, but it is the one direction the new gate does not cover, and it is two lines:
```python for name in sorted(CARVE_OUTS): self.assertTrue((NOTES / name).exists(), f"notes/{name} is carved out in §B but does not exist") ```
None.
No comments.