Skip to content

ci(hypatia): retire the cured invalid_actions_lock ack (#963) - #1239

Merged
hyperpolymath merged 1 commit into
mainfrom
claude/kind-curie-w54eub
Oct 14, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
claude/kind-curie-w54eub

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 14, 2026 •

Copy link
Copy Markdown
Owner

Closes #963.

Summary

Removes the .hypatia-baseline.json acknowledgement for invalid_actions_lock. The entry had:

It acknowledged asana/push-signed-commits@d615…, which declared the floating transitive actions/setup-python@v2. One of its listed exit criteria was "we replace the action", and that is now met:

While the entry stood, **actions.lock would have muted any new invalid_actions_lock finding in the repo until 2026-12-22.

Evidence the rule no longer fires on main

These are from the Hypatia scan on main at 7d2041a (run 38484072239, scanner pinned at 51ab6496):

  • The scan reported 59 findings: critical=2, high=2, medium=34, warn=21.
  • findings_kept is [].
  • None of the 59 suppressed findings has type invalid_actions_lock. The two highs are WH013 and ncl_k9_missing_pedigree.
  • No finding names 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:

  • the non-SHA key grep;
  • the non-SHA nested uses: grep.

Changes

File Change
.hypatia-baseline.json One entry deleted, 12 lines. jq confirms the result equals the original with only that entry removed. No other entry changes.
scripts/tests/apply-baseline-test.sh The "SHIPPED ledger" section asserted that the real baseline holds exactly one such ack and suppresses both emission paths, so it would go red on this removal. It is inverted: it now asserts the ledger holds no invalid_actions_lock ack and that both emission paths reach the gate (workflow_audit/actions.lock and workflow_hardening/.github/workflows/actions.lock). The fixture-based tests for list-valued rule_module are unchanged.

docs/HYPATIA-BASELINE-FORMAT.adoc, the schema description and the comment in apply-baseline.sh still use invalid_actions_lock as 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

Check Result
bash scripts/tests/exemption-ratchet-test.sh 14 passed, 0 failed
bash scripts/tests/apply-baseline-test.sh 32 passed, 0 failed
bash scripts/tests/hypatia-blocking-gate-test.sh exit 0
scripts/check-exemption-ratchet.sh origin/main SHRANK .hypatia-baseline.json: 189 -> 188. OK, and no Ratchet-exception: was needed.
apply-baseline.sh on [] in blocking mode schema-valid, exit 0
apply-baseline.sh with both invalid_actions_lock emissions in blocking mode kept=2, suppressed=0, exit 1. A recurrence now blocks.
.githooks/pre-commit and commit-msg passed. Included gitleaks 8.28.0, validate-actions-lock and validate-sha-pins, using checksum-verified gitleaks and mikefarah yq v4.47.1.

The Hypatia scanner itself was not run locally, because the container has no Elixir. This PR's own scan / Hypatia Neurosymbolic Analysis run is the live confirmation.

Licence headers are untouched.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TbbnKqskQA5mj5gfMniPzi

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
@coderabbitai

coderabbitai Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 3c8fc428-0883-49e9-95bf-1034234612ed
📥 Commits

Reviewing files that changed from the base of the PR and between 7d2041a and 5886da1.

📒 Files selected for processing: 2
  • .hypatia-baseline.json
  • scripts/tests/apply-baseline-test.sh
💤 Files with no reviewable changes: 1
  • .hypatia-baseline.json

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout: 15
  • GitHub Check: governance / Validate Hypatia Baseline
  • GitHub Check: Call CI Pipeline / Rust / Detect Cargo.toml
  • GitHub Check: Call CI Pipeline / Nickel
  • GitHub Check: scorecard / Run Scorecard PR
  • GitHub Check: governance / Licence consistency
  • GitHub Check: governance / Workflow security linter
  • GitHub Check: scan / gitleaks
  • GitHub Check: Call CI Pipeline / Secret scanning / gitleaks
  • GitHub Check: analyze-actions / analyze
  • GitHub Check: analyze-js / analyze
  • GitHub Check: scan / Hypatia Neurosymbolic Analysis
  • GitHub Check: Report non-canonical JSON (report-only)
  • GitHub Check: K9-SVC contractile validation
  • GitHub Check: Repo self-tests
  • GitHub Check: semgrep-cloud-platform/scan
🔇 Additional comments: 1
scripts/tests/apply-baseline-test.sh: 1

287-294: LGTM!

Also applies to: 300-307, 309-316, 318-324

📝 Summary

Summary by CodeRabbit

  • Security
    • Findings related to invalid actions.lock entries in workflow audits and hardening checks are no longer suppressed by a baseline acknowledgement. These findings remain visible for review, including when they involve other finding types or modules. This makes relevant workflow security issues easier to identify and address.

The invalid_actions_lock acknowledgement was removed from the shipped baseline. Regression checks now verify that findings from workflow_audit and workflow_hardening remain unsuppressed.

Changes: actions.lock baseline

Layer / File(s) Summary
Baseline removal and regression checks
.hypatia-baseline.json, scripts/tests/apply-baseline-test.sh
The baseline no longer acknowledges invalid_actions_lock findings. The shipped-ledger tests verify that these findings remain unsuppressed and that other findings remain unsuppressed as expected.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Suggested reviewers: joshuajewell

Merge Risk: ⚪ Minimal · up to 5886d

The change matches the stated goal, with regression checks for the affected findings. No actionable merge risk was identified; normal checks should still pass.

Security architecture risk: ⚪ Minimal · up to 5886d

The change strengthens the existing control: matching lockfile findings remain visible and eligible to fail the gate. The accompanying changes are regression assertions, not a new public endpoint or privilege boundary. No introduced or worsened security concern was identified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The effective change is bounded to consumers of the shipped baseline: emitted invalid_actions_lock findings can no longer be acknowledged or downgraded by an entry of that type. Whether they block a particular run still depends on its existing mode and threshold.

Trust Boundaries and Controls

  • observed — The existing suppression control requires matching severity tier, module, finding type, and file or file pattern. The PR removes policy data rather than weakening those checks.
Pre-merge checks: Passed 5
Passed Passed checks: 5 passed
Check name Status Explanation
Docstring Coverage Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 1…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description check Passed The description clearly explains the removal of the obsolete invalid_actions_lock acknowledgement, the related test updates, and the validation results.
Title check Passed The title clearly and concisely identifies the retirement of the cured invalid_actions_lock acknowledgement, which is the main change.
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the ledger at dawn,
The old acknowledgement is gone.
Two findings stay in sight,
No baseline hides their light.
I nibble greens and hop away.

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

K9 contract conformance

run https://github.com/hyperpolymath/standards/actions/runs/38493064951

K9 normative contract typecheck

k9_contract.ncl typechecks

K9 contract self-test

== the bash mirrors cannot drift from the normative contract ==
ok   leash_levels mirrors k9_contract.ncl
ok   core_capabilities mirrors k9_contract.ncl
ok   contract_version mirrors k9_contract.ncl
ok   schema_major mirrors k9_contract.ncl
== capability arithmetic (§8) ==
ok   capability_ok fs.read accepted
ok   capability_ok rollback.apply accepted
ok   capability_ok x-acme.gpu.alloc accepted
ok   capability_ok x-acme rejected
ok   capability_ok x-.gpu rejected
ok   capability_ok fs.delete rejected
ok   capability_ok  rejected
== the extractor ==
ok   extracts pedigree.security.leash
ok   extracts pedigree.component_type
ok   extracts pedigree.metadata.name
ok   pedigree leash is not reported as top-level leash
ok   required_capabilities for a quiet component
ok   required_capabilities follows allow_network
== the envelope strip keeps line numbers (§3.6) ==
ok   line 1 becomes a comment
ok   line count is preserved
ok   schema_version stays on line 5
== L3: signature presence is not verification (§10) ==
ok   no verifier -> K9-C001 is SKIPPED, never a pass
ok   the skip states presence does not authorise 'Hunt
ok   verifier accepts -> verdict 'Verified, no K9-C001 finding
ok   verifier refuses -> K9-C001 error, verdict 'Rejected
== the fixture runner's attribution cannot be fooled by a filename ==
ok   every extracted finding is well-formed rule+layer
ok   the rule that really fired is attributed
ok   a rule named only in the filename is NOT attributed
ok   K9-C001 is present as a skipped finding
ok   and that same finding is NOT extractable as a rejection
== the dialect discriminator agrees with the coordination grammar (§4.3) ==
ok   magic file opening '---' is coordination
ok   magic file opening 'metadata:' is coordination
ok   plain file opening '---' is unclaimed
ok   plain file opening 'metadata:' is unclaimed
== no Nickel reserved word is used as an identifier ==
ok   the contract and all 27 fixtures avoid Nickel's reserved words

self-test: all assertions passed

K9 conformance fixtures

== positive controls (must pass) ==
ok   extension-capability.k9.ncl
ok   extension-fields.k9.ncl
ok   hunt-fully-granted.k9.ncl
ok   kennel-data.k9.ncl
ok   library-base.ncl
ok   yard-typed-config.k9.ncl

== negative controls (must fail, by the named rule) ==
ok   L0-K9-E001-bad-magic.k9.ncl (rejected by K9-E001 at L0)
ok   L0-K9-E002-nul-byte.k9.ncl (rejected by K9-E002 at L0)
ok   L0-K9-E003-crlf.k9.ncl (rejected by K9-E003 at L0)
ok   L0-K9-E004-no-spdx.k9.ncl (rejected by K9-E004 at L0)
ok   L0-K9-E005-unclaimed-body.k9.ncl (rejected by K9-E005 at L0)
ok   L0-K9-S012-library-with-pedigree.ncl (rejected by K9-S012 at L0)
ok   L0-K9-S014-stray-leash.ncl (rejected by K9-S014 at L0)
ok   L1-K9-S001-no-pedigree.k9.ncl (rejected by K9-S001 at L1)
ok   L1-K9-S002-wrong-major.k9.ncl (rejected by K9-S002 at L1)
ok   L1-K9-S003-todo-component-type.k9.ncl (rejected by K9-S003 at L1)
ok   L1-K9-S004-unknown-leash.k9.ncl (rejected by K9-S004 at L1)
ok   L1-K9-S005-missing-name.k9.ncl (rejected by K9-S005 at L1)
ok   L1-K9-S006-unknown-capability.k9.ncl (rejected by K9-S006 at L1)
ok   L1-K9-S007-ungranted-flag.k9.ncl (rejected by K9-S007 at L1)
ok   L1-K9-S008-hunt-signature-not-required.k9.ncl (rejected by K9-S008 at L1)
ok   L1-K9-S009-hunt-no-signature-block.k9.ncl (rejected by K9-S009 at L1)
ok   L1-K9-S010-hunt-empty-side-effects.k9.ncl (rejected by K9-S010 at L1)
ok   L1-K9-S011-recipes-at-yard.k9.ncl (rejected by K9-S011 at L1)
ok   L1-K9-S013-dangling-import.k9.ncl (rejected by K9-S013 at L1)
ok   L2-K9-N001-two-segment-version.k9.ncl (rejected by K9-N001 at L2)
ok   L2-K9-N001-wrong-field-type.k9.ncl (rejected by K9-N001 at L2)

fixtures: 6 positive, 21 negative (0 needing nickel), 0 failure(s)

K9 corpus conformance (L2)

[validate-k9] 14 conforming, 0 grandfathered (layer all, contract v1.0.0)

@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath marked this pull request as ready for review October 14, 2026 01:04
@hyperpolymath
hyperpolymath merged commit e3d5107 into main Oct 14, 2026
66 checks passed
@hyperpolymath
hyperpolymath deleted the claude/kind-curie-w54eub branch October 14, 2026 01:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

main is red: actions.lock omits a transitive dependency of asana/push-signed-commits (actions/setup-python@v2)

2 participants