trunkagents
Open source · in development · sponsored by OZ ↗

The landing layer for agent fleets

Submit once. Land what was checked.

bay is a small open-source command for coding agents that share one Git repository. An agent submits its change once and moves on. bay checks the exact result and lands it on trunk. An executor does the rest, so no person has to watch.

$ bay start CARD-123# open a view with only the paths this change needs
$ bay land# check that exact result, then return
$ bay status# what each change does now, and why it waits
$ bay watch# what changed that affects my work
$ bay undo c7k2m4# a new change that undoes one landing

Rust · one binary · macOS · Linux · Windows · ARM and Intel · MIT · in development

Sound familiar?

Is Git now the limit of your agent fleet?

Do your agents finish in minutes, then wait an hour to land?

→

bay land returns at once. An executor finishes the landing.

Does someone have to watch each merge until it finishes?

→

The agent can leave. The executor checks, lands or asks for one exact repair.

Can you show which checks the commit on trunk passed?

→

bay lands only the exact candidate that passed. It keeps the evidence in Git, signed once you enroll keys.

Do flaky or silent checks still get through as green?

→

A check that crashes, times out or finds no tests blocks the landing. A check that passed once and failed once on the same tree is flaky, never green.

Do your agents retry in loops after a refusal?

→

Each refusal names a fixed reason, what the agent can do, and when to retry. bay refuses an unchanged retry at once, without doing the work again.

Does each new agent pay for a full clone?

→

From a warm machine cache, bay start opens a view of only the paths one change needs, with no full clone.

Built to cut · each agent session, against a session that starts from a full clone

1,000×target
less network to start work, on a warm cache
50×target
faster to the first check that can run
2×target
fewer model tokens per accepted change

These are targets, not results. We will release the benchmark scripts and raw results, so anyone can run them again.

Agents submit and leave.

An executor finishes the landing.

Nothing lands unchecked.

Trunk gets only the exact candidate that passed.

Unknown never passes.

A crashed or silent check blocks the landing.

Refusals say what to do.

Each one names the next step for the agent.

The fleet, as one command shows it

Click a session

laptop-1
build-box
ci-runner
$ bay status --fleetchange c7k2m4 · laptop-1
$ bay land
queued · waiting_for executor_capacity · published false
executor ex-1 claimed op c7k2m4.1
candidate c7k2m4.1.1 on trunk a1b2c3d · unit pass · lint pass
TRUNK_MOVED a1b2c3d → e4f5a6b
candidate c7k2m4.1.2 rebuilt on e4f5a6b · unit pass · lint pass
landed 9d1e07c · the tree that passed is the tree on trunk
agent session ended 11 min before the landing
$

Five sessions on three machines. One change landed after its agent left. One agent learned that an input changed. One change stopped because a check did not answer.

This is an example of the bay status --fleet view. The ids and paths are examples.

Seven names · one meaning each

trunk

The one shared branch. bay only adds to it.

change

One id for one intended outcome. The id stays when the agent revises the work.

view

A sparse checkout of the paths that one change needs.

candidate

The merged snapshot that bay builds from a change and trunk, then checks and lands.

check

Any command that tests a candidate and returns a result.

evidence

A signed record of what one check, review or runtime observation saw on one candidate.

executor

The process that runs the checks on a candidate and lands it on trunk.

What bay promises

01

What lands is what was checked.

bay first builds a candidate from the change and trunk. It checks that exact candidate. bay lands the candidate only if trunk did not move. If trunk moved, bay builds a new candidate and checks again. The commit on trunk is the commit that passed.

candidate → trunk
c7k2m4.1.1 on a1b2c3d pass
TRUNK_MOVED a1b2c3d → e4f5a6b
c7k2m4.1.2 on e4f5a6b pass
landed 9d1e07c
02

Submit once. Walk away.

bay land returns at once. An executor does the rest: bay executor run, or your CI through the same contract. It checks, lands, recovers, or asks for one exact repair. If a reply gets lost, bay finds the first result and does not land twice.

$ bay land
{ "decision": "queued",
  "published": false,
  "waiting_for": "executor_capacity",
  "next": "running" }
03

Unknown is never a pass.

A check that crashes, times out or finds no tests blocks the landing. Finished checks keep their results. A resume runs only the missing checks.

checks · candidate h2w6tz.1.1
unitpass
lintpass
buildpass
docspass
migrationspass
integrationunknown · timed out
CHECK_UNKNOWN · blocked
04

Stale work stops. Repair stays open.

When an input of your change lands, bay tells the agent what changed. The agent can still edit. It cannot land until it checks again.

$ bay watch
c9p3xd landed · api.orders.schema v17 → v18
INPUT_CHANGED · your change reads v17
allowed: read · refresh · repair
05

Every refusal says what to do next.

Each refusal has a fixed reason code. It also lists what the agent can still do, and when a retry can work. bay refuses an unchanged retry at once, so no agent loops.

{ "schema": "bay.result/1",
  "decision": "blocked",
  "reason": "MERGE_CONFLICT",
  "detail": { "paths": ["src/orders/client.rs"] },
  "allowed": ["read", "refresh", "repair"],
  "retry_when": "conflict_paths_changed" }
06

Git is the only store.

Changes, evidence and events are Git commits, notes and refs. There is no database and no server. You can read and recover everything with plain Git, on the host you have.

$ git for-each-ref refs/bay --format='%(refname)'
refs/bay/changes/c7k2m4
refs/bay/requests/c7k2m4.1
refs/bay/landed/c7k2m4
refs/bay/registry
refs/notes/bay/evidence/ci-linux
07

A view costs what the task reads.

bay start opens only the paths that one change needs. All views on one machine share one cache. bay never reads a missing path as a deletion.

$ bay start CARD-123
view sparse · declared paths only
cache shared on this machine
ready · first check can run

Lightweight by design

Small core. Plug-in edges.

bay owns three things: identity, validity and recovery. Adapters do the rest. Your repository stays a plain Git repository. Five commands make the daily loop.

One small binary

bay is one Rust binary that calls the git you already have. We build it for macOS, Linux and Windows, on ARM and Intel. You can also build it yourself with cargo build. It works on SHA-256 and reftable repositories, the Git 3.0 defaults. Every failure test also runs on them.

No database, no server

Every lasting fact is a Git object that a ref can reach. Local files are only caches. To land changes, you need one executor process or your CI.

Any Git host

Use GitHub, GitLab, a bare repository over SSH, or bay host init on your own machine.

Claude Code first

bay hook refuses a write that bay knows is stale. Other agent tools use the same JSON interface.

Your checks, as they are

A check is any command that returns a bay.check.result/1 document. Messages and deploy steps are adapters too.

No model in the decision

bay never calls a model, and it is not a review tool. A review is one more piece of evidence.

Roadmap

Three steps, then we open it.

  1. Now

    Reliable landing

    Submit once and land the exact candidate that passed. An executor finishes the work after the agent leaves. Every crash and lost reply recovers without a second landing.

  2. Next

    Dependency-aware work

    bay watch tells an agent when an input it reads changes. Claude Code hooks refuse a stale write before it happens. bay status --fleet shows every agent session live.

  3. Later

    Evidence-driven completion

    Runtime evidence joins check evidence, with completion profiles and check-cost reports. Failures replay on the real landing path. bay undo lands a change that reverses one landing.

  4. Launch

    Open to everyone

    The repository opens under the MIT licence. Ready binaries ship for macOS, Linux and Windows, on ARM and Intel. We release the benchmark against a full-clone agent session, with its scripts and raw results.

Let your agents land.

bay is for teams that run many coding agents on one Git repository. The repository opens soon under the MIT licence. Tell us about your fleet, and we will tell you when it opens.

hello@getbay.io