- check
- test · cargo nextest run -p acme-billing
- failed
- billing::invoice_rounds_half_up (1 of 214 judged; target 214)
- log
assertion `left == right` failed left: 400 right: 201 at crates/billing/src/invoice.rs:188- reproduce
- modernci ci --from lane-billing --only test
- diff
- 3 files, +41 −12
- evidence
- red before, green after, measured by ModernCI
- sealed
- weakening
**/tests/**is sealed: only a person's order unseals it
Agent-first CI.
Your agents write the code. ModernCI judges it, merges it, and tells you what each merge cost.
Self-hosted CI built for coding agents. Every move goes on the record. One binary in place of your runner, cache, merge queue, cheap runners and fix bot.
Read https://modernci.dev/llms.txt and set up ModernCI on this repo.Works with Claude Code, Codex, or any agent that can run commands.
In use on our own repos today. Self-host release: follow the changelog.
38 changes merged. 214 machine minutes, $1.12 of agent spend, 6 minutes of waste. example
| Move | Verdict | Checks | Cost | ||||
|---|---|---|---|---|---|---|---|
| #4402 lane-search→predev | merged | 2 run · 5 reused | $0.03 | ||||
| #4399 lane-billing→predev | red | 4 run · 3 reused | $0.44 | ||||
Verdict red on billing::invoice_rounds_half_up. Appealed: work item wi-0412 sent to agent host mbp-3, attempt 1 of 2. | |||||||
| #4398 lane-docs→predev | merged | 0 run · 7 reused | $0.00 | ||||
| Docs only. Every check's input key already had a green verdict, so nothing ran and it cost nothing. | |||||||
| #4396 lane-api→predev | merged | 3 run · 4 reused | $0.06 | ||||
| #4395 lane-ui→predev | waiting | 5 run · 2 reused | $0.05 | ||||
| #4390 predev→dev | merged | 3 run · 4 reused | $0.11 | ||||
| Two warm slots would miss the 20m deadline, so the router sent the tests to one cloud runner. | |||||||
Your agents open 30 PRs a day. Your CI was built for 3.
We ran our own large Rust monorepo with a fleet of coding agents for months. These are numbers from that log, not a survey.
The Actions minutes cap, hit. A 4-shard matrix, a preflight and a fold job ran on every PR, about 2,000 extra runner-seconds each. Then everything stopped.
A silent stall. The engine acted only on events. A quiet repo produced none, so nothing merged and nobody knew.
A red blamed on the wrong PR. The failing test was a flake. The PR it blocked had not touched it.
Every agent idle. A weekly usage limit stopped the fleet, and nothing resumed it.
Quality is how CI gets cheap.
Quality, speed, cost: a chain, not a trade-off. Each link pays for the next.
Right verdicts
A verdict that is right the first time. A reuse key that is right, so nothing is judged twice.
Fewer wasted runs
No re-run, no wrong red handed to an agent, no attempt spent chasing a flake.
Faster done-to-merge
The time from an agent's "done" to the merge, with nothing waiting on a stale verdict.
Lower cost per merged change
And lower risk. The one number ModernCI is built to move.
Committed, judged, merged — or appealed.
The agent owns the whole loop. People step in only to answer a question, which becomes a ruling, or when the appeals run out.
- CommittedThe agent pushes and calls
doneover MCP. ModernCI opens the pull request. - JudgedEach check's input key is looked up first; a stored green costs nothing. The rest run on the cheapest backend that finishes before the deadline. The verdict is green or red, and it cites its evidence.
- MergedOn a green verdict, the target fast-forwards onto the judged commit.
- Red becomes a work itemThe failing check, the smallest log that shows it, the command to reproduce it, the diff and every earlier attempt.
- AppealedThe failure ladder sends it to a free agent host. The failing check is judged first; the full move is judged again only if that comes back green.
# the verdict a commit on predev needs to enter dev to: dev deadline: 20m checks: build: { run: cargo build --workspace --all-features } clippy: { run: cargo clippy --workspace --all-targets -- -D warnings } test: { run: cargo nextest run --workspace, scope: affected } gates: { run: cargo xtask gate --all, baseline: target } oracle: { run: bin/oracle replay --strict } guarded: [ golden/**, "**/tests/**", .ci/** ] on_green: merge
ModernCI takes no agent's word.
Built for agents means built for agents that cut corners. A verdict you can trust means no wrong merge to unwind and no wrong red to chase. A suspected flake gets a second witness, a re-run on another machine, before anyone is blamed.
"Nothing was judged" is red.
Zero tests, a duration that collapsed because tests skipped, or a count that dropped against the target.
Red before, green after.
A fix for a failing test must show both, measured by ModernCI, not reported by the agent.
Weakening a test asks first.
Deleting an assertion, skipping a test or editing a golden is sealed: only a human order unseals it. It goes to the owner's Questions queue, not to merge.
One number:
cost per merged change
Machine minutes plus agent spend, divided by changes merged. Everything goes on the record. Measured on our own monorepo, before and after. No projections: until the switch-over is done, this page shows "before" and says so.
One binary. Any forge. Your machines. No cloud required.
Every install is a complete daemon. Machines connect out to it, so nothing needs an open port. Connect to modernci.dev only if you want one view of many daemons.
- any laptop or server
- Claude Code, Codex, anything
modernci host join
- the loop · the store · secrets
- the UI and the operator MCP
- forges: GitHub, GitLab, Gitea, Forgejo
- this machine, an SSH host, a VM
- any cloud, priced per minute
- warm pools sized by workload
modernci cloud connect links a daemon to a modernci.dev tenant over one outbound connection. Code, logs and secrets stay home.Three commands.
Run the daemon, register a repo, point a machine at it. Your existing workflow files import as they are.
Read https://modernci.dev/llms.txt and set up ModernCI on this repo.Works with Claude Code, Codex, or any agent that can run commands.
Or by hand preview
docker run -p 8080:8080 -v mci:/data modernci/moderncimodernci repo add you/your-repomodernci host join https://ci.your.lanmodernci import .github/workflows/ci.yml writes the branch file. Then it judges beside your old CI, move by move, and you cut over when the verdicts agree.