Problem
When autoloop's source workflows change (bug fixes, new features, breaking changes), installed copies in downstream repos become stale. There is no upgrade mechanism — the install is a one-time file copy + compile. This means fixes like #18, #20, #23, #25 don't reach repos like githubnext/tsessebe until someone manually re-copies and recompiles.
The tsessebe case demonstrates the cost: 18 duplicate PRs were created because the stale .lock.yml didn't include the reset-if-merged fix from PR #25.
Goal
A smooth, automated upgrade path that:
- Detects upstream changes daily
- Creates a PR in the downstream repo with the updated workflows
- Handles breaking changes gracefully (adapts local customizations)
- Requires minimal human intervention for non-breaking updates
Design
Component 1: upgrade-check agentic workflow (lives in autoloop repo, installed into downstream repos)
A new gh-aw agentic workflow that runs daily in the downstream repo:
on:
schedule: daily
workflow_dispatch:
What it does each run:
-
Detect upstream version: Fetch the latest autoloop source from githubnext/autoloop (using gh api or cloning to /tmp). Compare the upstream workflows/autoloop.md and workflows/sync-branches.md against the local .github/workflows/ copies.
-
Diff classification: Classify changes as:
- Non-breaking: Documentation, prompt wording, new optional features, bug fixes that don't change the frontmatter schema. These can be applied automatically.
- Breaking: Changes to frontmatter keys, step structure, tool configuration, permissions, or safe-output schema. These need agent-assisted adaptation.
-
Preserve local customizations: Before applying upstream changes, extract local overrides (e.g., schedule: every 30m instead of every 6h, custom network.allowed entries, modified safe-outputs limits). After applying upstream changes, re-apply local overrides.
-
Recompile: Run gh aw compile to regenerate .lock.yml files from the updated .md sources.
-
Validate: Run gh aw compile --validate to ensure the compiled output is valid.
-
Create PR: Open a draft PR with the changes titled [Autoloop] Upgrade workflows to <upstream-sha-short>. The PR body should include:
- Changelog of upstream changes (commit messages since last upgrade)
- Classification (breaking / non-breaking)
- Any local customizations that were preserved
- Any manual action required
Component 2: gh aw upgrade CLI command (lives in gh-aw)
A CLI counterpart for manual/interactive upgrades:
# Check for available updates
gh aw upgrade --check
# Apply upgrade, auto-fix breaking changes where possible
gh aw upgrade --fix
# Upgrade a specific workflow
gh aw upgrade autoloop --fix
--fix behavior:
- Detects the source repo from the
.lock.yml header (Source: githubnext/autoloop)
- Fetches the latest upstream
.md source
- Three-way merges: upstream base → upstream new → local, preserving local customizations
- Recompiles
- Reports what changed and what couldn't be auto-fixed
Component 3: Version tracking
Add a version/provenance block to the installed .md files so the upgrade tooling knows what baseline to diff against:
# Bottom of the installed .md file, or in a sidecar file
_autoloop:
source: githubnext/autoloop
installed_from: abc1234 # commit SHA at install time
installed_at: 2026-04-04T05:00:00Z
compiler_version: v0.65.6
Or a simpler approach: a .github/workflows/.autoloop-version.json:
{
"source": "githubnext/autoloop",
"commit": "abc1234def5678",
"installed_at": "2026-04-04T05:00:00Z",
"workflows": ["autoloop", "sync-branches"]
}
This gives the upgrade tooling a baseline commit to diff against, so it can show exactly what changed upstream since the last install/upgrade.
Implementation plan
Phase 1: Version tracking + gh aw upgrade CLI
- Add version metadata to
gh aw add — when installing, write .autoloop-version.json (or equivalent) recording the source commit.
- Implement
gh aw upgrade --check — compares installed commit against upstream HEAD, shows changelog.
- Implement
gh aw upgrade --fix — fetches upstream, three-way merges preserving local customizations, recompiles.
Phase 2: upgrade-check agentic workflow
- Add
workflows/upgrade-check.md to the autoloop repo.
- Include it in the install process (add to
install.md).
- The workflow uses
gh aw upgrade --fix internally, then creates a PR with the result.
Phase 3: Breaking change detection
- Define a schema for the frontmatter DSL (what fields exist, what values are valid).
- Classify upstream diffs against this schema to detect breaking vs non-breaking changes.
- For breaking changes the agent can't auto-fix, create an issue instead of a PR, explaining what needs manual attention.
Open questions
- Should the upgrade workflow run as a gh-aw agentic workflow itself, or as a plain GitHub Actions workflow? An agentic workflow can reason about breaking changes and adapt, but a plain workflow is simpler and doesn't consume agent compute for routine updates.
- Should local customizations be extracted into a separate config file (e.g.,
.autoloop/config.yml) to make three-way merging cleaner? This would separate "upstream workflow logic" from "local overrides."
- How to handle the case where the user has made significant manual edits to the
.md source beyond simple config overrides?
Problem
When autoloop's source workflows change (bug fixes, new features, breaking changes), installed copies in downstream repos become stale. There is no upgrade mechanism — the install is a one-time file copy + compile. This means fixes like #18, #20, #23, #25 don't reach repos like
githubnext/tsessebeuntil someone manually re-copies and recompiles.The tsessebe case demonstrates the cost: 18 duplicate PRs were created because the stale
.lock.ymldidn't include the reset-if-merged fix from PR #25.Goal
A smooth, automated upgrade path that:
Design
Component 1:
upgrade-checkagentic workflow (lives in autoloop repo, installed into downstream repos)A new gh-aw agentic workflow that runs daily in the downstream repo:
What it does each run:
Detect upstream version: Fetch the latest autoloop source from
githubnext/autoloop(usinggh apior cloning to/tmp). Compare the upstreamworkflows/autoloop.mdandworkflows/sync-branches.mdagainst the local.github/workflows/copies.Diff classification: Classify changes as:
Preserve local customizations: Before applying upstream changes, extract local overrides (e.g.,
schedule: every 30minstead ofevery 6h, customnetwork.allowedentries, modifiedsafe-outputslimits). After applying upstream changes, re-apply local overrides.Recompile: Run
gh aw compileto regenerate.lock.ymlfiles from the updated.mdsources.Validate: Run
gh aw compile --validateto ensure the compiled output is valid.Create PR: Open a draft PR with the changes titled
[Autoloop] Upgrade workflows to <upstream-sha-short>. The PR body should include:Component 2:
gh aw upgradeCLI command (lives in gh-aw)A CLI counterpart for manual/interactive upgrades:
--fixbehavior:.lock.ymlheader (Source: githubnext/autoloop).mdsourceComponent 3: Version tracking
Add a version/provenance block to the installed
.mdfiles so the upgrade tooling knows what baseline to diff against:Or a simpler approach: a
.github/workflows/.autoloop-version.json:{ "source": "githubnext/autoloop", "commit": "abc1234def5678", "installed_at": "2026-04-04T05:00:00Z", "workflows": ["autoloop", "sync-branches"] }This gives the upgrade tooling a baseline commit to diff against, so it can show exactly what changed upstream since the last install/upgrade.
Implementation plan
Phase 1: Version tracking +
gh aw upgradeCLIgh aw add— when installing, write.autoloop-version.json(or equivalent) recording the source commit.gh aw upgrade --check— compares installed commit against upstream HEAD, shows changelog.gh aw upgrade --fix— fetches upstream, three-way merges preserving local customizations, recompiles.Phase 2:
upgrade-checkagentic workflowworkflows/upgrade-check.mdto the autoloop repo.install.md).gh aw upgrade --fixinternally, then creates a PR with the result.Phase 3: Breaking change detection
Open questions
.autoloop/config.yml) to make three-way merging cleaner? This would separate "upstream workflow logic" from "local overrides.".mdsource beyond simple config overrides?