Skip to content

ci(actions-lock): leaf entries need a tag ref, not the pin's own SHA - #1271

Merged
hyperpolymath merged 1 commit into
mainfrom
ci/lock-leaf-refs
Oct 16, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
ci/lock-leaf-refs

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

GitHub's runtime now enforces the actions lockfile, and every cross-repo caller of the shared reusable workflows has failed job setup since with "invalid lockfile pin" for this repository's leaf actions: the lock consulted for a reusable workflow's dependencies is the defining repository's, and the entries for SHA-pinned actions carried
ref: while the entries that resolve carry ref:
(e.g. actions/checkout@de0fac2e -> ref v6.0.2, MEASURED resolving on palimpsest's own warrant runs). The new validation rejects a SHA as a ref.

Nine leaf entries corrected to tags that verifiably peel to the pinned SHAs (MEASURED via git ls-remote, including the annotated ossf/scorecard-action v2.4.4 whose tag object hid the match from the
API search): cache -> v6.1.0, checkout -> v7.0.1, configure-pages ->
v6.0.0, create-github-app-token -> v3.2.0, deploy-pages -> v5.0.1, upload-pages-artifact -> v5.0.0, setup-beam -> v1.24.1, setup-ocaml -> v3.9.0, scorecard-action -> v2.4.4. No commit value changes: the pins do not move. Workflows stay SHA-pinned (canon rule 10), so the official tool's v0.0.3 tag-rewrite model cannot be used here; the four stale unreferenced entries are left untouched.

Generated by Mistral Vibe.

Summary

Closes #

Type of change

  • 🐛 Bug fix (non-breaking change that fixes an issue)
  • ✨ New feature (non-breaking change that adds functionality)
  • 💥 Breaking change (would change existing behaviour)
  • 🕳️ Soundness fix (fixes a checker/proof false-negative)
  • 📖 Documentation
  • 🧹 Refactor / tech debt (behaviour-preserving)
  • ⚡ Performance
  • 🔧 Build / CI / tooling

How has this been verified?

Checklist

  • My commits are signed (git commit -S).
  • I ran the project's own checks/tests locally and they pass.
  • New files carry the correct SPDX-License-Identifier (code/config MPL-2.0,
    prose CC-BY-SA-4.0); I did not relicense existing files.
  • Docs are updated, and no public claim now overstates what the code does.
  • I have not introduced a soundness hole (or I have flagged where I might have).

Notes for reviewers

GitHub's runtime now enforces the actions lockfile, and every cross-repo
caller of the shared reusable workflows has failed job setup since with
"invalid lockfile pin" for this repository's leaf actions: the lock
consulted for a reusable workflow's dependencies is the defining
repository's, and the entries for SHA-pinned actions carried
ref: <the pin itself> while the entries that resolve carry ref: <tag>
(e.g. actions/checkout@de0fac2e -> ref v6.0.2, MEASURED resolving on
palimpsest's own warrant runs). The new validation rejects a SHA as a
ref.

Nine leaf entries corrected to tags that verifiably peel to the pinned
SHAs (MEASURED via git ls-remote, including the annotated
ossf/scorecard-action v2.4.4 whose tag object hid the match from the
API search): cache -> v6.1.0, checkout -> v7.0.1, configure-pages ->
v6.0.0, create-github-app-token -> v3.2.0, deploy-pages -> v5.0.1,
upload-pages-artifact -> v5.0.0, setup-beam -> v1.24.1,
setup-ocaml -> v3.9.0, scorecard-action -> v2.4.4. No commit value
changes: the pins do not move. Workflows stay SHA-pinned (canon rule
10), so the official tool's v0.0.3 tag-rewrite model cannot be used
here; the four stale unreferenced entries are left untouched.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
@hyperpolymath
hyperpolymath merged commit f335165 into main Oct 16, 2026
39 of 47 checks passed
@hyperpolymath
hyperpolymath deleted the ci/lock-leaf-refs branch October 16, 2026 08:02
@github-actions

Copy link
Copy Markdown
Contributor

K9 contract conformance

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

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

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.

1 participant