Astro's AI triage bot cut open issues from 200 to 30 — and it's open source
Cloudflare's Astro team built an AI-powered issue triage pipeline that runs in GitHub Actions, reproduces bugs, diagnoses root causes, and ships preview fixes. It cut open issues from 200+ to ~30, and the code is now open source as triagebot-action.

The software factory debate is mostly hot air. Cloudflare's Astro team has something rarer: a working example. They built an automated triage pipeline that reads incoming bug reports, reproduces them in sandboxes, diagnoses root causes, and ships preview releases for reporters to verify. It runs entirely inside GitHub Actions, and it's cut Astro's open issues from over 200 to about 30 — with zero in sight for the first time in the repo's 5+ year history.
The pipeline is a state machine driven by issue labels. Every new issue starts with triage needed. The bot reads the issue's comments to figure out where it is and what to do next. It runs four phases — reproduce, diagnose, verify, fix — each handled by an isolated subagent. Subagents pass findings forward via a report.md file, which prevents the LLM from forcing a solution when a bug might not exist.
When a fix lands, the bot spins up a preview release with pkg.pr.new and posts the summary, logs, and install instructions back to the issue. The reporter tests it. If they confirm it works, the bot opens a PR. The whole thing is transparent — anyone can audit the agent's reasoning in the issue thread.
The team generalized the workflow into Flue, an open, platform-agnostic framework for building durable agents and workflows. The GitHub Action itself is decoupled into triagebot-action, a standalone repo with its own tests. Several other teams have picked it up, some forking it to build their own factories.
What the bot's failures taught them
The team's philosophy: if the agent fails to fix a bug, that's a signal the codebase has an architectural or documentation problem. Three culprits: opaque abstractions, missing comments, and insufficient tests. A concrete example: the bot kept trying to modify an if condition in HMR code, fixing one bug but breaking others because that condition had no test coverage. Once they added a descriptive comment explaining the logic, the bot stopped making that mistake.
Every failure becomes a fix to the codebase that helps both the bot and the next human contributor. That's the real win — the automation isn't just closing issues, it's improving the project's health.
The wiring is simple. Add the action to your workflow, set a few secrets, point it at your triage skill:
- uses: withastro/triagebot-action@v1
with:
read-token: ${{ secrets.GITHUB_TOKEN }}
write-token: ${{ secrets.BOT_GITHUB_TOKEN }}
cloudflare-api-key: ${{ secrets.CLOUDFLARE_API_KEY }}
cloudflare-account-id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
triage-model: cloudflare-workers-ai/@cf/moonshotai/kimi-k2.7-code
verification-model: cloudflare-workers-ai/@cf/moonshotai/kimi-k2.6
triage-skill: .agents/skills/triageThe code is open. Fork it, strip it down, or borrow the parts that fit. The underlying idea matters more than the implementation: a sustainable feedback loop that frees maintainers to focus on the framework instead of administering a backlog.
Every time we chase down one of these failures and add the missing comment, test, or clearer boundary, the bot gets noticeably better at that part of the codebase, and so does the next human who works on it.