I label a GitHub issue agent and tower takes it from there. A systemd timer runs the loop every two minutes for each repository. It checks out a branch, runs a coding agent on the issue in a bubblewrap sandbox and opens a PR. To merge, the PR needs passing CI and a pass from a reviewer: a second model with no tools and no memory of the worker’s run, which sees only the issue, the PR description, the diff and CI’s result. If CI fails or the review blocks, the worker gets one automatic revision. When both pass, the PR merges on its own, or waits for me in repos where auto-merge is off.
The loop runs unattended, so it has limits. It won’t open a diff that adds more than 300 lines, code I’ve marked as safety-critical needs my label before the agent can touch it, and a failure on main after an auto-merge opens a revert PR and pauses auto-merge for that repo. Each run adds a line to a log with the model, estimated cost, review result and what I did with the PR. silviana, a small web console, shows each repo’s timer and its current or last run.
On October 17 and 18 it worked on four of my repos, including gaidin and moiraine, with Sonnet 5.5 as the worker and Opus 5.5 as the reviewer. It opened 31 PRs and all 31 merged: 22 I merged as they were, 8 merged on their own and 1 I merged before the review finished. The worker runs came to about $8 by tower’s own estimate.
I’m rebuilding it as dragonmount: the same behavior in new code, with a web UI over the loop’s state and models from Anthropic, OpenAI or OpenRouter.