Skip to content

HOW IT WORKS

One prompt. Six repos. Every step on the record.

The prompt: rename user_id to account_id across six repos. Every plan was checked against the others before any code was written, a baseline test caught a break, the web app’s three parts merged into one branch, and the coordinator made one call the spec didn’t cover, then logged it for you to confirm. Here is every step, straight from the event log.

This run is an example: its timings and events are mocked, but every event type is one OpenFleet really logs. To replay a real run, run pnpm demo from a checkout of the repo.

4m 28sSTART TO DONE
46sYOUR TIME
27AGENTS
6REPOS
0PRS MERGED WITHOUT YOU

01 · YOUR TIMEMinutes from you, hours from the fleet

You talk to one agent, the coordinator. It grills you until it has every answer it needs, writes a spec, and once you approve it, the run is hands-off. From then on it only comes back for a call the spec didn’t cover. Everything else is done by short-lived agents, many at once.

YOUR TIME · AGENT TIME · AGENTS AT ONCE
YOUR TIMEgrill, spec, questions
START TO DONEthe run’s clock
RUNNING NOWagents at this moment
AGENT TIME

youagents running at once

Agent time adds up every session from start to stop. Pauses and stretches with nobody at the keyboard are left out of every time on this page.

02 · THE WHOLE RUNOne conversation, then hands-off

OpenFleet writes every step to events.jsonl: who did what, to which repo, and when. Each unit of work is a child, usually one repo, with its own git worktree and its own agents in turn: a planner, an optional baseline tester, an implementer and a tester. Press replay, or jump straight to a moment.

IN THIS RUN web is split into three children, run by their own repo coordinator. The plans-ready gate opens at 1:49. Four children run a baseline before any code changes (the outlined bars), and mobile waits for sdk-js, because the spec ordered it that way.

EVENTS.JSONL · REPLAY 4:28 IN 16S
4:28.0

plannerimplementertesterbaselinefailedintegration buildyoucoordinator event

Finished run, 4:28 in total. The grill and spec took 39 seconds and your approval 8 seconds. From about 0:50, all eight children planned. At 1:49 every plan agreed and the plans-ready gate opened. sdk-python and billing ran a baseline tester first, then web/app once web/setup was merged, and mobile once sdk-js was done. sdk-python’s first tester broke a baseline test at 3:15; a new implementer fixed it and the retry passed at 4:00. web’s repo coordinator merged setup, ui and app into one integration branch; its full build and tests passed there at 4:00, and web was done at 4:05. mobile started implementing at 3:27 and was done at 4:16. All six repos finished, then the coordinator finalized the run.

LATEST EVENTS

    Bars are agents from start to stop; dots are file edits and test runs. Ticks on the web lane are its repo coordinator checking plans and merging children. The dashed segment is the only time the run waited on a person.

    03 · PLAN BEFORE CODEEvery plan agrees before any code

    Every child plans first. Each plan is checked against the spec, then against every other plan, and one that doesn’t fit is sent back. No code is written until the plans-ready gate opens. Then the coordinator starts the children in build order: a child waits in planned until what it builds on is done.

    IN THIS RUN Every plan agreed at 1:49. mobile, web/app and web/ui waited in planned for the children they build on. Watch step 5 of the build order: the coordinator made a call the spec didn’t cover, and wrote it down for you to confirm.

    PHASE.CHANGED · 8 CHILDREN
    4:28.0

    plannerimplementertestercoordinator checkdone

    Time each child spent in each phase
    Child pending planning plan-review planned baseline implementing testing post-test done

    Each cell shows how long that child spent in the phase; the highlighted cell is where it is now.

    PLANS.CONSISTENT · ASSUMPTION · CHILD.MERGED

    plan or contract checkedimplementer askedfailedfor youdone

    04 · ONE COORDINATOROne coordinator, many repos

    Agents never talk to each other. Each gets a single instruction from the coordinator, does its job in its child’s worktree, and ends with a structured openfleet-report: a status, a summary and, if it has one, a question. Only a question the spec can’t answer reaches you.

    IN THIS RUN The coordinator runs the five single-child repos itself. For web it starts a repo coordinator, which runs the three web children, merges them and reports back once.

    MESSAGE.SENT · AGENT.STOPPED
    4:28.0

    plannerimplementertesterfailedyoudone

    Finished run: the coordinator sent every instruction to the agents of the five single-child repos and one to web’s repo coordinator, which instructed the web children’s agents itself. You answered the grill and approved the spec at the start. All six repos are done.

    05 · THE FLEETThe right model for each role

    Every agent is its own session, so each role can run on its own host and model: Claude Code or Copilot CLI, a frontier model for planning, a local model on your laptop for the code. In step mode an implementer works one small step per fresh session, so a local model never holds more than it can, and a step it can’t finish goes to the fallback model.

    IN THIS RUN Every role ran on Claude Code. Switch to the photo app to see three providers and a model on the laptop.

    AGENT.SPAWNED · HOST · MODEL

    One row per role, host and model, worked out from the event log. Set each one in openfleet.json, for example "implementer": "ollama:qwen3-coder:30b".

    STEP MODE ·
    STEPS ON THE LAPTOP
    HANDED TO OPUS
    RUNNING NOW

    One bar per step, each a fresh session that sees only its own step. The laptop runs two at a time; a step the local model can’t finish moves to the Opus lane, and the job carries on from the next step.

    06 · VERIFYIt checks its own work

    A tester runs each child’s own checks: tests, types, lint, build, contract tests and a scope check that fails any child whose diff leaves its paths. A red check goes back to a fresh implementer with the tester’s findings, up to three times, and the tester runs again.

    IN THIS RUN 193 tests. Contract tests check every consuming repo against the same rows in account.json. Hatched cells are baselines, tests for today’s behaviour in four repos: old callers in sdk-python, invoice totals in billing, the account page in web/app and the offline cache in mobile. One broke in sdk-python, and the retry passed. Then web’s repo coordinator ran all 47 web tests again on the merged branch.

    TEST.RUN · 8 CHILDREN
    193/193

    own testscontract testsbaselinefailedpassed on retry

    One cell per test. The ringed cell in sdk-python is the baseline test that broke on the first run and passed on the retry.

    THE RETRY LOOP ·

    07 · WHEN SOMETHING GOES WRONGProblems stop at the child

    Something always goes off plan. A plan builds past the spec, a check goes red, an agent writes outside its paths, a model gets stuck. Each is caught at the child it happened in, handled there, and logged, so one problem never spreads to the rest of the run.

    IN THIS RUN Three moments went off plan. Each card replays what happened and what OpenFleet did.

    PLAN.REJECTED · SCOPE GUARD · RETRY · QUESTION

    08 · WHAT YOU GETTested work, merged by you

    The run ends the way you chose in the grill. In draft PR mode, each repo gets one draft PR that links to the others and carries the run summary. In staged mode, the changes wait uncommitted in each worktree. Nothing merges until you do.

    IN THIS RUN 427 lines across 29 files, and six draft PRs: web’s three children arrive as one PR from their integration branch. The run summary lists one assumption for you to confirm.

    FILE.EDITED · FILE.ADDED
    4:28.0
    +427LINES ADDED
    −109LINES REMOVED
    29FILES TOUCHED
    addedremovedNEWnew file

    A file appears when its first edit is logged. The two “(retry)” rows are sdk-python’s second implementer.

    1

    REVIEW THE DRAFT PRS AND THE ASSUMPTION

    gh pr list --author @me --draft
    2

    MERGE, THEN CLEAN UP

    npx openfleet clean account-id --branches
    3

    FOUND A PROBLEM? PICK THE RUN BACK UP

    npx openfleet resume account-id

    Run it on your own repos

    Three commands set up a workspace and open the grill for your change. You answer the questions once, then come back to tested work in every repo.

    npm create @openfleet-tools@latest

    The event types and fields follow the event log schema.