Skip to content

Commit 6a2b9bc

Browse files
docs(changelog): document WF014–WF017 rule additions (#402)
## Summary Adds `[Unreleased] / Added` section to `CHANGELOG.adoc` enumerating the four `workflow_audit` rules added in PRs #393 + #396 during the 2026-05-30 estate CI/CD audit. ## Why Closing the documentation loop: the rules were merged with full `@doc` blocks in code, but the CHANGELOG had no corresponding entry. Future releases now have the right narrative. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent f60ca3c commit 6a2b9bc

1 file changed

Lines changed: 46 additions & 0 deletions

File tree

CHANGELOG.adoc

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,52 @@ https://semver.org/[Semantic Versioning].
1010

1111
== [Unreleased]
1212

13+
=== Added
14+
15+
==== `WorkflowAudit` rules WF014–WF017 (2026-05-30, PRs #393 + #396)
16+
17+
Four new forward-detection rules surfacing patterns root-fixed in
18+
companion `hyperpolymath/standards` PRs. All four smoke-tested for
19+
both sensitivity (positive case fires) and specificity (inverse case
20+
silent); see the per-rule `@doc` blocks in `lib/rules/workflow_audit.ex`
21+
for the test matrix.
22+
23+
* **WF014** `scorecard_publish_with_run_step` (#393) — fires when a
24+
job uses `ossf/scorecard-action` with `publish_results: true` AND
25+
contains a `run:` step in the same job. The OSSF publish endpoint
26+
enforces "scorecard job must only have steps with uses"; any
27+
co-located `run:` step fails the publish + the whole workflow run.
28+
Caught 49 estate repos on the 2026-05-30 audit; template fix in
29+
`standards#304`.
30+
* **WF015** `nonroot_container_checkout_eacces` (#393) — fires when
31+
`container.image:` is on the curated non-root-user list
32+
(`coqorg/coq`, `leanprover/lean4`, `makarius/isabelle`, `haskell:`,
33+
`rocker/r-`, `jekyll/jekyll`) AND uses `actions/checkout` AND
34+
lacks `container.options: --user root`. Caught ephapax `coq-build.yml`
35+
where the checkout post-step failed with EACCES writing
36+
`/__w/_temp/_runner_file_commands/` as the non-root container user.
37+
Does NOT fire on generic `ubuntu:22.04` / `node:18` / `alpine:latest`
38+
(root by default).
39+
* **WF016** `orphan_reusable_sha_pin` (#393) — data-driven rule;
40+
detects callers pinning to known-orphan SHAs of
41+
`hyperpolymath/standards/.github/workflows/<name>-reusable.yml`.
42+
Initial orphan list: `hypatia-scan-reusable.yml@97df7621*` +
43+
`rust-ci-reusable.yml@4fdf4314*`. Caught 178 estate repos; fan-out
44+
recipe in `audit-hypatia-pin-orphan-2026-05-27.adoc`.
45+
* **WF017** `secret_action_without_presence_gate` (#396) — fires
46+
when a workflow step uses one of the curated
47+
`@secret_consuming_actions` (`webfactory/ssh-agent`,
48+
`peter-evans/repository-dispatch`,
49+
`peter-evans/create-pull-request`,
50+
`actions-ecosystem/action-create-comment`) with `${{ secrets.X }}`
51+
as its primary input AND lacks an `if: secrets.X != ''` gate.
52+
Caught Mirror radicle (26 repos) + Instant Sync (39 repos) on the
53+
2026-05-30 audit; source-level fix in `standards#305`.
54+
55+
The `audit/3` entry point in `lib/rules/workflow_audit.ex` was
56+
extended to thread the four new check functions into its return
57+
`findings` list and the count summary fields.
58+
1359
=== Changed
1460

1561
==== docs/ second-pass bucketing (2026-05-25, post-#315)

0 commit comments

Comments
 (0)