Symptom
governance / Validate Hypatia Baseline is red on main and has been the only
real red there. Run 35783374301, job 106934294699, 38s (a real verdict, not a
startup death):
##[error]Gate failed: 5 unfiltered finding(s) at or above 'info'
A standing red on main is itself a detector-blinding condition: while it sits
there, nobody can tell a NEW gate failure from this one.
What the five findings are
| n |
rule |
severity |
location |
| 3 |
security_errors / secret_detected |
critical |
lib/hypatia/scanner_suppression.ex:252 |
| 2 |
code_safety / zig_ptr_cast, zig_align_cast |
high |
ffi/zig/src/main.zig |
Both clusters are false positives, and they fail for different reasons.
The three secrets: a detector matching the prose that describes it
Line 252 is a comment that documents the three @secret_patterns which match on
form alone — it spells out api_key = "...", secret = "...", password = "...".
All three patterns match the comment that documents them. Same family as the
RE005 defect in #834, where the rule "matched the prose arguing against the thing
it was looking for". Documenting a false-positive class creates instances of it.
The two Zig casts: the mandatory opaque-handle idiom
Already filed as #834. ffi/zig/src/main.zig declares pub const Handle = opaque {},
so recovering *HandleState requires exactly @ptrCast(@alignCast(handle)). The
rule matches a bare ~r/@ptrCast/ at :high and reports at main.zig:1 rather than
the cast site, so no per-line directive can reach it.
Root cause of the secrets half — the gate runs a scanner older than our own fix
The governance gate builds the scanner from a pinned commit and scans HEAD.
They are different commits.
- pin:
0e913426, 2026-09-06 (HYPATIA_PIN in hyperpolymath/standards
.github/workflows/governance-reusable.yml)
- scanned tree:
main @ 8e8943f, 2026-09-22
bc8812e ("label-aware secret suppression", #782, 2026-09-14) is an ancestor of
main and is not an ancestor of the pin — verified with git merge-base --is-ancestor in both directions. The pinned lib/hypatia/scanner_suppression.ex
has 4 occurrences of the label/context-suppression identifiers; HEAD's has 12.
Our own cure for this exact false-positive class is in the repo and absent from
the scanner enforcing the gate.
This also constrains which cures are even possible: compiled-in suppression
(@default_exemptions, @training_corpus_paths) lives in the scanner and cannot
affect this gate. Only scanned-tree mechanisms can — .hypatia-ignore,
.hypatia-baseline.json, and inline # hypatia: allow directives.
Acceptance criteria
Structural follow-up (not this issue)
Bumping HYPATIA_PIN past bc8812e would cure the secrets half at the source,
but that pin is a required status check on ~120 caller repos, so it is a
cross-repo change with that blast radius. Filed separately against standards.
Symptom
governance / Validate Hypatia Baselineis red onmainand has been the onlyreal red there. Run 35783374301, job 106934294699, 38s (a real verdict, not a
startup death):
A standing red on
mainis itself a detector-blinding condition: while it sitsthere, nobody can tell a NEW gate failure from this one.
What the five findings are
security_errors/secret_detectedlib/hypatia/scanner_suppression.ex:252code_safety/zig_ptr_cast,zig_align_castffi/zig/src/main.zigBoth clusters are false positives, and they fail for different reasons.
The three secrets: a detector matching the prose that describes it
Line 252 is a comment that documents the three
@secret_patternswhich match onform alone — it spells out
api_key = "...",secret = "...",password = "...".All three patterns match the comment that documents them. Same family as the
RE005 defect in #834, where the rule "matched the prose arguing against the thing
it was looking for". Documenting a false-positive class creates instances of it.
The two Zig casts: the mandatory opaque-handle idiom
Already filed as #834.
ffi/zig/src/main.zigdeclarespub const Handle = opaque {},so recovering
*HandleStaterequires exactly@ptrCast(@alignCast(handle)). Therule matches a bare
~r/@ptrCast/at:highand reports atmain.zig:1rather thanthe cast site, so no per-line directive can reach it.
Root cause of the secrets half — the gate runs a scanner older than our own fix
The governance gate builds the scanner from a pinned commit and scans HEAD.
They are different commits.
0e913426, 2026-09-06 (HYPATIA_PINinhyperpolymath/standards.github/workflows/governance-reusable.yml)main@8e8943f, 2026-09-22bc8812e("label-aware secret suppression", #782, 2026-09-14) is an ancestor ofmainand is not an ancestor of the pin — verified withgit merge-base --is-ancestorin both directions. The pinnedlib/hypatia/scanner_suppression.exhas 4 occurrences of the label/context-suppression identifiers; HEAD's has 12.
Our own cure for this exact false-positive class is in the repo and absent from
the scanner enforcing the gate.
This also constrains which cures are even possible: compiled-in suppression
(
@default_exemptions,@training_corpus_paths) lives in the scanner and cannotaffect this gate. Only scanned-tree mechanisms can —
.hypatia-ignore,.hypatia-baseline.json, and inline# hypatia: allowdirectives.Acceptance criteria
governance / Validate Hypatia Baselineis green onmain, withkept = 0(
BLOCKING_THRESHOLD: infoand the scanner emits only>= medium, so"kept" must reach zero — there is no headroom).
ghp_+ 36 chars elsewhere inlib/hypatia/scanner_suppression.exstillreddens the gate.
tracking_issuepointing at scanner: RE005 matches '|| true' inside comments; zig_ptr_cast/zig_align_cast flag the mandatory opaque-handle idiom #834 and are deletedwhen scanner: RE005 matches '|| true' inside comments; zig_ptr_cast/zig_align_cast flag the mandatory opaque-handle idiom #834 lands. They are acknowledged rule defects, not accepted debt.
gate; restoring it greens it.
Structural follow-up (not this issue)
Bumping
HYPATIA_PINpastbc8812ewould cure the secrets half at the source,but that pin is a required status check on ~120 caller repos, so it is a
cross-repo change with that blast radius. Filed separately against
standards.