Problem
Two more sites carry the un-anchored lookbehind shape that #3497 fixed in _BARE_REJECTION:
scripts/check-pr-fully-clean.py:1664 — _FINDINGS_HEADING_NOT_EXEMPT
scripts/check-pr-fully-clean.py:1692 — _LINE_UNRESOLVED_WORDS
Both contain (?<!non-)(?<!non\s)\bblocking\b. Without a \b on the lookbehind, any longer word ending in those letters satisfies it, so the phrase after it is swallowed.
Why it matters
It is the swallowed-not-clean direction — the instrument reads a genuine finding as absent — which is the direction this file's own design notes repeatedly single out as the dangerous one.
Provenance
Surfaced by the round-5 adversarial review of #3497, which explicitly scoped it out: neither line is touched by that diff, so fixing them there would have widened a PR that had already been through five rounds. The same review confirmed the fix works at the site it does cover — "cannot blocking", "albino blocking", "piano-blocking" and "mono blocking" all stay flagged after \b anchoring.
Fix
Add \b inside each lookbehind, as #3497 did: (?<!\bnon-)(?<!\bnon\s).
Pin it the way #3497 pinned its own: construct an input for each site where a longer word ends in non, run it through the function that consumes the pattern rather than against the pattern itself, and confirm the test fails when the \b is removed. #3497's round-4 finding existed precisely because the tests asserted against a bare regex while the defect lived one layer up.
Check the rest of the file while you are there
These two were found by a reviewer looking at something else. A sweep for every lookbehind in the file — grep -n '(?<!' scripts/check-pr-fully-clean.py — would settle whether there are more, rather than waiting for the next one to surface the same way.
Problem
Two more sites carry the un-anchored lookbehind shape that #3497 fixed in
_BARE_REJECTION:scripts/check-pr-fully-clean.py:1664—_FINDINGS_HEADING_NOT_EXEMPTscripts/check-pr-fully-clean.py:1692—_LINE_UNRESOLVED_WORDSBoth contain
(?<!non-)(?<!non\s)\bblocking\b. Without a\bon the lookbehind, any longer word ending in those letters satisfies it, so the phrase after it is swallowed.Why it matters
It is the swallowed-not-clean direction — the instrument reads a genuine finding as absent — which is the direction this file's own design notes repeatedly single out as the dangerous one.
Provenance
Surfaced by the round-5 adversarial review of #3497, which explicitly scoped it out: neither line is touched by that diff, so fixing them there would have widened a PR that had already been through five rounds. The same review confirmed the fix works at the site it does cover —
"cannot blocking","albino blocking","piano-blocking"and"mono blocking"all stay flagged after\banchoring.Fix
Add
\binside each lookbehind, as #3497 did:(?<!\bnon-)(?<!\bnon\s).Pin it the way #3497 pinned its own: construct an input for each site where a longer word ends in
non, run it through the function that consumes the pattern rather than against the pattern itself, and confirm the test fails when the\bis removed. #3497's round-4 finding existed precisely because the tests asserted against a bare regex while the defect lived one layer up.Check the rest of the file while you are there
These two were found by a reviewer looking at something else. A sweep for every lookbehind in the file —
grep -n '(?<!' scripts/check-pr-fully-clean.py— would settle whether there are more, rather than waiting for the next one to surface the same way.