Air traffic control for AI coding

Nool 7.0: From a Semantic VCS to a Fleet Control Plane

Every agent now works in its own isolated worktree under a fenced lease, reconciles through a real 3-way merge, and coordinates across machines through a new hub control plane.

  • Isolated try worktrees replace one shared working tree per agent.
  • Leases carry a fencing number checked again at the moment a change lands.
  • Fleet builders get their own worktree, branch, and lease instead of a shared writable path.
  • A pre-push CISO gate now holds sensitive-path changes for human attestation.

At 6.14.2, Nool coordinated agents the way a shared office coordinates people: everyone worked at the same desk, and "announce intent" was a sticky note asking others not to touch your papers. Nothing stopped them from touching them anyway. A collision was something you discovered after the fact, in discover conflicts, once two agents had already written over each other.

Nool 7.0 changes the enforcement model. Every agent now gets its own room, with a lock that other agents actually have to check.

Every agent gets its own worktree

nool try new --worktree checks out a branch into its own directory under .nool/try/<name>/ instead of the working tree every agent used to share. propose and try commands run from inside it automatically. Two agents editing the same file no longer means one of them silently loses their work — they're editing different copies, on different branches, and reconciling only happens at try promote.

That reconciliation is now a real merge, not a replay. try promote computes the drift on main since the branch's recorded base, three-way merges it path by path, and — if two agents genuinely changed the same symbol — stops with diff3 conflict markers in your worktree and a non-zero exit code, instead of guessing.

A lease you can actually trust

The old announce intent was advisory: a TTL that nothing rechecked, and nothing stopped a second agent from claiming the same files anyway. Leases in 7.0 carry a fencing number (grant_seq) that's assigned when the lease is granted and checked again at the moment the work is sealed. If your lease expired, or got superseded, the seal refuses it — even if it looked fine when you started. A foreign hold on the files you want now means your try new --nodes command exits immediately, before it writes anything, rather than after.

If you're waiting on another agent, nool announce wait blocks until the lease frees instead of making you poll or message them directly, and nool announce status --follow streams every grant and release as it happens.

Fleets stop sharing a writable path

nool fleet plan --run --isolation worktree and nool fleet start --isolation worktree give every task, or every quorum builder, its own branch, its own agent identity, and its own lease — with the sandbox's write whitelist rooted at that worktree instead of the shared one. A fleet of parallel builders is no longer a fleet of agents trusting each other not to step on the same files; it's a fleet of agents that structurally can't.

Coordination beyond one machine

Nool now has a server side. A nool-hub-server grants atomic, expiring leases over an authenticated API, with OIDC principals and org/repo access control, so agents on different machines can hold the same kind of fenced lease agents on one machine already had. Git-only teams get the same guarantee without a server: leases replicate as commit-backed refs that only ever accept a compare-and-swap write, never a clobber.

A second human gate, for the changes that need one

Nool already asked an architect to sign off before solidifying a change that raised coupling. 7.0 adds a matching gate before push: a knot touching auth, crypto, identity, or billing paths now holds for a named CISO role to attest before it reaches origin. Sensitive code no longer leaves the building with the same scrutiny as a typo fix.

And the fine print

One incidental fix is worth knowing about if you've hit it: lift knots that recorded a full identity list inside every generated mint were quadratic in the number of entities. A lift of a few thousand entities could produce a single knot approaching a gigabyte — unpushable, and slow to even read back. That payload is now linear, so the same lift is now megabytes, not hundreds of them.

Install or upgrade with the same one-liner as always:

curl -fsSL https://www.nool.dev/nool-install.sh | bash

Already have it installed? nool upgrade runs the same installer for you. See the full command reference for everything try --worktree, leases, and fleet isolation can do, or the changelog for the complete list of what shipped.