Commit dcc2ffe
feat(cicd-rules): close 3 doomed-CI detection gaps surfaced by 2026-05-27 audit (#350)
## Summary
The 2026-05-27 estate doomed-CI audit produced deletion PRs for 5 pilot
repos (`road-skate`, `vext`, `quandledb`, `absolute-zero`, `Axiom.jl`).
Three of the underlying anti-patterns had no Hypatia coverage, or had
coverage too weak to drive action. This PR closes those gaps in
\`Hypatia.Rules.CicdRules\`.
| Track | Before | After |
|---|---|---|
| A1 — Jekyll on non-Pages | \`:irrelevant_jekyll\` at \`:low\`
(ignored) | bumped to \`:medium\` (acted on) |
| C — Subsumed standalone beside \`governance.yml\` | none (just a
comment) | new \`:redundant_subsumed_standalone\` at \`:medium\` |
| D — \`rust-ci.yml\` on no-Rust repo | only the inverse
(\`:missing_rust_ci\`) | new \`:irrelevant_rust_ci\` at \`:high\` |
## Why
(1) **Severity bump for \`:irrelevant_jekyll\`** — the existing
detection (no \`_config.yml\` AND no \`Gemfile\`) is accurate, but
\`:low\` meant it never made it onto any actionable backlog. Estate
language policy bans Jekyll outright in favour of
\`hyperpolymath/casket-ssg\`, so when the rule fires the finding is
unambiguously a delete candidate. 21 of 25 Jekyll-workflow repos in the
estate fire this rule.
(2) **\`:redundant_subsumed_standalone\`** — fires for any of the 9
standalone workflow names whose logic is provided by
\`hyperpolymath/standards/.github/workflows/governance-reusable.yml\`
when \`governance.yml\` is also present:
\`\`\`
workflow-linter.yml, language-policy.yml, quality.yml,
security-policy.yml, guix-nix-policy.yml, npm-bun-blocker.yml,
ts-blocker.yml, rsr-antipattern.yml, wellknown-enforcement.yml
\`\`\`
Authoritative subsumption list per the reusable's own header. Audit
found 107 instances across 88 repos. \`workflow-linter.yml\` alone is in
80 repos.
(3) **\`:irrelevant_rust_ci\`** — fires when \`rust-ci.yml\` exists but
the repo has no \`Cargo.toml\` at root AND no \`*.rs\` files anywhere
(workspace check via \`rs_file_count\` or extension scan). Cousin of
\`:missing_rust_ci\` (which catches the inverse). Audit found 11 doomed
cases.
## Validation
8/8 standalone smoke assertions pass:
- \`:redundant_subsumed_standalone\` fires on \`workflow-linter.yml +
governance.yml\`
- \`:redundant_subsumed_standalone\` fires on \`quality.yml +
governance.yml\`
- \`:redundant_subsumed_standalone\` count matches subsumed names
present
- silent without \`governance.yml\` (so vintage repos still on
standalones don't get pinged)
- \`:irrelevant_rust_ci\` fires when no \`Cargo.toml\` + no \`.rs\`
- silent when \`Cargo.toml\` present
- silent on workspace layouts (\`rs_file_count > 0\`)
- \`:irrelevant_jekyll\` severity is now \`:medium\`
## Related
- \`hyperpolymath/standards#219\` — the root-cause fix for the
governance-reusable \`workflow_sha\` bug that triggered the audit.
- \`#348\` — sibling rules for the \`workflow_sha\`
/ caller-context-\`ref\` anti-patterns (one PR over from this one in
time).
- Pilot deletion PRs validated against the existing rules: road-skate#1
(MERGED), vext#11, quandledb#16, absolute-zero#57, Axiom.jl#29.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent d79da94 commit dcc2ffe
1 file changed
Lines changed: 59 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
172 | 172 | | |
173 | 173 | | |
174 | 174 | | |
175 | | - | |
176 | | - | |
| 175 | + | |
| 176 | + | |
177 | 177 | | |
178 | 178 | | |
179 | 179 | | |
| |||
187 | 187 | | |
188 | 188 | | |
189 | 189 | | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
190 | 204 | | |
191 | 205 | | |
192 | 206 | | |
| |||
271 | 285 | | |
272 | 286 | | |
273 | 287 | | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
274 | 331 | | |
275 | 332 | | |
276 | 333 | | |
| |||
0 commit comments