Twinned from https://github.com/cfsh/ninefold/issues/674 by tools/beads/import_github.py's reconcile pass.
From ninefold-reviewer's F3 on #673, verified against main at 037ddce. Advisory, pre-existing, unclaimed.
test_no_open_test_file_guards_a_governed_surface (tools/tests/test_nflib_perimeter.py, #633) exempts by file:
```python MENTIONS = { "tools/tests/test_nflib_perimeter.py", "tools/tests/test_perimeter_census.py", "tools/tests/test_review_now.py", "tools/tests/test_spawn_dev.py", } ```
Two consequences, and the second is the one that bites later:
tools/tests/test_rebuild_f5.py — added to that set by #673 — is ~1,500 lines, the largest file in tools/tests/. It was exempted for exactly two literals (presubmit.py as fixture data, Ninefold.csproj as a premise it asserts on). Every governed literal it grows from now on is invisible to the contract, with nothing to notice.GOVERNANCE and GOVERNED_TESTS have test_deny_patterns_match_something_real to catch dead patterns; MENTIONS has no equivalent. An entry whose literal is removed, or whose file is deleted, simply keeps passing — and reads as a live decision to whoever finds it.The natural shape is (file, path) pairs, so the exemption is exactly as wide as its reason:
```python
MENTIONS = {
("tools/tests/test_rebuild_f5.py", "presubmit.py"): "changed-path fixture (#604)",
("tools/tests/test_rebuild_f5.py", "Ninefold.csproj"): "guards rebuild_f5's premise; that tool is ungoverned",
…
}
```
plus the MENTIONS-side equivalent of test_deny_patterns_match_something_real: every entry must still resolve to a literal that is still governed, or it fails.
⚠️ Worth doing with the fix for the miss that produced #673, not before it: the same contract also resolves bare basenames through REPO.rglob(name), so a literal "README.md" reaches all eight READMEs in the repo — three of them governed — and reports a test as guarding files its author never named. I hit that with Path("tools") / "office" / "README.md" and worked around it with slashed literals; a contract that pairs file-to-path would want to say something about ambiguous basenames too.
Found while unblocking a red main (#673, #416's shape). Not folded in: #673 must stay a one-line unblock that @aedanpope can approve at a glance, since nothing in the repo can merge until it lands.
None.
No comments.