Skip to content

fix(ci): re-pin codeql-action to v4.38.0 SHA (#977 reverted the #973 incident fix) - #978

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/scorecard-codeql-4380
Sep 22, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
fix/scorecard-codeql-4380

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

What happened

Dependabot #977 (68acee77, merged today) bumped codeql-action from 4.38.0 back to 4.38.1 — the version #973 had escaped hours earlier because it fails GitHub's workflow-startup validation estate-wide (nexia-list#100).

Measured on hyperpolymath/standards within the hour:

workflow state first red
codeql.yml red after 4 consecutive greens 12:09Z
scorecard.yml red after 2 consecutive greens 11:51Z

The newest run of each reports jobs = 0 — startup death, not a failing job. ⚠ GitHub surfaces it here as conclusion=failure, not startup_failure, because the death is in the called reusable. Checking only for startup_failure would have missed this entirely.

The five refs

workflow refs
codeql-reusable.yml init, analyze
hypatia-scan-reusable.yml upload-sarif
scorecard-reusable.yml upload-sarif ×2

⚠ The first three are the dangerous shape. #977 replaced the SHA but inherited #973's comment, so each line reads:

uses: github/codeql-action/init@1c5b675... # v4.38.0 (4.38.1 blocked estate-wide; nexia-list#100)

An annotation asserting the exact opposite of the value it annotates. A reviewer reading the comment sees the safe version and moves on. scorecard-reusable.yml was never swept by #973 at all and kept honest # v3 / # v4.38.1 comments — so the unfixed file was the legible one.

Why the hold did not hold

.github/dependabot.yml already carried a hold on github/codeql-action. It matched nothing: the workflows reference the subpath actions, and Dependabot treats each subpath as its own dependency name. #977's own body says "Updates github/codeql-action/init from 4.38.0 to 4.38.1".

The entry is now github/codeql-action*. Without this the next scheduled run reopens the same PR and re-breaks both workflows.

actions.lock is deliberately untouched

The lock already carried b96794f for all three workflows — the lockfile was the correct side of the drift and the workflows were the stale side. Regenerating it (the cure the gate's own error text prescribes) would have written 1c5b675 back into the lock and re-legitimised the blocked version. A lock/workflow drift has two possible stale sides and the message picks one blindly.

Verification

  • Zero refs to 1c5b675 remain under .github/
  • actions-lock gate: no error-severity, no stale findings (93 pre-existing sha-as-ref warnings unchanged)
  • git diff --stat -- .github/workflows/actions.lock → empty
  • b96794f confirmed as the commit that tag v4.38.0 peels to
  • All pre-commit hooks pass, including validate-actions-lock — which was blocking every commit carrying a workflow ref

Refs #973, #977, nexia-list#100, nexia-list#101, nexia-list#104

🤖 Generated with Claude Code

https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

Dependabot #977 (68acee7, merged 2026-09-22) bumped codeql-action from
4.38.0 back to 4.38.1 -- the version #973 had just escaped because it
fails GitHub's workflow-startup validation estate-wide (nexia-list#100).
Measured on hyperpolymath/standards within the hour: codeql.yml red from
12:09Z after four greens, scorecard.yml red from 11:51Z, and the newest
run of each reports jobs=0. That is startup death, not a failing job;
note GitHub surfaces it here as conclusion=failure, not startup_failure,
because the death is in the called reusable.

Five refs across three workflows went back to 1c5b675 (v4.38.1):

  codeql-reusable.yml        init, analyze
  hypatia-scan-reusable.yml  upload-sarif
  scorecard-reusable.yml     upload-sarif x2

The first three are the more dangerous shape: #977 replaced the SHA but
inherited #973's comment, so each line reads
"@1c5b675... # v4.38.0 (4.38.1 blocked estate-wide)" -- an annotation
asserting the exact opposite of the value it annotates. A reviewer
reading the comment sees the safe version. scorecard-reusable.yml was
never swept by #973 at all and kept honest "# v3" / "# v4.38.1" comments.

Also widens the dependabot hold, which did not hold. The ignore entry
named "github/codeql-action" while the workflows reference the subpath
actions, and Dependabot treats github/codeql-action/init as its own
dependency name -- #977's own body says "Updates
`github/codeql-action/init` from 4.38.0 to 4.38.1". So the ignore
matched nothing. The entry is now "github/codeql-action*". Without this
the next scheduled run reopens the same PR and re-breaks both workflows.

actions.lock is deliberately untouched: it already carried b96794f for
all three workflows, so the lockfile was the correct side of the drift
and the workflows were the stale side. Regenerating it instead -- the
cure the gate's own error text prescribes -- would have written 1c5b675
back into the lock and re-legitimised the blocked version.

Verified: zero refs to 1c5b675 remain under .github/; the actions-lock
gate reports no error-severity and no stale findings (93 pre-existing
sha-as-ref warnings are unchanged); git diff on actions.lock is empty.

Refs: #973, #977, nexia-list#100, nexia-list#101, nexia-list#104

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo
Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

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: d43a2ee3-93d9-415a-933f-a8ec2496d18b

📥 Commits

Reviewing files that changed from the base of the PR and between 68acee7 and 1f98bd2.

📒 Files selected for processing (4)
  • .github/dependabot.yml
  • .github/workflows/codeql-reusable.yml
  • .github/workflows/hypatia-scan-reusable.yml
  • .github/workflows/scorecard-reusable.yml

Included review availability: 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. (33)
  • GitHub Check: governance / Trusted-base reduction policy
  • GitHub Check: governance / Live Actions policy (credentialed advisory)
  • GitHub Check: governance / Licence consistency
  • GitHub Check: governance / Debt ratchet
  • GitHub Check: governance / Allowlist Preflight
  • GitHub Check: governance / Code quality + docs
  • GitHub Check: governance / Exemption ratchet
  • GitHub Check: governance / Actions lockfile verify
  • GitHub Check: governance / Well-Known (RFC 9116 + RSR)
  • GitHub Check: governance / Security policy checks
  • GitHub Check: governance / Language / package anti-pattern policy
  • GitHub Check: scan / gitleaks
  • GitHub Check: governance / Guix packaging policy (Nix retired)
  • GitHub Check: governance / Workflow security linter
  • GitHub Check: scan / shell-secrets
  • GitHub Check: governance / Check Workflow Staleness
  • GitHub Check: scan / rust-secrets
  • GitHub Check: analyze-js / analyze
  • GitHub Check: analyze-actions / analyze
  • GitHub Check: scorecard / Run Scorecard PR
  • GitHub Check: Scan for hand-authored JavaScript/TypeScript
  • GitHub Check: ci / Detect mix.exs
  • GitHub Check: Verify CLAIMS.a2ml + conformance
  • GitHub Check: scan / Hypatia Neurosymbolic Analysis
  • GitHub Check: SPARK Theatre Gate
  • GitHub Check: Registry + topology in sync
  • GitHub Check: Detect proof changes
  • GitHub Check: uses ⊆ actions.lock
  • GitHub Check: Check Documentation Format
  • GitHub Check: Lockfile self-consistency
  • GitHub Check: Repo self-tests
  • GitHub Check: AffineScript Verify
  • GitHub Check: K9-SVC contractile validation
🔇 Additional comments (5)
.github/workflows/hypatia-scan-reusable.yml (1)

245-245: LGTM!

.github/dependabot.yml (1)

19-26: LGTM!

.github/workflows/codeql-reusable.yml (1)

97-97: LGTM!

Also applies to: 103-103

.github/workflows/scorecard-reusable.yml (2)

95-95: LGTM!


228-228: LGTM!


📝 Summary

Summary by CodeRabbit

  • Chores
    • Updated automated code-scanning and security-analysis workflows to use a consistent, verified release.
    • Strengthened dependency management safeguards to ensure all related CodeQL actions remain covered by the version hold.
    • Standardised security-report uploads across automated quality and pull-request checks, without changing their existing configuration or behaviour.

Walkthrough

The pull request broadens the Dependabot ignore pattern for CodeQL actions and updates CodeQL workflow pins to the v4.38.0 commit. Existing workflow inputs remain unchanged.

Changes

CodeQL action control

Layer / File(s) Summary
Dependabot ignore pattern
.github/dependabot.yml
The ignore entry now matches github/codeql-action and its subpath actions. The comment documents the matching behaviour.
Workflow action pins
.github/workflows/codeql-reusable.yml, .github/workflows/hypatia-scan-reusable.yml, .github/workflows/scorecard-reusable.yml
CodeQL action references now use commit b96794f015dfd88f77b49b1c93e0fa7110f94c63, labelled v4.38.0. Existing inputs remain unchanged.

Priority: ➖ Normal

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

Change: Bug fix

Suggested reviewers: joshuajewell

Merge Risk: ⚪ Minimal · up to 1f98b

CodeQL and SARIF scanning continue on the intended v4.38.0 pin, while Dependabot is prevented from reintroducing v4.38.1. No merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: re-pinning codeql-action to the v4.38.0 commit SHA. It is concise and relevant to the changeset.
Description check ✅ Passed The description directly explains the re-pinning, the Dependabot hold correction, the affected workflows, and the verification results. It is fully related to the changeset.
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.

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 pins in place
CodeQL hops with steady grace
Dependabot watches every trail
Old version bumps now miss the rail
Safe commits lead the way

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

@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath merged commit 7b931ef into main Sep 22, 2026
36 of 37 checks passed
@hyperpolymath
hyperpolymath deleted the fix/scorecard-codeql-4380 branch September 22, 2026 12:42
hyperpolymath added a commit that referenced this pull request Sep 22, 2026
…37) (#979)

> **Stacked on #978.** Base is `fix/scorecard-codeql-4380` so this PR
shows **only** the docs-gate diff; it auto-retargets to `main` when #978
merges. **Merge #978 first.**

## The defect

`check-docs-presence.sh` searched **only the repository root** for
CONTRIBUTING, while estate repos have been deliberately relocating the
file to `.github/` — the location GitHub itself auto-discovers.

From `launch-scaffolder` `d426ea4d`:
> the estate canonical location is `.github/CONTRIBUTING.md`, which
GitHub auto-discovers

So the gate asked *"is there a CONTRIBUTING at the repo root?"* while
its consumers had been told to answer *"is there a CONTRIBUTING GitHub
can find?"* — a guard asking a different question than its consumer, and
the gate lost.

## Census — 516 local clones, 2026-09-22

| location | repos |
|---|---|
| root | 401 |
| `.github/` | 96 |
| `docs/` | 1 |
| **none anywhere** | **94** |

**19 unique repos** were being reported missing a document they
demonstrably have, against **94 genuine misses**. For scale, the
script's own header records a 2026-07-21 measurement over 412 real
repo-root callers: README 0/412 missing, LICENSE 0/412, CONTRIBUTING
**54/412**.

This **widens WHERE the gate looks without widening WHAT it asks** — the
94 still block.

## Second defect, same file

The failure message named only the root locations, so it prescribed a
cure **narrower than the code accepts**. Surfaced only by reading the
negative control's *output* rather than just its exit code. Same class
as #930.

## Tests

Four new accept cases — **one per added path**, because a single
`.github/CONTRIBUTING.md` case would pass even if only that one path had
been added — plus an **anti-overreach** case proving a CONTRIBUTING at
an undiscoverable depth (`src/internal/`) still **BLOCKS**. That last
one guards against a future "fix" by recursive `find`, which would
silently pass all 94 genuinely-missing repos.

Suite **29/29**.

## Mutants killed

Both leave the pre-existing cases green, so detection is *attributable*:

| mutant | result |
|---|---|
| gate fully reverted to root-only | 25 passed, **4 failed** — exactly
the new accept cases |
| only `.github/CONTRIBUTING.md` added | 26 passed, **3 failed** — each
path individually load-bearing |

## Real-world controls

| repo | rc | meaning |
|---|---|---|
| `launch-scaffolder` | 0 | the repo issue #37 reported missing |
| `standards` itself | 0 | via `3-practice/` |
| `cicd-suite` | 1 | genuine miss, message correct |

## ⚠ This does not close launch-scaffolder#37 by itself

`launch-scaffolder`'s governance job runs this script from its
**pinned** `standards` SHA, so it will not see the fix until that pin is
bumped. Its `ec-linux-amd64` failure is a separate pre-existing cause
and the job conclusion will not flip on this change alone — verify the
CONTRIBUTING sub-check by name in the log.

Refs hyperpolymath/launch-scaffolder#37, #930

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

https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

---------

Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <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.

1 participant