Twinned from https://github.com/cfsh/ninefold/issues/594 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer's review of #593. Advisory only — none of these blocked that PR, and the gate it adds is sound as merged.
tools/tests/test_launchers.py — test_every_documented_entry_point_has_a_shebang takes .split("\n", 1)[0] and checks startswith("#!"). A file stored with CRLF yields #!/usr/bin/env python3\r, which passes the assertion while ./tool.py on Linux fails with bad interpreter: /usr/bin/env python3^M — the exact Windows→Linux axis the gate exists for, and the one property its own docstring claims to have covered ("both properties are required for the documented form to work, so both are asserted").
Not reachable today: .gitattributes is * text=auto eol=lf, and all 15 advertised blobs are LF-only (verified byte-wise at 98c801b). So this is hardening, not a live bug. One extra assertFalse(first.endswith("\r")) closes it.
documented_direct_invocations keeps a match only if target in modes — "a real tracked file, not an example". That filter is needed, but it also means a doc advertising ./tools/pr/pol.py (a typo, or a path renamed out from under the doc) is discarded rather than flagged. That is a strictly worse version of the bug this gate prevents: the command does not merely fail to execute, it is not there at all, and the gate is green.
Worth a companion assertion — advertised-but-untracked → fail — with an explicit allowlist for genuine illustrative examples.
Scope note while in there: matches are treated as repo-root-relative, so a ./x.sh advertised from inside its own directory is not resolved. art_dump/sync.cmd runs bash ./sync.sh and art_dump/sync.sh is 100644. Not a live defect — that path goes through bash explicitly, so it needs no exec bit — but it bounds what the scan can see.
The three new tests call git ls-files -s with check=True, so outside a git working tree they error rather than skip. That joins the four context-dependent tests catalogued on #566, and the request for a rule in tools/tests' own docs is already routed to #565 direction 2. No action wanted here.
None.
No comments.