Skip to content

Dependabot bumps uses: without regenerating actions.lock — every remediated repo is newly exposed #670

Description

@hyperpolymath

Every repo we give a lockfile becomes newly breakable by a routine Dependabot bump

⚠️ Observed once, not measured at scale. This is filed as a forward risk with one confirmed instance — not as a claim that it is happening estate-wide. See the scope section.

The mechanism

Dependabot edits uses: version strings in workflow files and does not touch .github/workflows/actions.lock. The lockfile then pins one version while the workflow requests another.

Before GitHub's Workflow Dependency Locking rollout (#657) that mismatch was harmless — the workflow simply used what it asked for. Under enforcement it stops the run starting, at startup_failure, with zero jobs and no logs.

The one confirmed instance

hyperpolymath/Cliometrics.jl:

05:01:45  remediation PR #50 merged
05:01:50  Governance runs -> `failure`   (it STARTED; the fix worked)
05:38:10  dependabot[bot] "chore(deps): bump the actions group across 1 directory with 2 updates"
          .github/workflows/codeql.yml          +2/-2
          .github/workflows/hypatia-scan.yml    +1/-1
          .github/workflows/push-email-notify.yml +1/-1
          .github/workflows/actions.lock        NOT TOUCHED
05:38:16  Hypatia Security Scan -> `startup_failure`

Four lines changed. Nothing deleted, repo entirely intact (141 files, 13 workflows). The commit is unremarkable — and it undid a fix 36 minutes old.

Scope — measured, and reassuring so far

0 of 20 remediated repos have a Dependabot commit since remediation began. So this is not currently widespread. But:

  • the remediation sweep has now added a lockfile to 113 repos that previously had none
  • every one of those is newly exposed to this, where it was not before
  • Dependabot runs on a schedule, so exposure accrues rather than being a one-off

Remediating without addressing this makes a repo more fragile in this one specific respect, not less. That trade is still worth it — a repo with a correct lockfile runs, and one without does not — but the gap should be closed rather than left.

Options

(A) Post-Dependabot regeneration job. A workflow triggered on Dependabot's PRs that runs gh actions-lock and commits the result into the same PR. Closes the gap fully; needs write permission on Dependabot PRs.

(B) dependabot.yml ignore for actions. Stop Dependabot bumping GitHub Actions entirely, and bump them deliberately alongside lockfile regeneration. Simplest and safest; loses automatic action security updates.

(C) A CI gate that fails a PR when a workflow's uses: changes without actions.lock changing. Does not fix it, but makes it visible and unmergeable rather than silently fatal. Cheapest to build.

(D) Accept and monitor. The estate-wide drift detector (lockfile-drift-detect.yml in standards) already exists; extend it to report this specific class.

Suggest (C) + (D) as the low-risk pair, with (A) if the permission model allows it.

⚠️ Whatever is chosen must handle the partial-lockfile trap (#657): regenerating with gh actions-lock alone produces a lockfile that omits reusable-workflow callers, and a partial lockfile is worse than none — P(startup_failure | has lockfile) = 91.7% vs 15.8% without. Any automated regeneration must hand-add '<path>': [] entries for callers and restore SPDX to line 1, exactly as the remediation script does.

Related: #657, #669.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions