Skip to content

CI: CodeQL and OSSF Scorecard start again - #31

Merged
hyperpolymath merged 3 commits into
mainfrom
claude/kcut-ladder-i0-b5zcm8
Oct 14, 2026
Merged

hyperpolymath merged 3 commits into
mainfrom
claude/kcut-ladder-i0-b5zcm8

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 14, 2026 •

Copy link
Copy Markdown
Owner

Summary

Both workflows ended every run on main in startup_failure with no jobs (on main at 2224ecd: runs 38544583792 and 38544581357). Two different causes:

  • CodeQL (added in Create codeql.yml #30) referenced its actions by tag (@v7, @v4), and this repository requires full-SHA pins. It now pins actions/checkout at v7.0.1 (as proofs.yml does) and github/codeql-action init and analyze at b96794f0 (v4.38.0), the pin hyperpolymath/standards uses estate-wide; 4.38.1 is held back there. Tag-to-SHA confirmed with git ls-remote.
  • OSSF Scorecard calls scorecard-reusable.yml in hyperpolymath/standards, whose job declares actions: read; its header says callers must grant that on the calling job. This caller did not, and a called job may not request more than its caller grants, so GitHub refused every run at startup. The caller now grants actions: read.
  • actions.lock lists codeql.yml with its two pins (dependency entry copied from the standards lock), and main-estate-audit.yml and scorecard.yml as [], like secret-scanner.yml.

Type of change

  • 🐛 Bug fix
  • ✨ New feature
  • 🕳️ Soundness fix
  • 📖 Documentation
  • 🔧 Build / CI / tooling
  • ♻️ Refactor
  • 🔒 Security
  • 🧪 Tests only

📌 New pins

  • github/codeql-action@b96794f015dfd88f77b49b1c93e0fa7110f94c63 (v4.38.0), for init and analyze.
  • actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 (v7.0.1), already pinned in proofs.yml.

How has this been verified?

  • On this PR at 19d3375 (the same tree as the current head), CodeQL (both analyses), Scorecard and the Secret Scanner all started and ran jobs; on main CodeQL and Scorecard fail at startup.
  • actionlint clean; node scripts/check-repository.mjs passes; 27 tests pass; the 25 locally runnable estate gates pass.
  • All commits are SSH-signed from the session.

Checklist

  • Commits are signed (SSH, verified by GitHub)
  • Local checks pass
  • SPDX: no new files; headers untouched
  • Docs do not overstate: comments say why each change is needed
  • No soundness hole: workflow configuration only

Notes for reviewers

  • Expected red, not required: "Run Scorecard PR". Scorecard now runs and fails by design at its pin reconciliation, because actions.lock does not record the job-level reusable references of scorecard.yml and main-estate-audit.yml. Recording them correctly needs gh actions-lock to generate the entries with their nested uses: lists, and a pin to a standards commit whose own lock is self-consistent. A hand-written attempt (33c91e4, reverted in 3df0205) broke Secret Scanner and Scorecard at startup; see the comment on this PR.
  • Owner decision: whether main-estate-audit.yml should be pinned by SHA at all (it freezes the central gate rules until bumped) or left at @main with the Scorecard finding.
  • SonarCloud fails identically on main; not this PR's.
  • yamllint on codeql.yml reports 21 issues on main and 23 here; the two new ones are the long pinned uses: lines this repository already accepts.
  • Branch restarted from main at 2224ecd; three commits, the last two cancelling out.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MF5GeeBBDF6sUzr6pZTjWV

Both workflows ended every run on main in startup_failure with no jobs.

CodeQL (added in #30) referenced its actions by tag, and this repository
requires full-SHA pins. It now uses actions/checkout at v7.0.1, as the
proof gate does, and github/codeql-action init and analyze at
b96794f0 (v4.38.0), the pin hyperpolymath/standards uses estate-wide
(4.38.1 is held back there). Tag-to-SHA checked with git ls-remote.

Scorecard's reusable workflow (hyperpolymath/standards,
scorecard-reusable.yml) declares actions: read on its job, for the
Packaging check, and its header says callers must grant it on the
calling job. This caller granted contents, security-events and id-token
only; a called job may not request more than its caller grants, so the
run was refused at startup. The caller now grants actions: read at the
workflow and job level.

actions.lock lists the three workflows it was missing (codeql.yml with
its two pins; main-estate-audit.yml and scorecard.yml, which call
reusable workflows, as []), and the codeql-action dependency entry is
copied from the standards lock (owner 9919, repo 259445878).

actionlint clean on both files; the documentation guard, 27 tests and
the 25 locally runnable estate gates pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MF5GeeBBDF6sUzr6pZTjWV
@coderabbitai

coderabbitai Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 53 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository: hyperpolymath/choreographic-types/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 49c94204-8eed-475b-b4cf-6f2b27b28b85
📥 Commits

Reviewing files that changed from the base of the PR and between 33c91e4 and 3df0205.

⛔ Files ignored due to path filters: 1
  • .github/workflows/actions.lock is excluded by !**/*.lock
📒 Files selected for processing: 1
  • .github/workflows/scorecard.yml

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: hyperpolymath/choreographic-types/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 38d672fe-eed1-45c4-9b07-32759a51cc30
📥 Commits

Reviewing files that changed from the base of the PR and between 2224ecd and 33c91e4.

⛔ Files ignored due to path filters: 1
  • .github/workflows/actions.lock is excluded by !**/*.lock
📒 Files selected for processing: 2
  • .github/workflows/codeql.yml
  • .github/workflows/scorecard.yml

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

📝 Walkthrough

The CodeQL workflow now pins checkout, initialization, and analysis actions to full commit SHAs. The Scorecard workflow adds actions: read permissions and pins its reusable workflow to a commit SHA.

Changes: CodeQL action pins

Layer / File(s) Summary
Pin CodeQL workflow actions
.github/workflows/codeql.yml
Checkout now uses the full commit SHA for v7.0.1. Initialization and analysis now use the same full commit SHA for v4.38.0. Comments describe the full-SHA requirement, the startup_failure result for tag references, and the v4.38.1 holdback.

Scorecard permissions

Layer / File(s) Summary
Pin Scorecard workflow and permissions
.github/workflows/scorecard.yml
The workflow and reusable job add actions: read. The reusable workflow reference changes from main to commit 192389bf1b40b70c594464937db7fdbf39a9a964; the other permissions remain.

Priority: ⬇️ Low

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

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 33c91

The changed workflows are reported to start and run, with their action references recorded in the lockfile. The remaining reported Scorecard finding is non-required, so no merge-blocking risk is established.

### Architecture Summary

Architecture risk: 🔵 Low · up to 33c91

The changed surface does not map to a changed system, dependency edge, entrypoint, or external dependency.

Changed systems: None identified.

Architecture concerns
No architecture-level concerns identified.

Review details

Before / after behavior

  • observed — Modified behavior in .github/workflows/codeql.yml: The checkout step replaces the v7 tag reference with the full commit SHA for v7.0.1.
  • observed — Modified behavior in .github/workflows/codeql.yml: The initialization step replaces the v4 tag reference with the full commit SHA for v4.38.0. New comments state that tag references end runs in startup_failure, identify v4.38.0 as the estate pin, and note that v4.38.1 is held back.
  • observed — Modified behavior in .github/workflows/codeql.yml: The analysis step replaces the v4 tag reference with the same full commit SHA for v4.38.0 used by initialization.
  • observed — Modified behavior in .github/workflows/scorecard.yml: The workflow adds top-level and job-level actions: read permissions. The reusable workflow reference is pinned to commit 192389bf1b40b70c594464937db7fdbf39a9a964 instead of tracking main; the other permissions are unchanged.
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 0…
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 Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly identifies the main change: restoring CodeQL and OSSF Scorecard workflow startup.
  • 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

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

@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@hyperpolymath
hyperpolymath marked this pull request as ready for review October 14, 2026 10:43
…in the lock

With the caller fixed, Scorecard ran on this PR and its pin
reconciliation failed by design: "job-level reusable ref absent from
actions.lock" for scorecard.yml and main-estate-audit.yml. The
reconciler (standards scripts/reconcile-scorecard-actions-lock.rb at
5a0891e9) requires every remote reusable-workflow reference to be listed
under the workflow and under dependencies with a sha1 commit; [] does
not cover it.

scorecard.yml now calls scorecard-reusable.yml at standards
192389bf (main of 2026-10-14; the file is identical to the 2ae085c
the PR run used), as the estate's reusable-workflow callers pin by
SHA. actions.lock records metadatastician/standards@192389bf for it and
metadatastician/standards@571cc734 for secret-scanner.yml, in the
estate lock's own shape (owner 6759885, repo 1116521501).

main-estate-audit.yml stays at cicd-suite@main and unlocked: pinning
it would freeze this repository's central gate rules, which is the
owner's decision, so Scorecard keeps that one finding.

The reconciler's lock_covers_reusable_deps? run locally: every
workflow COVER except main-estate-audit.yml (on main, three were
ABSENT). actionlint clean; guard, 27 tests, estate gates pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MF5GeeBBDF6sUzr6pZTjWV

Copy link
Copy Markdown
Owner Author

OSSF Scorecard on this PR. The first commit fixed the startup failure: Scorecard now runs. Its PR job then failed by design at the pin reconciliation, naming two workflows with "job-level reusable ref absent from actions.lock": scorecard.yml and main-estate-audit.yml.

33c91e4 fixes scorecard.yml. The call is now pinned to standards 192389bf, and the lock records it, and the secret scanner's reusable reference, in the estate lock's shape. Run locally, the reconciler's own coverage check now passes for every workflow except one.

Still expected to fail: main-estate-audit.yml calls hyperpolymath/cicd-suite/.github/workflows/main-estate-audit.yml@main. Pinning it by SHA and locking it would clear the finding, but it would also freeze this repository's central gate rules at one cicd-suite commit until someone bumps it. That is the owner's call, so it is left at @main, and Scorecard keeps that one finding and the "Run Scorecard PR" check stays red. Scorecard is not a required check. If the call is to pin, it is a two-line change plus one lock entry, with cicd-suite main currently at 4f540428.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

SonarCloud Code Analysis reports "analysis failed" (conclusion cancelled) on this PR, with no finding attached. It is not this PR's doing: the same check fails identically on main at 2224ecd, and it has failed on every head since #29, after all of #29's code findings were fixed (see the comment there). The cause is on the SonarCloud side and its background-task log is not reachable from this session, so there is no fix to port. It is not a required check.


Generated by Claude Code

…le refs in the lock"

This reverts commit 33c91e4. With it, Secret Scanner and OSSF Scorecard
both ended in startup_failure on this PR, and Secret Scanner carries the
required scan / gitleaks check.

GitHub enforces actions.lock at workflow startup. A caller's entry for a
job-level reusable workflow has to enumerate the actions that workflow
uses (the `uses:` list gh actions-lock writes, as in the standards lock);
the hand-written entries had none, so the nested actions were unlocked
and the runs were refused. Pinning scorecard-reusable.yml to standards'
current main was also unsafe: standards' lock-selfcheck.yml records that
its commits alternate between lock-consistent and not, and "pin to HEAD
is the wrong reflex".

Back to the first commit's state, where Secret Scanner, CodeQL and
Scorecard all started. Recording reusable refs for Scorecard's pin
reconciliation needs `gh actions-lock` itself to generate the entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MF5GeeBBDF6sUzr6pZTjWV

Copy link
Copy Markdown
Owner Author

Correction to my earlier comment. 33c91e4 made things worse, and 3df0205 reverts it. With it, both Secret Scanner (which carries the required scan / gitleaks) and OSSF Scorecard ended in startup_failure with no jobs.

GitHub enforces actions.lock when a workflow starts. A caller's lock entry for a job-level reusable workflow must list the actions that workflow uses, in the uses: list that gh actions-lock generates (see the hyperpolymath/standards@b935e639… entry in the standards lock). My hand-written entries had no such list, so the nested actions were unlocked and the runs were refused. Pinning scorecard-reusable.yml to the current standards main was unsafe as well. standards/.github/workflows/lock-selfcheck.yml records that its commits alternate between lock-consistent and not, so a pin needs a commit known to be self-consistent.

The tree is now identical to the first commit (19d3375). There, CodeQL, Scorecard and the Secret Scanner all started, and the Scorecard PR job failed only at reconciliation, for scorecard.yml and main-estate-audit.yml. Clearing that reconciliation needs lock entries generated by gh actions-lock itself, which needs an authenticated gh that this session does not have.


Generated by Claude Code

@sonarqubecloud

Copy link
Copy Markdown

❌ The last analysis has failed.

See analysis details on SonarQube Cloud

@hyperpolymath
hyperpolymath merged commit e997664 into main Oct 14, 2026
16 of 18 checks passed
@hyperpolymath
hyperpolymath deleted the claude/kcut-ladder-i0-b5zcm8 branch October 14, 2026 10:54
hyperpolymath added a commit that referenced this pull request Oct 14, 2026
## Summary

The estate audit called
`hyperpolymath/cicd-suite/.github/workflows/main-estate-audit.yml@main`.
So any change to cicd-suite ran here on the next push, with this
repository's token and without review. This PR pins it by full SHA,
which you decided after #31.

cicd-suite #50, merged today, makes a pinned thin caller the estate's
way of consuming the audit. Its README says "Pin a full SHA, never
`@main` or a tag". `main-estate-audit.yml` is now its
`templates/estate-audit-caller.yml`, with the SHA filled in.

## Type of change

- [ ] 🐛 Bug fix
- [ ] ✨ New feature
- [ ] 🕳️ Soundness fix
- [ ] 📖 Documentation
- [x] 🔧 Build / CI / tooling
- [ ] ♻️ Refactor
- [x] 🔒 Security
- [ ] 🧪 Tests only

## 📌 New pins

-
`hyperpolymath/cicd-suite/.github/workflows/main-estate-audit.yml@376898bbe872226866ccbc7648d43123b8bb21b9`:
cicd-suite `main`, the #50 merge. It is reachable from `main`, which
matters because a PR-head-only commit is refused at job creation.

## What changes in practice

- **Same gates as before.** It runs the same 24 gates as `4f54042`,
which every audit run here used until today. Both pin the gate
composites at `1aa6bfb`, and `actions/` is identical between the two
commits. The two stub gates (`prat`, `semantic-audit`) are no longer
run.
- **New shape.** One check becomes five: `estate / governance`,
`hygiene`, `manifests`, `languages` and `advisory`. A failing gate no
longer hides the gates after it. No ruleset requires the old check, so
nothing in Settings needs changing.
- **Permissions.** The caller grants `contents: read`, the only
permission the called workflow declares. Asking for more than the caller
grants is what stopped Scorecard before #31.
- **`actions.lock` unchanged.** It keeps this file as `[]`, the same
shape as `secret-scanner.yml`. cicd-suite records that a
cross-repository reusable call written into the lock fails at startup
with zero jobs.
- **Moving the pin later.** It moves only by PR. cicd-suite's
`templates/track-estate-audit.yml` can open those PRs weekly, but it
needs an `AUTOMATION_TOKEN` secret, so it is not added here.

## How has this been verified?

- actionlint is clean.
- `node scripts/check-repository.mjs` passes, and all 27 tests pass.
- The 25 locally runnable estate gates at `1aa6bfb` pass on this tree.
`manifest` needs external validators.
- The decisive check is this PR's own audit run, which calls the new
pin. It should show five `estate / *` checks rather than one, all green
except possibly `advisory`, which cannot fail.

## Checklist

- [x] Commits are signed (SSH, verified by GitHub)
- [x] Local checks pass
- [x] SPDX header kept
- [x] Docs do not overstate: the header says why the pin and the `[]`
lock entry are needed
- [x] No soundness hole: workflow configuration only

## Notes for reviewers

- Scorecard's pin reconciliation stays red, for the reason given in #31.
It wants reusable calls recorded in `actions.lock`, while cicd-suite and
the startup behaviour require them left out. The two estate rules
disagree; this PR does not change that.
- Branch restarted from `main` at `e997664` after #31 merged.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01MF5GeeBBDF6sUzr6pZTjWV

---
_Generated by [Claude
Code](https://claude.ai/code/session_01MF5GeeBBDF6sUzr6pZTjWV)_

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated the automated estate audit workflow to run on pushes and pull
requests targeting the main branch. It now uses a fixed version of the
audit process and read-only repository permissions. The workflow no
longer supports being triggered as a reusable workflow. No changes to
end-user functionality are included.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude <noreply@anthropic.com>
hyperpolymath pushed a commit that referenced this pull request Oct 19, 2026
Every job that resolves actions/checkout from this lock now dies at job
setup: "Unable to resolve action actions/checkout@3d3c42e5: invalid
lockfile pin". That covers the required Agda proof gate and scan /
gitleaks, on this PR and on main (a manual run of proofs.yml on main at
f5a4177 failed the same way today, run 39251522875; the same commit
passed on 2026-10-15). The scheduled Scorecard failures since 2026-10-16
are the same error on the codeql-action record.

Both records repeat the SHA as `ref`: checkout since #33, which changed
it from 'v7.0.1', and codeql-action since #31. The standards lock, which
gh actions-lock writes, records these SHA-keyed actions with their
release tags as `ref` ('v7.0.1', 'v4.38.0'), and this lock did so for
checkout until #33. Both records get their tags back; git ls-remote
confirms v7.0.1 is 3d3c42e5 and v4.38.0 peels to b96794f0. The untagged
workflow pins (cicd-suite, standards) keep the SHA as `ref`, as in the
standards lock; the estate audit resolved its record fine on this PR.

The lock stays sorted with no dangling or unused entries; the
documentation guard passes. This PR's own runs are the check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MF5GeeBBDF6sUzr6pZTjWV
hyperpolymath added a commit that referenced this pull request Oct 19, 2026
…rd) (#34)

## Summary

**`main` is currently broken.** Since 16 Oct, any job that resolves a
lock record repeating its SHA as `ref` dies at "Set up job" with:

> Unable to resolve action `actions/checkout@3d3c42e5…`: invalid
lockfile pin

That covers two required checks, the Agda proof gate and `scan /
gitleaks`. A manual run of `proofs.yml` on `main` at `f5a4177` failed
this way today
([39251522875](https://github.com/hyperpolymath/choreographic-types/actions/runs/39251522875));
the same commit passed on 15 Oct. Until this merges, no PR can pass its
required checks. The scheduled OSSF Scorecard runs (16 to 19 Oct) fail
with the same error, on `upload-sarif`.

What job setup now refuses is a **tagged action whose lock record
repeats the SHA as `ref`**. `gh actions-lock` records the release tag
there. The check applies in two places:
- **This repository's lock.** The `actions/checkout` record has had the
SHA as `ref` since #33, which changed it from `v7.0.1`. The
`github/codeql-action` record has had it since #31.
- **The called repository's lock, for the actions a reusable workflow
uses.** At `94572e6`, the commit the Secret Scanner was pinned to, the
standards lock has the same SHA form. By `75bd599` standards had fixed
its lock.

## Type of change

- [x] 🐛 Bug fix
- [ ] ✨ New feature
- [ ] 🕳️ Soundness fix
- [ ] 📖 Documentation
- [x] 🔧 Build / CI / tooling
- [ ] ♻️ Refactor
- [x] 🔒 Security
- [ ] 🧪 Tests only

## 📌 New pins

- `hyperpolymath/standards` at
`75bd5994470661a099df562d6d5ad2fe744dbd66` for both
`scorecard-reusable.yml` (was `@main`) and `secret-scanner-reusable.yml`
(was `94572e6`). Between `94572e6` and `75bd599` the scanner workflow
changed only in its header.
- Lock records copied from the standards lock:
`actions/upload-artifact@cf430e03…` (v7.0.2) and
`ossf/scorecard-action@2d114668…` (v2.4.4).

## What changes

- **`actions.lock`:**
- `actions/checkout` gets `ref: 'v7.0.1'` back, and
`github/codeql-action` gets `ref: 'v4.38.0'`. `git ls-remote` confirms
both tags.
- Untagged workflow pins (cicd-suite, standards) keep the SHA as `ref`,
as the standards lock does.
- One `standards@75bd599` record, listing the actions both workflows
use, replaces `standards@main` and `standards@94572e6`.
- The header states the rule as observed. It no longer claims "36
workflows" or cites a script this repository doesn't have.
- **`secret-scanner.yml`:**
  - Pinned at `75bd599`.
- Drops `secrets: inherit`. The scanner workflow's header at that commit
says callers must not pass it: the workflow declares and reads no
secrets, and `inherit` forwards every secret the caller can see
(CWE-250, standards#1108 §6b).
  - The caller's comment calling `inherit` required is corrected.
- **`scorecard.yml`:** pinned at `75bd599`.

## How has this been verified?

- **Lock and workflows:** keys sorted, no dangling or unused entries.
actionlint is clean on both workflows.
- **Repository checks:** `node scripts/check-repository.mjs` passes, and
all 27 tests pass.
- **On this PR, step by step:**
- Fixing the two refs let the Agda gate and CodeQL get past setup, and
CodeQL passed.
  - Repinning the scanner let `scan / gitleaks` pass.
  - Scorecard (PR job) and the five estate-audit jobs pass.
- **The scheduled Scorecard run is confirmed only after merge.** It
happens only on `main`, and Scorecard refuses manual runs on other
branches ("Only the default branch main is supported"). The first 04:10
UTC run after merge settles it.

## Checklist

- [x] Commits are signed (SSH, verified by GitHub)
- [x] Local checks pass
- [x] SPDX headers untouched
- [x] Docs do not overstate: the lock header's false claims are removed
- [x] No soundness hole: workflow configuration only

## Notes for reviewers

- Four commits, in the order the diagnosis went. Commit 3 (a `uses:`
list on the 94572e6 record) did not fix the scanner, and commit 4
removes that record. Squash on merge.
- Branch restarted from `main` at `f5a4177` after #32 merged.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01MF5GeeBBDF6sUzr6pZTjWV

---------

Co-authored-by: Claude <noreply@anthropic.com>
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.

3 participants