Autonomous coding in lanes with Trove

Run autonomous claude coding sessions in the lanes of your git projects, and land what they made

Trove runs autonomous Claude Code sessions on your git projects. A project is one repository. Inside it, each lane is a worktree and a branch where one session at a time works on one work unit. Describe the work in the evening, let the lanes run, and in the morning read what changed and land what you want. No session ever writes to your main checkout.

You are responsible for ToS compliance. Trove is built to be made compliant by configuration, not by rewriting code. Before running unattended work you must independently verify what you do against the live Anthropic Usage Policy and consumer terms — these change often. Defaults are deliberately conservative: unattended resume off, a spawn stagger so sessions never start back-to-back, and no API spend. See What Trove does on your behalf.


Prerequisites

  • A working OctoMY™ build — see Build for Linux desktop.
  • The claude CLI installed and logged in to your subscription (run claude once interactively and complete the login). Trove draws on the Max/Pro subscription; it never reads or stores your token, and it starts every session without ANTHROPIC_API_KEY, so work is never silently billed per token.
  • A git repository to work on. The dogfooding target is the source of the OctoMY™ applications.

Projects, lanes and sessions

Thing What it is Where it lives
Project One git repository that Trove works on, with its name, color, skills and settings A checkout: one you already have, or a clone that Trove made for you
Lane One line of concurrent work: a worktree and a branch, lane-<N>, and at most one session at a time The project's worktree folder
Session One Claude Code conversation working in a lane's worktree, recorded turn by turn The session store of your identity
Work unit The job a lane picks up: an instruction and a Definition of Done The spec database

A lane is created the first time you give it work, and Trove never removes one by itself. There is no automatic assignment: you pick the lane, as you would pick a free desk. A lane claims its work unit under a lease, and holds the lease of its worktree while its session runs. If the lane dies, the leases expire and the unit goes back to the pool.

Lanes used to be a pair of worktrees, a spec side and an implementation side. That pair is retired, because specs are rows in a database now and not files in a branch. Lanes, and why there is only one kind explains the change, and Trove parts explains how a lane is put together from a worktree, a session, its builds and its work units.


Create a project

  1. Open the Hub's Apps menu.
  2. Choose Trove. Trove home opens, with one card for each project.
  3. Click the add card, which is the last card.
  4. Choose the source of the project:
    • Browse an existing local repo, and pick a git checkout you already have. Trove works next to it and never deletes it.
    • Clone a git URL. Trove clones it with your git credentials into its checkout root (the Checkout root setting; by default trove/checkouts in the node's data folder) and owns that clone: removing the project deletes it.
  5. Give it a Name, or leave the name empty to use the repository's name, and press Create.
  6. Trove offers to create the first lane at once. Name it and press Create, or cancel and give lanes work later.

Click a project card to open its project page. The project page has five tabs: Lanes, Specs, Files, Activity and Settings. Right-click a card to rename it, to change its color or to discard it. Find your way in Trove shows each page and how to move between them.

Set the target repo

The Settings tab of the project page holds the project's record:

  • Target repo — the git checkout that the sessions run against. A project with no target repo stays idle, and no lane can start.
  • Worktree root — where the project's lane worktrees go. Leave it empty for the default: next to a browsed checkout, in ../.trove-worktrees/<project id>/, or next to a cloned one, in the checkout root as <project id>-worktrees.
  • Skills (this project) — the bundled skills that go into each lane's CLAUDE.md.

A change is saved as you type and applies at once, with no restart.

Push Settings on the same tab to open the trove settings page for this project. Its rows are in four groups:

  • Sessions — unattended resume (default off), the idle-session time to live and the idle check interval, and the spawn stagger: the minimum time between two session starts, for the burst limit of the server. There is deliberately no concurrency limit.
  • Paths — the spec and plan folders of the repository, and the checkout root.
  • Models — the model and transport of each role, see Choose models per role.
  • Door — whether the Trove door stays open without the Hub's window.

"Write to" sets a value for all projects or for this project only. The Settings tab of Trove home opens the same page on the defaults for all projects. The verification prompt is in the prompt manager.

The Trove settings tab
The Trove settings tab

Give a lane work

Work comes from the spec database. Author it in an OPAL conversation, see Create a spec, then send it to a lane in one of these ways:

  • On the Specs tab of the project page, select a work unit, set the Lane and press Run this. See Edit specs in the workspace.
  • Ask in the OPAL conversation: "Run the gait plan in lane 1." See Run a plan.
  • From a terminal, call trove.dispatch (below).

Trove claims the unit for the lane, creates the lane's worktree if it does not exist, writes the unit's briefing into the worktree's CLAUDE.md, and starts a session. The session then:

  1. Implements the work unit in the lane's worktree and commits it on the lane's branch.
  2. Verifies it: a follow-up prompt in the same session, with its context intact, asks whether the work follows the standard, builds and passes its tests.

A rate limit parks the job, and with unattended resume on, Trove resumes the same session when the limit resets. A session can build and test through kiln with the lane's worktree as its folder, so that each lane gets its fair share of the machine; see Run builds from a lane.

Trove never merges for you while the session runs. Landing the work is a separate step, below.


Watch the lanes

On the Lanes tab of the project page, each lane has a card. The card shows "Lane N (worktree)" or the name of the lane, its phase and its branch. It also shows the work unit of the lane and the state of its session.

The Lanes tab of the project page, with lanes and their sessions
The Lanes tab of the project page, with lanes and their sessions

Click a card to open the lane page. The left side is the session's transcript: the assistant's text as Markdown, tool calls as chips, and the steps of Trove as cards set aside. The right side shows live stats: model, context tokens, branch, worktree and running time. Under the transcript, an input row sends a message to a running session. On a finished session the row becomes Continue, which resumes the same conversation in the lane's worktree with your next prompt.

The lane page
The lane page

To see what a session changed, open the Files tab of the project page and choose the lane's worktree. The project's own checkout is read-only there, and a lane worktree is editable. See Edit specs in the workspace.

On the lane page, Ctrl+PgUp/Ctrl+PgDown (and Ctrl+Home/Ctrl+End) go to the other lanes of the project without the mouse. F1 shows every shortcut. To go up to the project page or to Trove home, push Back. You can also click a name in the bar at the top of the page. If a session needs you to log in again, Trove raises a login screen with an embedded browser (or your system browser). Claude Code completes the login, Trove never sees the token, and the screen closes by itself when the session continues.


Land the work

A lane's commits stay on its branch until you land them. The buttons are on the lane's card:

  • Sync rebases the lane onto the latest default branch of origin (or the local default branch when there is no origin). A conflict aborts the rebase, leaves the branch as it was, and names the conflicting files.
  • Finalize rebases the lane onto the latest default branch, merges it into the local default branch, and pushes. Trove never resolves a conflict for you: a conflict stops the finalize and names the files.
  • Stop closes the live session and keeps everything else.
  • Discard, then Confirm discard, removes the lane's worktree and branch. Work that is not merged is kept first, on a wip/lane-<N> branch.

Every box that works on a project, this one or another machine of a fleet, pushes to the same origin through normal git authentication. The origin URL is the only thing they have to agree on.


Drive Trove from a terminal

Every Trove action is an OPAL task, and the trove tool calls any of them through the door of your user on this computer:

# The projects, and which one is current.
trove call trove.projects

# Lanes and jobs of the current project, as JSON; or of another project.
trove call trove.list
trove call trove.list project=rover

# Run a plan's next work unit, or one named unit, in lane 1.
trove call trove.dispatch lane=1 key=pq7x2m4k9z1

# Stop lane 1: interrupt its session, cancel its builds, release its unit.
trove call trove.lane.stop lane=1

# Land lane 1: rebase onto the default branch, merge, push.
trove call trove.finalize branch=lane-1

# The worktrees of the current project's checkout, and the sessions.
trove worktree list
trove session list
Task What it does
trove.projects Lists the projects: id, name, checkout, origin, and the current one
trove.project.add, trove.project.remove Adds a project on a local checkout or a cloned URL, or removes one
trove.status Counts the jobs by status, and the live sessions
trove.list Lists the lanes and the jobs with their state, as JSON
trove.dispatch Runs a plan's next work unit, or one named unit, in a lane. The lane is created on first use
trove.enqueue Queues a plan document from the repository into a lane
trove.lane.stop Interrupts the lane's session, cancels the builds of its worktree and releases its work unit
trove.sync Rebases a lane onto the default branch
trove.finalize Rebases a branch onto the default branch, merges it and pushes
trove.cancel Cancels a queued job, or stops a running job's session
trove.continue Resumes a finished session in its worktree with your next prompt
trove.switch-model Switches the model of a running job's session
trove.answer-auth Answers the authentication prompt of a running job's session
trove.open Opens Trove home, a project page at a tab (specs, lanes, files, activity or settings) with a key selected, or a lane page. The pages above it open too. Without project, it opens Trove home only

Each trove.* task takes an optional project, by id or by name; without it, the task works on the current project. A task that starts work or changes git asks first, and needs its scope. The worktree.*, session.*, spec.* and build.* families are in the command line reference and the spec OPAL command reference.

The job queue is durable: it is kept in the node's data folder, and after a restart Trove takes up the work that was outstanding. Sessions are durable too: each session's record (lane, branch, worktree, model, timeline) is kept, and that record is what Continue and crash recovery resume from.


What Trove does on your behalf

For each lane session, so that an unattended claude can make progress, Trove:

  • Runs claude inside the lane's worktree (never your main checkout) with --dangerously-skip-permissions, so that it does not stop at each edit.
  • For a session in a terminal, pre-trusts the lane's worktree for claude (it writes hasTrustDialogAccepted for that path in ~/.claude.json), so the first-run trust dialog does not block the start. Trust goes to the lane worktree only.
  • Writes the worktree's .claude/settings.json, with hooks that report when the session is ready and when it is done, and a CLAUDE.md with the work unit's briefing. The briefing says that finished work is committed with no agent-attribution trailer. These files are excluded from git locally, so they never make a lane dirty and never reach a pushed branch.
  • Starts claude without ANTHROPIC_API_KEY, so work runs on the subscription and is never billed per token, and without the session-nesting variables of Claude Code, so each session starts as a fresh top-level claude.

Because --dangerously-skip-permissions lets the agent edit and run code without asking, point Trove only at repositories you own and intend to hand to an autonomous agent, and keep the conservative unattended and stagger defaults until you have checked your usage against the live policy.


See also: Trove spec work — author, edit and run work units · Trove parts · Lanes, and why there is only one kind · Run tests · Contribute

Topics
howto development trove autonomous agent claude lane
See also