fix(ci): stop Dependabot bumping generated gh-aw lock files - #1404
Conversation
`.github/workflows/*.lock.yml` are generated by `gh aw compile`, and `gh-aw-validation.yml` pins that compiler to a single version. Dependabot's github-actions ecosystem scans those generated files and rewrites the `uses:` pins inside them without rerunning the compiler, so the validation job's final `git diff --exit-code -- *.lock.yml` step regenerates them at the pinned version and fails on every such bump. PR #1171 (github/gh-aw-actions/setup 0.82.14 -> 0.84.2) is the worked example: `gh aw compile` runs clean ("Compiled 2 workflow(s): 0 error(s)") and the diff step then reports both lock files reverting `setup@fd783ac # v0.84.2` back to `setup@b6d1443 # v0.82.14`. The PR cannot go green as authored — the compiler pin, not the lock file, owns that version. `github/gh-aw-actions/setup` is referenced only by the two generated lock files and by the SHA assertion inside `gh-aw-validation.yml`, so ignoring it costs no Dependabot coverage on any hand-written workflow. The upgrade path is recorded inline: bump the version in `gh-aw-validation.yml` (extension install, version assert, and the `actions-lock.json` entry key + SHA), update `.github/aw/actions-lock.json`, then recompile and commit the regenerated lock files in one change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012KweRioyXT3yu5CmgEKJjM
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedAuto reviews are limited based on label configuration. 🏷️ Required labels (at least one) (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository YAML (base), Repository UI (inherited), Organization UI (inherited) Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Snapshot WarningsEnsure that dependencies are being submitted on PR branches and consider enabling retry-on-snapshot-warnings. See the documentation for more information and troubleshooting advice. Scanned FilesNone |
Agent Completion Truth Gate: BLOCKEDReasons: Machine-readable verdict{
"details": {
"collection_errors": [
"incomplete_linked_issue_contract",
"missing_intent_snapshot",
"missing_agent_run_id",
"missing_agent_login"
],
"invalid_fields": [
"policy.agent_login",
"policy.run_id"
]
},
"reasons": [
"invalid_payload"
],
"verdict": "blocked"
} |
|
@coderabbitai full review Auto-review was skipped on this PR because it carried no labels; Generated by Claude Code |
|
|
|
| Error | Why it stands |
|---|---|
missing_intent_snapshot |
Needs an agent-lock-intent-snapshot:v1 comment authored by github-actions[bot] on #1403 that strictly predates this PR (snapshotPredatesPull, pr-checks.yml:1933). Emitted by the dispatch workflow; #1403 was filed by hand. Cannot be authored under that identity, and would fail the predates-check even if it could. |
missing_agent_run_id |
#1403 declares no ## Agent Run ID section. |
missing_agent_login |
#1403 declares no ## Agent Login section. |
incomplete_linked_issue_contract |
Requires manifest ≡ textual ≡ authoritative issue number, which needs an agent-lock-manifest block carrying the above. |
The last three are mechanically writable. I am deliberately not writing them. Declaring a run ID and login for a dispatch that never occurred would fabricate the evidence this gate exists to check — the same principle already settled on #1381, where an agent must not self-grant the approval gating its own merge. Reducing the count would make the check look closer to green without making the claim any truer, and missing_intent_snapshot is unforgeable regardless.
Why this PR is subject to the gate at all: agentTaskApplicable (pr-checks.yml:1942) keys off the head ref matching /^(?:agent|claude|codex|copilot|jules)[/-]/. This branch is claude/clever-heisenberg-pedqbz. #1381 carries the same kind of change on groupthinking-fix-upstream-error-leakage and its gate reads not_applicable — the branch name is the only difference. #1400 is on a claude/* branch and shows the identical invalid_payload, so this is a systemic condition, not something specific to this change.
The decision
The change itself is one declarative ignore entry, green on Dependency Review, with no runtime surface. Three ways forward, all requiring a human:
- Re-land on a non-agent branch name. Cherry-pick
f078b62onto e.g.fix/dependabot-ignore-gh-aw; the gate goesnot_applicableand the PR is mergeable as-is. Staged command:I have not done this — my branch assignment isgit fetch origin main && git checkout -B fix/dependabot-ignore-gh-aw origin/main git cherry-pick f078b6275e86ef8842c732f7752d96e1c8cddcd6 git push -u origin fix/dependabot-ignore-gh-awclaude/clever-heisenberg-pedqbzand pushing elsewhere needs your say-so. - Dispatch ci: Dependabot should not manage compiler-generated gh-aw lock files #1403 properly through the agent-lock pipeline so a real intent snapshot exists, then reopen.
- Exempt hand-authored PRs on agent-named branches from the gate — the branch-name heuristic currently cannot distinguish a dispatched agent run from a human or agent working by hand on a
claude/*branch. Given fix(perf): stamp each batched metric with its own timestamp #1400 hits it too, this may be the durable fix; related to agent-completion/truth-gate is permanently unsatisfiable for any PR closing an[aw]issue #1130.
Option 1 is the cheapest if you just want the Dependabot noise to stop.
Generated by Claude Code
The diagnosis is right; the ignore rule is too narrow to close the classThe root-cause analysis here is correct and well-evidenced — But the fix keys on one dependency name, and the defect is a property of the files, not of The generated lock files pin eight actions, not oneAll eight are managed by the same #1000 is a live second instance, already redPR #1000 —
Its Why extending the ignore list is not the fixThe PR comment's justification — " And Dependabot's What would close the classTwo options that scope to the files rather than the names:
Option 1 is the smaller change and closes both #1171 and #1000 without giving up any coverage. Suggested amendment to this PRKeep the Flagging rather than pushing a commit: which of the two options to take is a CI-ownership decision, and this is a draft I don't own. Generated by Claude Code |
Canonical issue
Closes #1403
Narrow slice of the diagnosis recorded in #1398. That issue stays open and is not resolved here — it owns the gh-aw toolchain bump (four
v0.82.14assertions →v0.84.2plus a realgh aw compileregeneration), which needs aghCLI environment this change does not have and does not attempt.Outcome
One
ignoreentry in.github/dependabot.ymlso Dependabot stops openinggithub/gh-aw-actions/*PRs that cannot go green..github/workflows/*.lock.ymlare generated bygh aw compile, andgh-aw-validation.ymlpins that compiler to one version. Dependabot rewrites theuses:pins inside the generated artifacts without rerunning the compiler, so the job's finalgit diff --exit-code -- *.lock.ymlstep regenerates them at the pinned version and fails on every such bump.PR #1171 (
github/gh-aw-actions/setup0.82.14 → 0.84.2) is the worked example.gh aw compileitself runs clean —✓ Compiled 2 workflow(s): 0 error(s), 0 warning(s)— and the diff step then reports both lock files reverting the bump (run 30993992684):The compiler pin, not the lock file, owns that version — so that PR is unmergeable by construction. #1398 records that the remediation loop has re-triaged it four separate times, re-deriving the same diagnosis each run.
Scope
.github/dependabot.yml— anignoreforgithub/gh-aw-actions/*under thegithub-actionsecosystem, plus an inline comment recording the upgrade path (bump the version ingh-aw-validation.ymlat the extension install, the version assert, and theactions-lock.jsonentry key + SHA; update.github/aw/actions-lock.json; recompile; commit the regenerated lock files in one change).Why this costs no coverage
github/gh-aw-actions/setupis referenced only by the two generated lock files and by the SHA assertion insidegh-aw-validation.yml— verified withgrep -rl 'gh-aw-actions/setup' .github/, which returns exactlyactions-lock.json, the two.lock.ymlfiles, andgh-aw-validation.yml. No hand-written workflow uses it.It also does not obstruct #1398: that upgrade path is compiler-driven, so a Dependabot proposal was never a usable input to it.
Risk
ignoreentry. No workflow logic, no generated file, no application code.MERGE_POLICY.mdv2 §8 — CI config.gh-aw-actionsbump is not surfaced by Dependabot. Mitigated by the inline comment and by ci: gh-aw toolchain pin is hard-coded to v0.82.14 in 4 places, making Dependabot bumps (#1171) structurally unmergeable #1398 tracking the upgrade explicitly.Verification
Head
e6fd66f, which merges currentmaininto the branch. The diff againstmainremains exactly one file,+20/-0.Against
MERGE_POLICY.mdv2:Closes #1403; template followed.Canonical issue and evidencesuccess,PR Governanceneutral.validate,guards,lint-python,lint-frontend,build,test,CodeQL,gitleaks (working tree),dependency-reviewall success.Generate and Upload Coverageis not required here — the diff touches neithersrc/**,apps/**, nortests/**. It is stillin_progress, which is exactly the permanently-pending case §2 warns about.E2E Pipeline Testsskipped;Security Scan - javascriptsuccess though no JS/TS changed.Review skipped: excluded by label configuration— §3: "A reviewer that skips for configuration reasons satisfies this gate." Vercel Agent Review success.apps/web/**changes. Vercel preview is READY regardless..github/dependabot.yml; the diff is that file alone..github/dependabot.yml.mainmerged in cleanly ate6fd66f;mergeable_stateclean.Also verified locally:
.github/dependabot.ymlparses underyaml.safe_load, thegithub-actionsecosystem resolves to exactly oneignoreentry{'dependency-name': 'github/gh-aw-actions/*'}, and the other four ecosystems (npm:/,npm:/apps/web,pip:/,pip:/src/youtube_extension/backend) are unchanged.Prior blocker — resolved, no longer applicable
This PR was previously
HALTEDonagent-completion/truth-gate, which returnedinvalid_payloadbecauseagentTaskApplicabletreated anyclaude/*head ref as an agent dispatch and demanded an intent-snapshot comment that could not be authored retroactively.That gate was retired in #1431, and
MERGE_POLICY.mdv2 records the same finding independently — the gate was "red on ~100% of pull requests for weeks, including merged ones." It no longer appears in this PR's check set. The earlier blocker note has been removed from this description rather than left to mislead.Production evidence
Not applicable. This change alters repository dependency-update configuration only; it ships no runtime code and has no deployable surface. The Vercel preview on
e6fd66fis READY and unaffected.Agent handoff
On merging: v2 §8 classes this as A (CI config), which the policy says auto-merges on gates 1–7, and §"What is deliberately not here" states "No per-PR human merge clicks." All seven gates are met. I have not merged it: adoption step 6 ("Enable Class A auto-merge") is still unchecked, branch protection and the merge queue are not enabled, and merging to
mainis irreversible — so the mechanism the policy describes does not yet exist to carry it. This is ready for whoever enables it, or for a manual merge.