The .hypatia-baseline.json entry for invalid_actions_lock
(rule_module [workflow_audit, workflow_hardening], file_pattern
`**actions.lock`, tracking #963, expires 2026-12-22) acknowledged
asana/push-signed-commits@d615... declaring the floating transitive
actions/setup-python@v2 in .github/workflows/actions.lock.
Its exit criterion "we replace the action" is met:
- #1233 replaced the Asana action in .github/actions/signed-push/ with
push-verified.sh.
- #1238 removed both the asana/push-signed-commits and
actions/setup-python@v2 records from actions.lock. Every lock key and
every nested `uses:` ref is now a 40-hex SHA.
Evidence the rule no longer fires: the Hypatia scan on main at 7d2041a
(run 38484072239, scanner 51ab6496) reports 59 findings, none of type
invalid_actions_lock and none naming actions.lock. findings_kept is
empty, and the ack matched nothing in findings_suppressed.
While it stood, `**actions.lock` would have muted ANY new
invalid_actions_lock in the repo until 2026-12-22. Removing it shrinks
the ledger, which check-exemption-ratchet.sh permits. No other entry
changes.
scripts/tests/apply-baseline-test.sh pinned the shipped ledger to hold
exactly one such ack, so that section is inverted. It now asserts the
ledger holds none and that both emission paths (workflow_audit
`actions.lock`, workflow_hardening `.github/workflows/actions.lock`)
reach the gate. The fixture-based list-valued rule_module tests are
unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TbbnKqskQA5mj5gfMniPzi
Closes #963.
Summary
Removes the
.hypatia-baseline.jsonacknowledgement forinvalid_actions_lock. The entry had:rule_module: ["workflow_audit", "workflow_hardening"]file_pattern: "**actions.lock"expires_at: 2026-12-22It acknowledged
asana/push-signed-commits@d615…, which declared the floating transitiveactions/setup-python@v2. One of its listed exit criteria was "we replace the action", and that is now met:.github/actions/signed-push/withpush-verified.sh.asana/push-signed-commitsand theactions/setup-python@v2records fromactions.lock.While the entry stood,
**actions.lockwould have muted any newinvalid_actions_lockfinding in the repo until 2026-12-22.Evidence the rule no longer fires on
mainThese are from the Hypatia scan on
mainat7d2041a(run 38484072239, scanner pinned at51ab6496):findings_keptis[].invalid_actions_lock. The two highs are WH013 andncl_k9_missing_pedigree.actions.lock, asana or setup-python anywhere in the log.The ack was matching nothing. Both lock checks from the task print nothing on this branch:
uses:grep.Changes
.hypatia-baseline.jsonscripts/tests/apply-baseline-test.shinvalid_actions_lockack and that both emission paths reach the gate (workflow_audit/actions.lockandworkflow_hardening/.github/workflows/actions.lock). The fixture-based tests for list-valuedrule_moduleare unchanged.docs/HYPATIA-BASELINE-FORMAT.adoc, the schema description and the comment inapply-baseline.shstill useinvalid_actions_lockas their example of one defect emitted by two modules. That describes how the scanner behaves, not a live ack, so they are left as they are.Testing
bash scripts/tests/exemption-ratchet-test.shbash scripts/tests/apply-baseline-test.shbash scripts/tests/hypatia-blocking-gate-test.shscripts/check-exemption-ratchet.sh origin/mainSHRANK .hypatia-baseline.json: 189 -> 188. OK, and noRatchet-exception:was needed.apply-baseline.shon[]in blocking modeapply-baseline.shwith bothinvalid_actions_lockemissions in blocking mode.githooks/pre-commitandcommit-msgThe Hypatia scanner itself was not run locally, because the container has no Elixir. This PR's own
scan / Hypatia Neurosymbolic Analysisrun is the live confirmation.Licence headers are untouched.
🤖 Generated with Claude Code
https://claude.ai/code/session_01TbbnKqskQA5mj5gfMniPzi