Repository navigation
fix(ci): the invisible-character gate never matched anything - #65
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.
|
Warning Review limit reachedNext included review available in 33 minutes. View limit detailsLimit details: You’ve used the included review currently available. This review ran on the free tier because your account doesn't have an assigned seat on this organization's plan. Waiting won't change this — ask an organization admin to assign you a seat, then retry. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Free Run ID: 📒 Files selected for processing (1)
ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Free 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. 📝 WalkthroughSummary by CodeRabbit
WalkthroughThe workflow now detects invisible Unicode characters with Unicode-aware patterns, separates blocking C0/NUL findings from other findings, and applies failure or warning outcomes during validator enforcement. ChangesUnicode character gate
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to This PR corrects the workflow’s invisible-character matching and adds coverage for previously missed control characters; no actionable merge-blocking risk remains beyond normal checks and review. Poem
Note 🎁 Summarized by CodeRabbit FreeThe PR author is not assigned a seat. If you are a newly provisioned user and your organization has automatic seat assignment enabled, open a new pull request to trigger seat assignment. Otherwise, ask an organization administrator to assign a seat through the team management page at https://app.coderabbit.ai/settings/team-management. Comment |
Third layer of the empty-linter fix, scoped by an owner ruling after a census.
DETECTION (layers 1-2, earlier commits) sees everything the pattern covers.
ENFORCEMENT (this commit) distinguishes two classes:
BLOCKING C0 control characters and NUL. Never legitimate; proven damage -
a backspace byte made a workflow unloadable (it never ran once),
and LaTeX maths in wiki files was silently mangled where a
generation step turned backslash-b commands into backspaces.
ADVISORY NBSP, BOM, zero-width marks. A gate-lens census found ~2,100
first-party files carry these as legitimate typography in prose;
blocking would fail 2,333 files estate-wide for no safety gain.
Also checks the lint STEP OUTCOME: if the step crashes, its counts arrive
empty, and a count-only check would silently pass (review finding).
The blocking count re-greps only the files the full pattern already flagged,
so the find expression is not duplicated and cannot drift.
1 file(s). YAML re-parsed per edit; reverted on any mis-apply.
|



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.