Matt Compton
← All projects

AI software pipeline

A system that takes a written software issue from ticket to merged code. AI coding agents do the work, and no human approves the merge.

533issues taken from ticket to merged code, from July 3 to October 2, 2026
81%of my merged pull requests since mid-August closed an issue the pipeline handled
$11.45median compute cost per issue since mid-August, at API list price
Built for
My own software projects, including DSGA Tools and the pipeline itself.
Status
In use since July 2026.
Figures
Measured October 2, 2026, from 1,943 recorded agent runs on the two computers that ran it.
My role
The design ideas listed below, decisions about behavior and scope, and handling stalled issues. Claude Code wrote all the code.
Built with
Python. Each agent is a Claude Code session. GitHub issues and labels hold each issue’s state.
Timeline
First commit June 29, 2026. First recorded run July 3, 2026.
Size
About 23,100 lines of Python, about 33,500 lines of tests, and 1,702 commits.
The Pipeline page of the dashboard. A project list on the left shows dsga-app opened with three issues labeled ready-to-implement. The queue on the right holds dsga-app issues 273, 274, and 275, each set to run through the entire pipeline. A Completed runs table below lists review-merge and implementation runs, all marked success.
The dashboard’s Pipeline page. A dsga-app issue is in implementation, and two more wait in the queue. Finished runs are listed below.

The problem

I was doing every step of each change by hand, in one Claude Code session after another.

I would start a session to implement a plan or a fix. If the app needed a smoke test, I ran it myself. (A smoke test is a quick run through the app to check that its main features still work.) Then I ran a code review on the pull request, usually several times, until the major problems were gone.

I wanted those steps to run without me, including while I slept.

What I built

The system has three parts, built in this order.

A dashboard runs all three. I can open it from my phone or tablet, and it notifies my phone when it needs me.

The Factory page. The planner settings show project dsga-app, mode auto, batch size 6, and a daily run at 6:00 AM. Batch 9 lists six issues in order: two done, one running, one queued, and two planned, with Pause, STOP, and Cancel batch buttons below.
The Factory page during a batch of six issues. Two are done, one is running, and three are queued or planned.

How it works

A label is a tag on a GitHub issue. It shows which stage the issue has reached. Labels on each issue hold the state, and every stage is a fresh agent session that works one issue and exits.

Label on the issueStageWhat happens
ready-to-implementImplementationAn agent writes the change on its own branch and opens a pull request. When the change needs a smoke test, the agent also writes the scenarios for it. It never merges.
needs-smoke-testingSmoke testAn agent runs the app through those scenarios. A failure sends the issue back to implementation, at most twice.
needs-code-reviewReview and mergeA program runs the review sessions below. They find problems and fix the ones that must be fixed before the merge. Then the program merges.

Review and merge is a program that runs several agent sessions in order.

  1. ModelA finder looks for problems in the code.
  2. ModelA second finder checks documents and instructions, when those changed.
  3. ModelA judge sorts each finding: fix before merge, file as a follow-up issue, or decline.
  4. ModelA fixer fixes what must be fixed, for up to three rounds.
  5. CodeA merge gate brings in the latest main branch and runs the project’s checks. It merges only if they pass.

Any stage can stop and mark the issue needs-human-review. I call this a park. A parked issue waits until the problem is cleared.

The dashboard allows only one pipeline run at a time on each computer. It refuses to start a run when my subscription is near its usage limit.

Triage looks at one issue per run. It can label the issue ready, send me a question, mark the issue as work for a person, or report that the problem is already gone.

The factory leaves the choice of issues to the model. It orders issues by importance first, then by dependency. No human approves its picks. When one of its issues parks, a repair run (a separate agent session) tries to clear it, and the factory gives up after four parks.

A supervising session. I often run a separate Claude Code session with one of my “watch” skills (written instructions for one kind of task). I call this a watch session. It follows the queue, clears the parks it can diagnose, and asks me only when it is stuck.

One issue through the pipeline

Triage
Model

Checks that the issue is ready for the pipeline and adds the label.

Needs meA question, or work for an interactive session
Implementation
Model

Writes the change on its own branch and opens a pull request.

ParkWaits until the problem is cleared
Smoke test
Model

Runs the app through written scenarios. A failure sends the issue back to implementation.

ParkWaits until the problem is cleared
Review and merge
ModelCode

Finders, a judge, and a fixer. The merge gate runs the checks.

ParkWaits until the problem is cleared
Merged

The checks passed. The change is placed in the main branch.

My role and the AI’s

Claude Code wrote all the code.

Four of the design ideas were mine:

Other important choices were Claude’s proposals, which I approved. They include merging on the checks’ real exit codes (instead of on the agent’s opinion), and splitting the review step into finder, judge, and fixer.

I make every decision about how an app, agent, or dashboard should behave. For technical choices during a park, I ask Claude’s advice and usually take it.

The Triage page. The inbox lists dsga-app issues, the top one marked needs-you and the rest marked labelled. The report on the right shows the question, an example, a recommendation, and what the agent changed.
The Triage page. A “needs you” report asks me a question about dues prices and recommends an answer.

Why it merges without me

I do not read code, so a human review step before the merge would add nothing.

For projects that only I use, a merged pull request is good enough. I find problems by using the software, and I file each one as a new issue. For a project someone else uses, such as DSGA Tools, I test it myself before I ship it.

Results

From July 3 to October 2, 2026, the pipeline took 533 issues from ticket to merged code across five projects.

MeasureFigure
Issues taken end to end533
Issues that parked at least once91 of 533, or 17%
Median compute cost per issue, since mid-August$11.45 at API list price
Share of that cost spent in review70%
Median agent time per issue, since mid-August39.5 minutes over 3 runs
Median time from first run to merge, since mid-August0.86 hours

What went wrong

Safety

The agents run with permission checks switched off and with no sandbox. A sandbox would limit the files and programs an agent can reach.

An agent can do anything my Windows login can do. It also holds a GitHub token with write access. Three things contain it: the one-at-a-time queue, the usage limits, and the merge gate.

That is acceptable for private projects on my own computers, with no customer data. It would need a different security model before it went near an employer’s code.

Skills around the pipeline

I wrote several Claude Code skills that the pipeline uses or that supervise it.

Status

The pipeline is in use and ready for the next issue from several projects.