One task, five commands, any agents.
The relay below is the whole product: plan, pass, take, coordinate, merge. Scroll through it, then read what each step actually does on disk.
The same five steps, on disk.
$ baton start my-task --agent claude
Every task starts as a standard git worktree: its own branch, its own working directory, zero contact with any other agent's checkout. The planning agent works there while Baton records the session — plan updates, files touched, token spend — into a JSONL buffer it can distill later. Nothing proprietary: kill the session and the worktree, branch, and buffer are all still on disk.
$ baton pass my-task --to cursor
The pass is a curated brief, not a raw history dump. Baton merges the session transcript with the agent-agnostic progress ledger, drops anything that predates the last commit (that work already landed — git is the truth for it), and writes a single HANDOFF.md under a hard character budget: objective, plan, remaining checklist, and an estimated cost to finish on the receiving model.
$ baton take my-task
The receiving agent doesn't need Baton integration: take prints the execution prompt between delimiters, so you can paste it — or pipe it — into any CLI agent. The brief's status flips to in-progress in the same file, and if commits landed in the worktree after the brief was written, a stale-brief warning is prepended inside the delimiters so even a piped agent sees it.
$ baton signals
While agents work in parallel, editor hooks write every file touch into a local SQLite signal store. The daemon reconciles those signals against what git actually reports dirty — a signal whose holder is provably gone is cleared, one it can't verify is kept — and streams the live picture over server-sent events. Agents ask check_files over MCP before touching a path; two agents on one file get warned before the merge conflict exists.
$ baton done my-task
Finishing is bookkeeping, not archaeology: done files a completion report — what shipped, what it cost — into .baton/reports/, and merge squash-merges the task branch back and reclaims the worktree. The per-file edit history stays queryable afterwards, so 'who touched this file, in which task' has an answer months later.