fix(ci): the invisible-character gate never matched anything - #62
fix(ci): the invisible-character gate never matched anything#62hyperpolymath wants to merge 1 commit into
Conversation
MEASURED 2026-08-27: this gate's pattern caught 0 OF 6 invisible-character test
cases. It has never detected an NBSP, zero-width space, BOM, soft hyphen, bidi
override or word joiner.
ROOT CAUSE: the pattern used UTF-8 BYTE sequences (\xc2\xa0) while grep -P
matches CHARACTERS. Bytes c2 a0 are ONE character U+00A0; \xc2\xa0 asks for TWO
characters, U+00C2 then U+00A0, which is never present.
grep -P '\xc2\xa0' -> miss
grep -P '\x{a0}' -> MATCH
Only \x00 worked, being single-byte in both readings.
FIXED: codepoint escapes; C0 control characters \x01-\x08,\x0B,\x0C,\x0E-\x1F
added (TAB/LF/CR excluded); and grep -a, without which grep skips any NUL-bearing
file as binary.
The C0 range matters: a stray BACKSPACE byte made a workflow unparseable in
developer-ecosystem, so it never ran, and this linter called it clean.
Canonical fix: hyperpolymath/empty-linter#70. 1 file(s) here.
VERIFIED: YAML re-parsed, and the corrected pattern was confirmed to catch a real
NBSP before the change was kept.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📜 Recent review details⏰ Context from checks skipped due to timeout. (2)
|
| Layer / File(s) | Summary |
|---|---|
Gate pattern and scan update .github/workflows/dogfood-gate.yml |
The pattern uses Unicode code-point escapes, includes selected C0 controls and the word joiner, and places the null-byte match first. The grep command now uses -a to treat binary files as text. |
Estimated code review effort: 2 (Simple) | ~10 minutes
Merge Risk: ⚪ Minimal · up to 57ad5
The workflow change is localized to invisible-character matching, and no concrete merge-blocking correctness or deployment risk remains. It is merge-ready after normal checks.
Poem
I’m a rabbit with a tidy gate,
Invisible bytes now meet their fate.
Code points hop in a clearer line,
Binary files join the scan in time.
The workflow checks what it should find.
🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
| Check name | Status | Explanation | Resolution |
|---|---|---|---|
| Linked Issues check | The PR implements the codepoint escapes, C0 control range, and grep -a requirements for the CI gate. It does not implement the linked issue's separate leading-BOM check, compiled-linter updates in std… | Add the separate byte-wise leading-BOM check, update stdlib/ByteDetector.affine and config.ncl with the matching C0-control logic, and update the other inlined gate copies required by issue #70. Verify all target characters, corrupted workf… |
✅ Passed checks (4 passed)
| Check name | Status | Explanation |
|---|---|---|
| Title check | ✅ Passed | The title clearly identifies the main change: fixing the CI invisible-character gate. It is concise and specific. |
| Description check | ✅ Passed | The description explains the root cause, implemented changes, and verification results. It does not use the repository headings or include the RSR Quality Checklist, but it contains the key informatio… |
| Out of Scope Changes check | ✅ Passed | The two-line change is limited to .github/workflows/dogfood-gate.yml and directly supports the invisible-character gate fix. No unrelated changes are present. |
| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0… |
Full details: Description check
Explanation
The description explains the root cause, implemented changes, and verification results. It does not use the repository headings or include the RSR Quality Checklist, but it contains the key information needed to review this small change.
Full details: Linked Issues check
Explanation
The PR implements the codepoint escapes, C0 control range, and grep -a requirements for the CI gate. It does not implement the linked issue's separate leading-BOM check, compiled-linter updates in stdlib/ByteDetector.affine and config.ncl, or estate-wide pattern updates. These are required coding objectives in issue #70.
Resolution
Add the separate byte-wise leading-BOM check, update stdlib/ByteDetector.affine and config.ncl with the matching C0-control logic, and update the other inlined gate copies required by issue #70. Verify all target characters, corrupted workflows, clean files, and legitimate whitespace.
Full details: Docstring Coverage
Explanation
No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0 files. (1 skipped: 1 unsupported.)
- Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
- Create stacked PR
- Commit on current branch
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands.
|
Up to standards ✅🟢 Issues
|



Measured 2026-08-27: this gate caught 0 of 6 invisible-character test cases. It has never detected an NBSP, zero-width space, BOM, soft hyphen, bidi override or word joiner.
Root cause
The pattern used UTF-8 byte sequences (
\xc2\xa0) whilegrep -Pmatches characters. Bytesc2 a0are one character U+00A0;\xc2\xa0asks for two, U+00C2 then U+00A0 — never present.Only
\x00worked, being single-byte in both readings. The gate ran, passed, and could not see what it exists to see.Fixed
\x01-\x08,\x0B,\x0C,\x0E-\x1Fadded (TAB/LF/CR excluded)grep -a— without it grep skips any NUL-bearing file as binaryThe C0 range matters: a stray backspace byte made a workflow unparseable in
developer-ecosystem, so it never ran — and this linter called it clean.Canonical fix: hyperpolymath/empty-linter#70. 1 file(s) here.
Verified: YAML re-parsed, and the corrected pattern was confirmed to catch a real NBSP before the change was kept.