# bay 0.2.0: more merges, safer promotion

> bay 0.2.0 is out. It merges more changes for the same checks, guards the paths to production, and finds what turned main red. Every new rule is off until you turn it on.

Gudjon Gudjonsson, Founder and CEO of OZ. 2026-10-21. Source: https://getbay.io/blog/bay-0-2-0 (HTML).

bay 0.2.0 is out today. It is the first minor release since bay launched. It adds config tables, result fields and reason codes, so read the changelog before you turn anything on. 0.x means a minor release can still change a command, and the changelog names each change.

## More merges a day

One queue checks one change at a time, so check time, not merging, sets the limit of a main branch. 0.2.0 adds four ways to get more merges from the same checks, and names flaky checks. Each of the four reuses evidence, so it needs `evidence_reuse = "exact-inputs"` in your config.

- **Checks ahead of the turn**: `[executor] ahead` checks queued changes on the main they will most likely meet.
- **Path lanes**: `footprint_lanes` checks a queued change beside the head when their paths do not overlap.
- **Carried results**: with `footprint_lanes` on, a `footprint = true` check keeps its result when nothing it reads changed.
- **Batches**: `batch` checks several queued changes as one tree, and bisects a batch that fails.
- **Flaky checks, named**: `retry_on_failure` reruns a failed check, and a failure then a pass is `flaky`.

> Changes still merge in queue order, and each keeps its own commit.
> A batch member stands on its batch's checked tree, and its record says so.

## Safer paths to production

Main is rarely the last stop, so 0.2.0 looks after the branches that follow it.

- **Promotion targets**: `[[target]]` names a branch such as `staging`, with its required checks and a soak time.
- **Freeze windows**: `[[freeze]]` holds a target, and only a fix or an undo moves it until the window ends.
- **Held on a bay host**: a host from `bay host init` refuses a push that moves a target to a failing commit.
- **Sandbox lanes**: `bay start --lane` opens a change whose checks run, but which never merges into main.
- **No leaks**: bay refuses a change that brings a lane's commits toward main, and names a merge elsewhere that did.
- **A person's approval**: an approval check holds changes on risky paths until an enrolled approver signs a yes.

> On another host, `bay watch` names a target that moves off its source line or fails its checks.
> Only a bay host judges soak and freeze.

## Red main at scale

On a busy main, a post check often runs on only some merges. So 0.2.0 says what it knows, and what it does not.

- **A window you set**: `[red] window` sets how many main commits bay reads to judge red.
- **Pending is not clear**: a post check with no answer in the window shows as `red_pending`.
- **A suspect range**: a red check names its last pass, its first failure, and the merges between.
- **The culprit**: with `bisect_post`, the executor narrows that range to one merge, then reruns it once.

## Who did what

When many agents share one main, you need to know who does what, and which executors run.

- **One key per agent**: `require_actor_proof` refuses a merge while several agents share one agent key.
- **Overlaps up front**: `bay start` and session start name the live changes that declare the same files.
- **Early conflicts reach the agent**: a queued change's merge conflict reaches its agent once, with the paths.
- **Executor presence**: each executor reports its version, machine and queue, and `bay status` warns when none is live.
- **Timing**: every finished operation records its submit, queue, head, check and merge times.

## Off until you turn it on

Every new rule and every new lever is off by default. With your current config, no new refusal applies to your changes. The new reports, such as timing, overlaps and executor presence, refuse nothing.

## Upgrade

On a new machine, install bay with one command. On a machine with bay, run `bay update`, or let the daily check install it. Update a host from `bay host init` first, then the machines that push to it. An older bay refuses config keys it does not know. So merge a new table only after every machine runs 0.2.0.

```sh
curl -fsSL https://getbay.io/install.sh | sh   # a new machine
bay update                                      # a machine with bay
```

> The Update page and the changelog list each step and each change.

## What we have not measured

These levers aim to get more merges from each check. We have not measured them on a real fleet yet, so every speed figure on this site stays a target. The new timing fields let you measure your own wait, before and after.

To teach your coding agent bay, add the skill: `npx skills add gudjon/bay --skill bay -g`. To help build bay, email the founders at hello@getbay.io.
