Your agents are waiting on tests that already passed.
Cutset is self-hosted CI for teams where agents write most of the code. Edit one function and get results from the 8 tests it affects in 40 seconds, instead of rerunning all 5,000 in 23 minutes.
$ git commit -am "Fix rounding" && git push
$ cutset verify
Same agent. Same edit. Same bug.
Illustrative run. Cutset isn't released yet, so these times are modeled, not measured.
Keeps GitHub Actions
.github/workflows/ci.yml
steps:- uses: actions/checkout@v7- run: cutset verify
One step. Or install the GitHub App and skip Actions entirely.
One binary, one dev box
terminal
$ cutset init --plan$ cutset verify$ cutset up # later: a shared fleet
No account, no root, no cloud credentials to start.
No machines of your own?
site.toml
[pools.aws]adapter = "aws-asg"[costs]overall-cap = { usd = 500 }
Start with an AWS pool and a hard spending cap.
The cost of waiting
2:47 pm at a team running 40 agents.
Nobody here is idle on purpose. Every agent is doing what its pipeline lets it do.
- #13m
- #2code
- #3debug
- #424m
- #59m
- #616m
- #723m
- #88m
- #915m
- #1022m
- #117m
- #12code
- #13debug
- #146m
- #1513m
- #1620m
- #175m
- #1812m
- #1919m
- #204m
- #2111m
- #22code
- #23debug
- #2410m
- #2517m
- #2624m
- #279m
- #2816m
- #2923m
- #308m
- #3115m
- #32code
- #33code
- #34debug
- #3521m
- #366m
- #3713m
- #3820m
- #395m
- #4012m
- waiting on CI · 31
- chasing a known failure · 4
- writing code · 5
- An agent edits one line and waits for all 5,000 tests.See the fix ↓
- A test already passed on agent-7's dev box. CI runs it again anyway.See the fix ↓
- Twelve agents rebase onto the same main and run the same suite twelve times.See the fix ↓
- Your 20 machines sit 18% busy while the hosted CI bill hits $9,400.See the fix ↓
- 4 agents debug TestLedgerRollup. It has been broken on main since 11:02.See the fix ↓
- 27 PRs wait in the merge queue. The last one lands at 5:47 pm.See the fix ↓
At 2:47 pm, 5 of your 40 agents are writing code. The other 35 are waiting, or chasing a failure that isn't theirs.
How it works
Reuse what's still true. Run what isn't.
Every result is tied to the exact code, toolchain, and environment that produced it. Change one function and only the tests that depend on it run again.
- 01
Snapshot
Captures the change, including uncommitted edits. No commit, no push.
- 02
Map
Learns what each test depends on from your build graph and from watching tests run.
- 03
Reuse
A test whose inputs haven't changed keeps its result. Work already running is joined, not repeated.
- 04
Run the rest
Sends the remaining tests to whichever machine finishes them soonest.
acme/payments · 5,000 tests · each dot ≈ 14 tests
run 8 · reused 4,992
Edited ledger/rounding.go. Only the tests that depend on ledger.Round run.
$ cutset explain lastagent-7 · ledger/rounding.go changed8 tests use ledger.Round ran4,992 tests, inputs unchanged reused
Agents call Cutset from the shell and get structured answers. A quick partial run gives fast feedback, but only a full verify can turn a required check green.
Before Cutset skips anything on your repo
0 / 50 matches in a row
Every change runs the full suite and Cutset's pick side by side. You get full-suite results the whole time.
Results that travel
A test that passed on a dev box counts in CI.
Each result records the exact code, toolchain, and platform it ran with. If an enrolled machine already passed a test on those inputs, CI accepts the result instead of running it again.
1 · on devbox-04
$ cutset verify✓ all required checks · 8 runrecorded: a41f9c2 + 1 file · go 1.26
2 · push
$ git pushsame code, same toolchain, same platformnothing left to run
3 · the PR
cutset/required
0 run · 5,000 passed on devbox-04 (enrolled dev box)
Which results count is your call
- ✓devbox-04 · enrolled dev box · counts toward required checks
- ✓ci-ovh-02 · your server · counts toward required checks
- –a laptop that isn't enrolled · a hint only; CI runs the tests
- –a fork PR from an outside contributor · waits for a maintainer to approve the commit
No repeated work
Twelve agents asked. It ran once.
When main moves, every agent rebases and asks the same question. Cutset runs the shared part once and sends the answer to all of them.
- agent-3…
- agent-7…
- agent-12…
- agent-5…
- agent-19…
- agent-22…
- agent-8…
- agent-31…
- agent-14…
- agent-26…
- agent-2…
- agent-37…
main changed ledger and billing · 347 tests cover that change · 1:50
12 agents rebased onto the same main. One run answers all of them. Each agent's own edits still run separately.
Your machines first
Use the machines you already pay for. Burst only when it's faster.
Dev boxes and rented servers cost the same whether they're busy or not. Cutset fills them first, and launches AWS capacity only when waiting would take longer, inside a cap you set.
task billing integration shard · required
free in 0:10 + run 0:30 · no added cost
boot 1:00 + prep 0:15 + run 0:20
Order: 1 · the machine that asked → 2 · your other machines → 3 · AWS, only when your machines would make the work wait longer than 2 min (agent work) or 30 s (required checks). Cutset compares finish times, not instance prices.
$1,120 of $1,500 this month
- New work falls back to your machines.
- Running work is never stopped.
- No check passes because money ran out.
Fleet advisor
Stop guessing which machines to buy.
Cutset knows what your jobs actually need: cores, memory, disk, and when. It replays your real workload against the machines you are considering and shows what each one buys you, before you spend anything.
$ cutset fleet advise --budget 600/moworkload last 4 weeks · 40 agents · 3 host classesbottleneck memory: 38% of admission waits are for RAMcritical path: mostly single-threaded tsc1. +64 GiB on 4 shared boxes+$120/mo · p95 green 9:40 → 5:502. RAM + AWS burst +$540/mo · p95 4:203. +1 32-core server +$310/mo · p95 8:55more cores barely help: type checks don't parallelizeconfidence backtest error 8%weakest: no history on 32-core EPYCmeasure it first: cutset fleet probe (~$3)
Bars show the confidence range. Backtested against what actually happened on your fleet: within 8%.
Known failures
Stop sending agents after failures you already know about.
Cutset keeps every pass and failure with the conditions it ran under. Agents ask whether a failure is new, already broken on main, or flaky, and get evidence back instead of a guess.
- 00m TestRefundWebhook failed. Rerunning suite…
- 23m Passed. Rerunning to confirm…
- 46m Failed. Adding time.Sleep(2 * time.Second)…
- 69m Passed. Opening PR: "Fix flaky refund webhook test"
$ cutset history TestRefundWebhookmain, 14 days: 186 real runs · 7 failedall 7 failures ran with 8+ tests in parallelfirst seen Oct 25 · last seen today 13:52investigation: acme/payments#4182 (agent-3, open, updated 2h ago)$ cutset verify --only 'TestRefundWebhook'✓ passed · only covers TestRefundWebhook
agent-12: Suspected flake, tracked in #4182. Not caused by this change. Continuing.
$ cutset verify✗ TestLedgerRollup ledger/rollup_test.go:142also fails on base 9c1e2a0 with the same error (first seen 11:02)required checks stay red until it's fixed or policy allows an exceptionwebhook sent to your repair agent · 3 other agents stop debugging and keep working
Merge queues
A merge queue that keeps up with 40 agents.
Most merge queues run the full suite on every batch, even when two PRs touch different packages. Cutset reruns only what the combination can affect, so the queue stays cheap enough to leave on.
#881 (ledger) + #884 (checkout UI): 212 tests affected by the combination · 4,788 reused from each PR's own run
The math
Same team, same agents, five times the answers.
One modeled day for a team with 40 agents, a 5,000-test repository, 14 dev boxes, and 6 rented servers.
- #13m
- #2code
- #3debug
- #424m
- #59m
- #616m
- #723m
- #88m
- #915m
- #1022m
- #117m
- #12code
- #13debug
- #146m
- #1513m
- #1620m
- #175m
- #1812m
- #1919m
- #204m
- #2111m
- #22code
- #23debug
- #2410m
- #2517m
- #2624m
- #279m
- #2816m
- #2923m
- #308m
- #3115m
- #32code
- #33code
- #34debug
- #3521m
- #366m
- #3713m
- #3820m
- #395m
- #4012m
- waiting on CI · 31
- chasing a known failure · 4
- writing code · 5
| Measure | Push-and-wait CI | Cutset |
|---|---|---|
| First answer after an edit | 23 min | 40 s |
| Minutes blocked per agent per hour | 46 | 9 |
| Answers per hour, 40 agents | 80 | 400 |
| Test executions per hour | 400,000 | 24,000 |
| Merge queue sustains | 9 PRs/hour | 48 PRs/hour |
| Queue at 2:47 pm | 27 PRs | 1 PR |
| Time lost to a known flake | 69 min | 1 min |
| Your own machines busy | 18% | 64% |
| Changes verified per month | 2,640 | 13,200 |
| Cloud CI spend per month | $9,400 | $1,120 (cap $1,500) |
| Cloud cost per verified change | $3.56 | $0.08 |
Machines you already own or rent cost the same either way and are left out of the cost rows.
$ cutset stats --window 24hrequests 3,212 verify · 10 per agent-hourtests 192,000 run · 15,868,000 reused412 requests joined a run already goingpush→green p50 0:52 · p95 4:10agents blocked 9 min/hour (median)changes 440 verified · $0.08 each
These are the numbers Cutset reports about your own fleet, so the table above stops being a model.
Yours to run
One binary. Your machines. Your rules.
Cutset never…
- ×reuses a result it can't tie to the same inputs.
- ×passes a check because the budget ran out.
- ×stops running work to save money.
- ×runs fork code on your dev boxes.
Starts on one dev box
cutset init --plan, then cutset verify. No root, no cloud credentials, no GitHub App, no account. The same setup grows into a fleet with a small always-on coordinator.
No vendor compute
Dev boxes, OVH servers, EC2, or any Linux machine that can reach your coordinator. AWS Auto Scaling groups when you need more.
Trust you control
You choose which machines' results count. A PR can't remove its own required checks. Untrusted code never writes the shared cache.
Fork PRs, safely
A maintainer approves the exact commit first, or fork PRs run in Firecracker microVMs on a separate pool with their own budget.
Source available
FSL-1.1-ALv2. Use it, change it, run it for your company; just don't sell it as a competing service. Every release becomes Apache-2.0 after two years.
Early access
Get your agents out of the queue.
46 min
of every agent-hour spent waiting on CI today
9 min
with Cutset, on the same team and machines
Cutset is in development. Early-access teams get the first builds and help shape the defaults. Free to run on your own machines.