I’ve been a big fan of Renovate for a couple of years already. Renovate scans your repositories, detects outdated package versions, and opens pull requests to automatically bump them. It’s similar to Dependabot in that it keeps your dependencies up to date. If I had to compare them in one sentence, I’d say Renovate is less integrated in the GitHub ecosystem, but handles more ecosystems and, more importantly, is extensible. My current company is a happy Renovate user, and I already started to use it in some repositories.
I have previously written about Agentic Workflows.
As a reminder, you first create the workflow in Markdown with a very loose syntax.
Then, you "compile" it to generate a GitHub Workflow-compliant YAML file, suffixed with .lock.yml.
In this post, I want to describe the problem when combining the two, how I tried to fix it, and the correct solution.
The core problem
Renovate is very eager to please.
By default, it scans all ecosystems used for dependencies:
build.gradle.kts, pom.xml, pyproject.toml, Dockerfile, GitHub workflows, etc.
Most "manual" GitHub workflows use GitHub actions, which are versioned dependencies.
The generated lock of agentic workflows does make use of GitHub actions, in particular gh-aw-actions/setup.
When Renovate worked on my repository, it did what it always does.
It searched for candidate files, found my documentation-review workflow’s lock file, scanned the dependencies, and opened a PR bumping the SHA to the latest, including gh-aw-actions/setup.
So far, so good.
However, it created an interesting problem.
The action SHA pointed to a new version of gh-aw-actions.
The script body inside the same file didn’t change, but referenced a helper script that the new version didn’t provide.
The workflow failed.
The wrong fix
I have to admit I didn’t understand the above synchronization issue at first.
To fix it, I created a new non-agentic GitHub workflow.
Whenever Renovate upgrades lock.yml, the workflow automatically recompiles the agentic workflow.
This introduced a subtler bug.
The trigger fired on any change to docs-review.lock.yml, not just gh-aw-actions version bumps.
In my case, Renovate later opened a separate PR to pin the Node.js version inside the same file:
the recompile workflow triggered, ran gh aw compile, and overwrote the file, rolling back the node-version change Renovate had just made.
The actual solution
After the second rollback, I realized something was fishy and understood the root cause.
The compiler generates the whole lock file from a single gh-aw release.
The action pin and the inline scripts inside the file must match.
Renovate bumped the former and left the latter untouched.
The solution was much simpler. It consisted of two parts.
- Exclude the lock file from Renovate
-
Renovate has an
ignorePathsentry. I added the lock file andagentics-maintenance.yml, another workflow that the compilation generates:renovate.json"ignorePaths": [ ".github/workflows/docs-review.lock.yml", ".github/workflows/agentics-maintenance.yml" ] - Update the actual source, then recompile everything
-
The real source of version pins is
.github/aw/actions-lock.json, a manifest file thatgh aw compilereads to resolve action SHAs. Renovate can’t update this file yet. There’s an open feature request to support it. In the meantime,gh aw update-actionsrefreshes the manifest. I kept my recompile workflow but narrowed its trigger to this single file. When the manifest changes, the workflow fires and runs baregh aw compile, regenerating all compiled artifacts at once.on: pull_request: branches: [master] paths: - .github/aw/actions-lock.jsonGH_TOKEN=$ gh aw compileThe
gh-awdocumentation warns against editing generated references by hand: you should rungh aw compileto regenerate them. It boils down to the same split: the manifest owns the pins, the compiler owns the generated outputs.
Conclusion
Generated files are not dependency files, even when they contain version strings. We all know we shouldn’t change generated files. New tools shouldn’t change this approach.
In our case, Renovate should only know about the source, not the generated files, even when they are under source control. Ergo, filter out files generated by agentic workflows.