One board across every project — whatever tracker each one runs. See the unified board
Not another coding agent. The workshop that runs them.

You keep every decision.
Workers do the rest.

You design the change, rule on the forks and read the diff. Cloud and local workers do the typing — under contract, in disposable worktrees, never guessing. Everything else a team needs comes with it.

Runs on your machine · Frontier tokens for the spec and the diff · Everything else cheap or local

Claude Code Codex Grok Ollama vLLM LM Studio llama.cpp
bottega — orch board

Runs

4 live · 2 waiting on a ruling · 11 scored today
RunJobAgentTaskStateFidelity
r-4f19implementcodexATL-412 webhook retriesrunning
r-4f17implementqwen3-32b · localHBR-208 tenant cacheasking
r-4f12review · lensclaudeMER-117 duplicate recordsaccepted4 / 4
r-4f08fixgrokHBR-205 audit paginationaccepted3 / 4
r-4f02summarizellama3.1-8b · localMER-114 export throttlingvoided
ask ↑

r-4f17 stopped and asked. “The spec says retry on a 5xx. Two existing callers also retry on a 429. Do I change them too, or scope the retry to the new path?” — waiting on your ruling, nothing guessed.

One change, end to end

ATL-412 · Retry failed webhook deliveries with backoff

Architect time41 minspec, one ruling, diff read
Worker runs2codex · one retry after review
Questions1answered in 90 seconds
Frontier tokensSpec & diffthe build ran below
Landed byYouafter the gate, by pull request

The worker typed. You designed it, ruled once, read the diff and scored it. Illustrated.

Fits your stack

Works with the agents and models you already run

Swap the harness and the record stays. Bottega keeps the task, the contract, the evidence and the score independent of whoever does the work.

Cloud agents Claude Code Codex Grok Local runtimes Ollama vLLM LM Studio llama.cpp Interfaces MCP Git worktrees GitHub
Get started

Install it.
Keep your harness.

Bottega runs beside the agent you already use. Bring your own models.

curl -fsSL bottega.sh | sh

Bottega/Orchestration

Delegate the execution.
Never the judgement.

A change is decisions plus typing. The architect owns what the change means, which ambiguity resolves which way, and what must stay true. A worker owns the typing — and is contractually forbidden from deciding anything it was not given.

Dispatch
$ orch do implement ATL-412 \
    --spec docs/webhook-retries.md \
    --lens failure-paths

  compiling pack …
    project rules      12
    job contract       implement
    retrieval          9 files · 2 docs
  worktree            .claude/worktrees/atl-412
  routed to           codex  (0.82 accepted, n=41)

  run r-4f19 dispatched  — detached

The mechanism

Why a worker never guesses

Three parts carry the load. Remove any one and delegation starts costing more than it saves.

Stop

A question suspends the run

A worker that reaches a judgement call it was not given stops there. The run is preserved, not restarted, so asking costs almost nothing.

Score

Asking is faithful

A worker that stopped is never marked down for stopping. Penalise the question and workers learn to guess instead — which is the failure the contract exists to prevent.

Judge

Fidelity is scored apart

Correct, tested code that solved a different problem is still a failure. That axis is judged on its own, on the four writing jobs.

Isolation

One worktree per run

A disposable checkout bounds what an agent can touch, and the run that provisions it releases it.

Review

Review is one question at a time

Each pass answers one named question. How many passes run is fixed up front, so review cannot balloon.

Recovery

Nothing runs unwatched

A heartbeat reports blocked, waiting or clear, so a stalled run is never mistaken for a working one.

Your first run
takes one command.

Bottega/Workers & models

A frontier model on top.
Whatever you like underneath.

The architect is the only seat that needs to be brilliant — and the only one billed like it. Below it the work is bounded enough that a cheap cloud agent or a model on your own GPU can do it, and a scored run tells you which ones actually can.

                       ┌────────────────────────────────┐
                       │  A R C H I T E C T               │
                       │  frontier model + harness      │
                       │  designs · rules · judges      │
                       └───────────────┬────────────────┘
      spec · contract · rulesruling            ▲ every decision
       ┌───────────────┬───────────────┴───┬───────────────┐
       ▼               ▼                   ▼               ▼
 ┌───────────┐   ┌───────────┐       ┌───────────┐   ┌───────────┐
 │  worker   │   │  worker   │       │  worker   │   │  worker   │
 │  cloud    │   │  cloud    │       │  local 8B │   │ local 32B │
 │  implement│   │  review   │       │  survey   │   │  fix      │
 └─────┬─────┘   └─────┬─────┘       └─────┬─────┘   └─────┬─────┘
       │               │                   │               │
       └───────────────┴─────────┬─────────┴───────────────┘
                                 ▼
             ┌───────────────────────────────────────────┐
             │  R E T R I E V A L                          │
             │  vector index + reranker · local          │
             │  code · docs · rules · past runs          │
             └───────────────────────────────────────────┘

The architect decides

What the change means, which ambiguity resolves which way, and what must stay true. It reads every diff before anything lands.

The worker executes

One job, one worktree, one contract. It has no authority to choose between two reasonable designs — that fork comes back up.

Retrieval serves both

A worker that can find the three files it needs does not need a huge context window — or a huge model.


The economics

Stop paying frontier prices for work a worker can finish

Design and judgement are worth a frontier model. Reading files, writing the obvious implementation, searching the repository and summarising a diff are not — and they are most of the volume.

Reading code to answer a question

A worker reads it

Surveys come back as a conclusion with citations, not as forty files billed into your context.

Semantic search over the repo

Local, per query

Embedding and reranking run on hardware you already own. No per-token cost to find a file.

Deciding who should do the job

Routing decides

Scored runs show which jobs a cheap local model finishes acceptably — and which ones it cannot.

What you still do

Design the change · rule on the forks · read the diff · score it

The four acts that are actually judgement. Everything around them is execution, and execution moves down the stack until the evidence says it should not.

Frontier tokens
Spec
& diff

The rest runs below.

orch — routing · job: implement
RunsRoutingLensesFidelity

Accepted rate

job implement · this repository · last 90 days
codex0.82 n=41
claude0.79 n=36
grok0.71 n=22
qwen3-32b · local0.64 n=19
llama3.1-8b · local0.31 n=13
Routing switches from your declared preference to measured rate at 5 scored runs. Illustrated — sample data from one workshop.

Retrieval

Find the three files. Skip the other four hundred.

An agent that greps its way through a repository burns paid context before it writes a line. Ask where a behaviour lives and get a short, ranked set of code, docs, project rules and relevant past runs — handed to the worker before it starts exploring.

  • Embedding and reranking are local model work — they cost GPU seconds, not tokens.
  • Indexes source, docs, project rules and the transcripts of past runs together.
  • The reranker reorders candidates so the top of the list is the part worth reading.
  • A worker that can find three files does not need a huge context window — or a huge model.
Query
$ orch find "where is a run marked void"

  embed        bge-m3 · local        21 ms
  search       18,402 chunks         38 ms
  rerank       bge-reranker · local  74 ms

  1  orchestrator/src/scoring/void.ts:41
     markVoid() — excludes the run from routing
  2  orchestrator/src/scoring/score.ts:118
     the --void flag path
  3  .agents/rules/70-sessions.md:9
     never score another session's runs

  3 results · 133 ms · 0 tokens spent · illustrated
Bottega/Project

Every project on one board.
Whatever runs them.

Each project keeps the tracker it already has — its own database, its own MCP server, its own conventions. Bottega speaks to each one over MCP and aggregates the result: one board, one cost view, one place where a run is already attributed to the task that caused it.

hub — all projects
BoardRunsDocsWorkflowsNotesCost

In flight

3 projects · 4 trackers · 9 open
KeyTaskProjectSourceStateRuns
ATL-412Retry failed webhook deliveries with backoff atlas hub · native in run2
HBR-205Paginate the audit log endpoint harbor mcp · app server in review3
MER-114Throttle large export jobs meridian mcp · issue tracker asking4
HBR-201Expire sessions on password change harbor mcp · app server landed5
ATL-409Backfill missing invoice totals atlas hub · native in run1
noteRate limiter counts retries as new requests atlas hub · note 3 sightings
Projects3one register
Trackers behind them4native · app server · tracker
Runs this week3831 scored
Below frontier24cheap or local workers
Every row carries its key into the branch, the commit and the run.Illustrated.
Aggregation

One board without migrating anything

A project that already has a tracker does not need a second one. Bottega reads and writes each project's own system over MCP, and keeps the register of which project owns what.

Register

Each project declares itself

Task-key prefix, landing branch, which concerns it keeps, and how to provision a worktree. The register is the authority — not a guess in a prompt.

Provider-agnostic

Whatever is behind it

A project's own database, a Laravel app's task tables, a hosted issue tracker, or Bottega's native store. The board does not care which.

Two directions

Read and write

Statuses, comments and new tasks go back to the system of record. The aggregate view never becomes a second source of truth.

Attribution

Cost per change, per project

Runs, tokens and time roll up to the task and to the project, so you can see what a feature cost and where the spend concentrated.

Docs

A store, not a folder

Plans, briefs and project rules live in one queryable store and hydrate into the tree, so a prompt cites a source instead of copying it.

Notes

Observations, not a backlog

One line, anchored to a file, run and commit. Repeat sightings are the promotion signal; nothing becomes a task by itself.


Suggestion box

Agents find things. The board should not drown in them.

A worker notices a defect next door, a missing test, a smell it was not sent to fix. Turn each into a task and the board stops showing what is actually happening; tell the agent to stay quiet and the finding is lost. A note is the third option: one line, filed in a second, that never reaches the board on its own.

  • Project, run, branch, session, commit and file anchor are derived when it is filed — the agent writes one sentence.
  • A repeat finding adds a sighting instead of a duplicate row. Repetition with cost is the promotion signal.
  • Promotion to a task is a human act. Scheduled work never promotes, so the board never grows by itself.
  • Staleness is mechanical: when a note's anchor disappears, it is marked, and untouched singletons are reaped.
Notes
// during a run, costing nothing
$ orch note "rate limiter counts retries
    as new requests"

  note 189 filed · 1 sighting
  anchored: harbor · HBR-205 · rate-limit.ts:64

// later, yours to dispose of
$ hub note list --actionable

  189  rate limiter counts retries …   3 sightings
  204  export job has no timeout       1 sighting

$ hub note promote 189
  HBR-212 opened, carrying the note and
  its sightings as evidence

MCP

The board is a surface your agents can use

Bottega talks to your projects over MCP, and exposes its own surface the same way. Any agent in any harness can read the board, file a note, open a task or record evidence — without a bespoke integration per tool.

  • Outbound: one client per project, speaking that project's own MCP server.
  • Inbound: agents read tasks, docs and rules from Bottega through its own server.
  • Scoped per project, so one project's agent never sees another's surface.
  • A worker fetches its own context instead of the architect pasting it in.
Connected projects
atlashub · native store · ATL-
harbormcp · app server · HBR-
meridianmcp · issue tracker · MER-
$ hub task list --all-projects --open

  atlas     ATL-412  in run     codex
  harbor    HBR-205  in review  claude
  meridian  MER-114  asking     qwen3-32b

  3 projects · 4 trackers · one board

Connect a project
without moving its tasks.

Register the project, point Bottega at its MCP server, and its work joins the board.

Bottega/Workflows

One lifecycle.
Every task, every project.

A workflow is a named sequence of steps, and each step declares the job that runs it, whether it may proceed on its own, and the evidence it must produce before the next step starts. Your project's own facts — trunk, tracker, gate, release rules — are composed in when the workflow is requested, so the same lifecycle behaves correctly in every repository without being rewritten for each one.

orch — compose ship-task · project: atlas
StepsFactsDocsModes

Ship a task

mode full · 10 steps · workflow v4
#StepJobAutonomyEvidence floor
1Rebase onto trunkautocommand exit
2Run independent review lensesreview-lensautorecorded artifact
3Triage every findingaskhuman ruling
4Apply accepted findingsimplementaskcommand exit · artifact
5Check acceptance criteriaautorecorded artifact
6Run the project gateautocommand exit
7Open the pull requestaskcommand exit · artifact
8Merge the pull requestaskcommand exit · artifact
9Promote the releaseaskcommand exit · artifact
10Close the taskautotracker transition
Steps marked ask stop for a ruling. Nothing downstream runs until you give one. Illustrated.
Why it is predictable

The step declares what it needs, not how you feel about it

Three declarations per step remove the guesswork that makes agent workflows drift: what runs it, whether it may proceed alone, and what it must leave behind.

Job

Who does the work

A step either names an orch job — review-lens, implement — and routes by scored evidence, or it is a plain command the step runs itself.

Autonomy

Whether it may proceed

auto runs and continues. ask stops and waits for you. Triage, applying findings, opening, merging and promoting all stop — because each is a decision.

Evidence floor

What it must leave behind

A command exit, a recorded artifact, a human ruling, or a tracker transition. A step that cannot meet its floor has not completed, whatever it reports.


Composition

The same workflow, correct in every project

A workflow is not copied into each repository and edited until it fits. It is composed on request: the steps come from the catalogue, and the project register supplies the facts — which branch is trunk, which tracker holds the task and the exact commands to drive it, which gate proves a commit, how releases merge.

  • One catalogue, versioned, shared by every project.
  • Project facts resolved at compose time, never hardcoded in a prompt.
  • Modes select how far to go — plan only, review only, ship and promote.
  • A step that needs a capability the project lacks is not silently skipped.
Composed facts
trunkmain
trackerhub · list · show · new · set · comment
gatethe project's own check command
releasesquash · required checks
docsglobal · stack · project
$ orch workflow compose ship-task --project atlas

  workflow      ship-task v4 · mode full
  catalogue     v16
  steps         10  (6 auto · 4 ask)
  needs         key · branch · worktree

The catalogue

A workflow for each shape of work

The lifecycle is covered end to end — from the plan that precedes a task to the release that closes it.

Before

Plan a task

Turn an intent into a specification a worker could build against, with the decisions already ruled on.

During

Fix a defect

Diagnose first, then change one thing. The diagnosis is evidence, not a description of evidence.

During

Review code

Independent lenses under a fixed round budget, each answering one named question.

After

Ship a task

Rebase, review, triage, gate, open, merge, promote, close — the ten steps above.

Anytime

Report an issue

File a defect with reproduction, environment and an explicit statement of what is not established.

Upkeep

Sync the docs

Bring the doc store and the tree back into agreement after the code has moved.


MCP surface
// any agent, any harness
list_workflows()
compose_workflow({ slug, project, mode })
get_workflow_step({ slug, project, n })

// the project's own knowledge
list_docs({ scope })     global · stack · project
get_doc({ subject })
project_brief()

  the agent fetches its own context
  instead of being handed a copy
Skills over MCP

The workflow is a surface, not a prompt you paste

Every workflow and every document is reachable over MCP, so an agent asks for the step it is on and gets that step's instructions, its job, its autonomy and its evidence floor — already composed for the project it is working in.

  • No pasted checklists that drift from the real process.
  • Change the workflow once; every project and agent follows the new version.
  • Docs are cited by source, so a prompt names where to look rather than carrying a stale copy.
  • Swap the harness and the lifecycle is unchanged.

Same lifecycle.
Every repository.

Register a project and its workflows compose themselves from its own facts.

Bottega/Doc store

One source of truth
for the team and the models.

Your technical documentation lives in a store that people read and agents query — the same text, the same version, at the same moment. Nobody maintains a second copy for the machines, and no worker builds against a document that stopped being true last month.

The problem it removes

Documentation written twice is documentation wrong once

The usual arrangement is a wiki for the team and a pile of pasted context for the agents. The two drift immediately, and the drift is invisible until a worker confidently builds the wrong thing from a copy nobody remembered to update.

  • Written once. Read by people in the dashboard and by agents over MCP.
  • Revisions are kept, so you can see what a worker was actually given.
  • Cited by source in a prompt, never pasted into one.
  • Agents write back too — a docs workflow reconciles the store with the code.
Same store, two readers
// a person
  hub serve  →  browse, search, edit

// an agent, mid-run
list_docs({ scope: "project" })
get_doc({ subject: "payments" })
project_brief()

// the architect, writing a ruling down
$ orch doc set --scope project \
    --subject payments --file ruling.md

  revision recorded · readable by both

Scopes

A worker is given what applies, and nothing else

Scope is what keeps a prompt small without keeping it ignorant. The pack compiled for a run carries the documents that bear on it.

global

True everywhere

Standards that hold across every project — how work is reviewed, landed and recorded.

stack

True of this runtime

What applies because of the language, framework or toolchain in play.

project

True here

This repository's architecture, conventions and domain knowledge.

Into the tree

Rules written from the store

Rules that agents read as files are written into the worktree from the store, so a hand-edited copy is replaced rather than quietly obeyed.

Revisions

What was true then

A run records the document revisions it was given, so a bad result can be traced to the text that caused it.

Search

Indexed with the code

Docs sit in the same retrieval index as source and past runs, so “where is this decided?” is one question.

Write it once.
Everyone reads the same thing.

Bottega/Context management

A handoff you read,
not a compaction you hope about.

Long work outlives a session. When the window fills, the usual answer is automatic compaction — something summarises your context, you are not shown what it dropped, and you find out later by discovering what the next turn forgot. Bottega makes the handoff an artifact instead: written deliberately, reviewed by you, and chosen when it is picked up.

These are documents too — the same store as your technical docs, attached in different places: on the task, on the epic, and in a resume scope a new session can pick up.

Task docs

The plan lives on the task

A task carries its own documents — the specification it was built against, the research that settled a decision, the acceptance criteria. Attached to the key, so they travel with the work rather than sitting in one session's scrollback.

Epic handoffs

Work larger than one task

An epic's state — what is done, what is next, which rulings already stand — is a document with a handoff role, so the next session starts from the decisions rather than re-deriving them.

Resume briefs

Written at a boundary, on purpose

At a task or epic boundary — and before any clear or compaction — a brief is offered. It records where the work stands, what was ruled and what remains open, in your words, not a summariser's.

You choose

Nothing resumes itself

Open briefs are listed when a session starts, and a session never consumes one you did not pick. A handoff you did not choose is just another invisible context change.

The difference is control. Compaction is a lossy transform applied to your context without review. A brief is a document: you read it, you edit it, you decide when it is used — and it stays readable long after the session that wrote it is gone.

Resume brief
$ orch doc list --scope resume

  atlas · ATL-412  webhook retries
  open brief · written at the review boundary

──────────────────────────────────────────
  Where it stands
  Implemented and gated. Two lenses clean,
  one finding open on retry budgets.

  Rulings that stand
  · Retry only the new path; the two existing
    callers are a separate change (noted).
  · Backoff is capped, not unbounded.

  Open, needs a decision
  · Whether a 429 counts against the budget.

  Do not
  · Land while the budget question is open.
──────────────────────────────────────────

  resume it, or leave it and start fresh

Decisions survive
the session that made them.

Documentation

How can we help?

Install Bottega, dispatch your first run, and connect the projects you already have.

Docs / Install

Install

One install command. You bring Bun, Git and an authenticated gh.

curl -fsSL bottega.sh | sh

That fetches the current release, verifies it against the digest published with it, unpacks it into your install root and links orch and hub onto your PATH.

Requirements

  • Bun. Both commands run on it.
  • GitHub CLI, authenticated — gh auth login. The repository is private, so the installer downloads the release as you.
  • Git, for the projects you point Bottega at. Every writing run is isolated in a disposable worktree of the target project.
  • Optional: a local model host — Ollama, vLLM, LM Studio or llama.cpp — for cheap workers and the retrieval index.

If a prerequisite is missing the installer stops and names it, along with the command that clears it. It never installs a runtime on your machine on its own.

What it does

  1. Resolves the release to install — the latest, or a version you name: curl -fsSL bottega.sh | sh -s -- 0.1.0
  2. Downloads the payload and checks its SHA-256 against the digest published with the release. A mismatch or a truncated download refuses loudly rather than unpacking.
  3. Unpacks into ~/.local/share/bottega/<version> and points current at it.
  4. Links orch and hub into ~/.local/bin.

Set BOTTEGA_HOME to install somewhere else. Re-running at the same version is safe: it reports the existing installation and leaves it alone.

Check it

orch --version
# Bottega 0.1.0 (e8489ee)

A release prints its version and the commit it was built from. A development checkout says so instead, so a bug report can never be ambiguous about which you are running.

Create the stores

orch init-db
hub migrate

Databases never live in the installation. They resolve to your per-user state directory — $BOTTEGA_STATE_HOME, then $XDG_STATE_HOME, then ~/.local/state/bottega — with orch.db and hub.db under their own concern directories. Upgrading never touches them.

Register a project

Bottega does not hold your code. It keeps a register of the projects it may work on — each an existing Git checkout with its own task-key prefix, landing branch and worktree recipe.

orch project add ~/Projects/atlas
orch project list --json

The register is the authority on which prefix belongs to which project, which branch a pull request targets, and how a disposable worktree is provisioned.

Upgrading and rolling back

Run the installer again for a newer version. Each version keeps its own directory and current is switched to the new one, so a rollback is moving that symlink back:

ln -sfn 0.1.0 ~/.local/share/bottega/current

Old versions are kept until you ask for them to go. --prune removes every version except the one in use; nothing is ever removed silently.

Running from source instead

For working on Bottega itself, a checkout still works and is the supported development path:

git clone <your-remote>/bottega.git
cd bottega
bun install
git config core.hooksPath .githooks
./bin/orch init-db

The tracked hooks refuse AI attribution in commit messages. A checkout and an installed release are equally authorised to create the stores, and --version tells them apart.

Docs / Your first run

Your first run

Dispatch a job, answer the question it stops on, and score what comes back.

1. Open a task

Work without a key cannot be attributed later, so every run needs one. File the task first:

hub task create "Retry failed webhook deliveries with backoff" --project atlas

The key comes back in the project's own prefix — ATL-412 here. It will follow the change into the branch, the commit subject and every run.

2. Write the spec

This is the part that does not delegate. A worker builds faithfully against a written spec; it cannot build against an intention. State what the change means, which way each known ambiguity resolves, and what must stay true afterwards.

If the requirement is still forming — you are reacting to what you see, and the next requirement comes out of that reaction — keep it yourself. Delegation is for work that has stopped moving.

3. Dispatch

orch do implement ATL-412 --spec docs/webhook-retries.md

orch do is detached by default: it prints a run id and returns. The pack compiled into the worker's prompt carries your project rules, the job contract and the retrieval context, so you are not pasting any of it in.

run r-4f19 dispatched — detached

4. Watch without blocking

A session that waits silently is indistinguishable from a dead one. Arm the heartbeat instead:

orchestrator/hooks/orch-heartbeat.sh <session-id>

It reports one of three states: blocked — a worker asked something; waiting — runs are live and nothing is needed; clear — nothing outstanding.

5. Answer the question

A worker that reaches a judgement call it was not given stops there. That is the contract working, not a failure.

orch inbox
orch answer r-4f19 "Scope to the new path. File a note for the two call sites."

The run resumes from where it stopped with your ruling in hand. Never continue a chain whose question is unanswered — resuming forces the guess the contract exists to prevent.

6. Read the diff, then score it

orch result r-4f19
orch score r-4f19 full right --note "…"

Score correctness and fidelity separately: a complete, tested change that solved a different problem is a fidelity failure however good the code is. Never score a run you did not read, and never score another session's runs — only the session that read the output can judge it.

A run that died of your own harness error gets --void, which keeps the run and its output but excludes it from routing evidence. Scoring an agent down for your mistake teaches the router something false.

7. Land it

Workers never push. Run the gate on the rebased branch you are about to merge, open the pull request, and merge there.

Docs / The worker contract

The worker contract

What a worker may do, where it must stop, and why stopping is the point.

The division

A change consists of decisions and execution. The architect decides what the change means, which ambiguity resolves which way, and what must remain true. A worker contributes execution and must not decide. Judge a delegation by whether a decision leaked to the worker — not by comparing models in the abstract.

Three load-bearing parts

  1. A worker that reaches a judgement call stops and asks. It never guesses and then builds on the guess.
  2. Asking is cheap and preserves the turn, so a worker can surface every real fork instead of silently resolving it.
  3. Fidelity is scored independently, because a complete and technically sound result may still solve a different problem.
Asking is faithful and carries no penalty. Penalising questions teaches workers to guess and breaks the delegation contract — which is why a worker that stopped is never marked down for stopping.

The invariants

These are product behaviour, not configuration. A workflow that needs different invariants is a different product.

  • One disposable worktree per run.
  • Workers never push.
  • Escalate every decision.
  • Complete review before landing.
  • Compile the project's rules into every prompt.
  • Record a verdict before the next run routes.

What a worker is given

The pack compiled for a run carries the job contract, the project's rules, and the retrieval context for the change. Research is handed down as a ruling, never as an open question — a networkless worker cannot answer "what is current best practice?", so the architect answers it first and states the conclusion.

Escalation in practice

orch inbox                      # what is waiting on you
orch answer <run> "…"           # record the ruling, resume the run
orch continue <run>             # only after the question is answered
Docs / Scoring & routing

Scoring & routing

How reading a diff becomes the evidence that picks the next worker.

Route from local evidence

Work routes from accepted and rejected runs on your repositories, keyed to the job shape, stack and review lens — not from a generic benchmark, a marketing claim or a global model average. Strength on one kind of work must not hide weakness on another.

Until a job has enough scored runs, it follows your declared preference. Past that threshold it routes by measured accepted rate.

The axes

  • Delivery — did it finish the job it was given.
  • Quality — is the work sound.
  • Fidelity — did it build what the spec asked for. Scored only on the writing jobs, and the axis that catches an agent shipping correct, tested code that solves a different problem.

Scoring a run

orch pending                       # your unscored runs
orch result <run>                  # read it first
orch score <run> full right --note "…"

For a findings-producing review, score each finding's disposition rather than the run as a whole:

orch judge <run> full right \
  --finding 1=accepted:high \
  --finding 2=rejected:medium \
  --note "…"

Rules that keep the evidence honest

  • Never score a run you did not read. A guessed verdict teaches the router something false, which is worse than no verdict at all.
  • Never score another session's runs. Only the session that read the output can judge it.
  • Void your own harness errors. --void keeps the run and excludes it from routing.
  • A worker that stopped and asked is faithful. Mark it down and asking stops happening.

Review breadth

A change's tier comes from the higher of its risk and its cognitive size, and the tier fixes both the number of review lenses and a hard ceiling on rounds. At the ceiling, stop and ask — never dispatch another round, whatever the new findings' severity. A clean round ends the ladder.

A review finding is a suggestion to test, never an instruction to implement. Verify each one — read the line, run the probe, watch the test fail — before it enters a fix. Reviewers argue plausibly and are sometimes wrong.
Docs / Retrieval

Retrieval

A local index and reranker, so a worker starts with the right three files.

Why it exists

An agent that greps its way through a repository spends paid context before it writes a line, and a small model runs out of room before it reaches the answer. Retrieval moves that search onto hardware you already own: embedding and reranking cost GPU seconds, not tokens.

What is indexed

  • Source, chunked for retrieval.
  • Docs and plans from the doc store.
  • The project's rules.
  • Transcripts of past runs — so "has this been tried?" is answerable.

Two stages

A vector search proposes candidates; a reranker reorders them so the top of the list is the part worth reading. Both stages run against your local model host. The result is packed into the worker's prompt — the architect never fetches it to paste it in, which would spend the exact context the delegation was avoiding.

orch find "where is a run marked void"
Never fetch something in order to inline it. Name the source and let the worker retrieve it; the cost you avoid is paid on every later turn otherwise.
Docs / Projects over MCP

Projects over MCP

Put every project on one board without migrating a single task.

The register comes first

A project is registered with its main checkout path, its task-key prefix, its landing branch, which concerns it keeps and how to provision a worktree. The register — not a prompt, not a convention — is the authority.

orch project add ~/Projects/harbor
orch project list --json

Pull requests target the declared landing branch, never an optional production branch. The update verbs verify declared branches and refuse a mismatch.

Keep the tracker the project already has

A project may keep its own task tracker, doc store, workflows or review pipeline. Do not copy a Bottega mechanism into a project that can call Bottega, and do not migrate a project's tasks to put them on the board. Bottega connects to the project's own MCP server and aggregates the result.

  • Native — the project uses Bottega's own store through hub.
  • Its own application — an app that exposes its tasks, rules and workflows over MCP.
  • A hosted tracker — reached through its own MCP server.

Statuses, comments and new tasks are written back to the system of record, so the aggregate board never becomes a second source of truth.

Scoping

Each project registers its own servers and sees no other project's. Scoping is mechanism, not discipline: a project's agent cannot reach another project's surface because it was never given it.

The surface your agents use

Bottega exposes its own MCP surface, so an agent in any harness can read the board, open a task, file a note or record evidence without a bespoke integration per tool. A worker reaches this machine's MCP servers when the run is dispatched with MCP enabled — which is how it fetches its own context instead of being handed a copy.

A failing MCP call can read as an empty answer. A stale server enforces the schema it booted with, so reads fail too — and "no rows" is indistinguishable from "the server is broken". Reconnect rather than trusting the emptiness.

Filing what you find

orch note "heartbeat reads clear while a worker sits blocked"
hub note same <id>        # a repeat sighting, not a duplicate row
hub note promote <id>     # a human act — never scheduled

Project, run, branch, session, commit and any file anchor are derived when the note is filed. Repetition with cost is the promotion signal; the board never grows by itself.

Docs / Workflows

Workflows

Declared steps that cover a task's whole life, composed from your project's own facts.

Compose, do not copy

Ask for a workflow and you get it resolved for the project you named — the steps from the shared catalogue, the facts from the project register.

orch workflow list
orch workflow compose ship-task --project atlas

Do not paste a workflow into a prompt or a repository file. A pasted copy stops matching the catalogue the moment either changes, and the drift is silent.

What a step declares

  • Job — the orch job that runs it, if any. A step with a job routes by scored evidence like any other run.
  • Autonomyauto proceeds; ask stops for a ruling and nothing downstream runs until you give one.
  • Evidence floor — what the step must produce: a command exit, a recorded artifact, a human ruling, or a tracker transition.
  • Needs — the project capabilities it depends on, such as a trunk, a tracker, a gate or release rules.
A step has not completed because an agent says so. It has completed when its evidence floor is met. This is the difference between a checklist and a workflow.

Modes

A workflow can stop at different depths. A mode selects how far this run goes — planning only, review only, or ship and promote — without becoming a second workflow that can drift from the first.

Where the knowledge comes from

Documents are served in scopes, and a composed workflow names the ones that apply rather than embedding their text:

  • global — rules that hold everywhere.
  • stack — what is true of this language or runtime.
  • project — this repository's own knowledge, read and written through its MCP surface.

An agent fetches what it needs. The architect naming a source costs one line; pasting that source costs the whole document, on every later turn.

Carrying a task across sessions

Work outlives a context window. Two things carry it, and both are artifacts you can read:

  • Task documents hold the specification, the research that settled a decision, and the acceptance criteria — attached to the task key, not to a session.
  • Resume briefs are written at a task or epic boundary, and before any clear or compaction: where the work stands, which rulings hold, what is still open, and what must not happen yet.
orch doc list --scope resume
orch doc get <subject>
Open briefs are listed when a session starts, and a session never consumes a brief you did not choose. An automatic compaction changes your context without showing you what it dropped; a brief is a document you reviewed before it was used.

The catalogue

  • Plan a task — turn an intent into a specification with the decisions already ruled.
  • Fix a defect — diagnose on evidence, then change one thing.
  • Review code — independent lenses under a fixed round budget.
  • Ship a task — rebase, review, triage, gate, open, merge, promote, close.
  • Report an issue — reproduction, environment, and what is not established.
  • Sync the docs — bring the store and the tree back into agreement.
Docs / The doc store

The doc store

Technical documentation your team and your models read from one place.

Scopes

Every document has a scope, and the scope decides who is given it:

  • global — standards that hold across every project on the machine.
  • stack — what applies because of the language or runtime.
  • project — this repository's architecture, conventions and domain knowledge.
  • job — what a particular kind of work needs to know.
  • resume — handoffs between sessions. See context management.

Reading and writing

orch doc list --scope project
orch doc get <subject>
orch doc set --scope project --subject <name> --file <path>

Over MCP the same surface is list_docs, get_doc and set_doc, plus project_brief for the short orientation a worker needs before anything else. An unfiltered listing returns every body, so filter by scope.

Never fetch a document in order to paste it into a prompt. Pulling it into the architect's context costs the whole document — and costs it again on every later turn. Name the source and let the worker fetch it; that is the entire point of the store.

Hydration

Some documents are rules that agents read as files in the tree. Those are written into the working copy from the store, never edited in place:

orch canon hydrate

Edit the row in the store, hydrate, then commit what hydrate wrote. A file edited by hand is overwritten at the next hydrate and never becomes the rule.

Revisions

A run records the document revisions it was given. When a result is wrong, you can tell whether the worker misread a good document or faithfully followed a bad one — which are different defects with different fixes.

Keeping it true

The store drifts from the code like any documentation. The sync the docs workflow reconciles them deliberately rather than on a schedule, because a scheduled rewrite of documentation nobody read is how a store fills with confident nonsense.

Docs / Context management

Context management

Carrying work across sessions without losing the decisions that shaped it.

Context management uses the same doc store, in different places. What changes is where a document is attached and who picks it up.

Task documents

A task carries its own documents: the specification a worker built against, the research that settled a decision, the acceptance criteria. They are attached to the key, so they survive every session that touches the task.

hub task doc new <KEY> --title "Specification"
hub task doc list <KEY>

Epic handoffs

Work larger than one task needs its state written down: what is done, what is next, which rulings already stand. That is a task document with a handoff role, so the next session starts from the decisions instead of re-deriving them — or worse, silently re-deciding them.

hub task doc new <KEY> --role handoff

Resume briefs

A brief is offered at a task or epic boundary, and before any clear or compaction. It records:

  • where the work stands;
  • which rulings hold, so they are not reopened;
  • what is still open and needs a decision;
  • what must not happen yet.
orch doc list --scope resume
orch doc get <subject>

Open briefs are listed when a session starts. A session never consumes a brief you did not choose — otherwise it is just another invisible context change with better manners.

Why not rely on compaction

Automatic compaction is a lossy transform applied to your context, usually without showing you what it discarded. It is fine for chat and wrong for work, because the parts most easily dropped — a ruling you gave once, a constraint stated early, the reason an approach was rejected — are exactly the parts whose loss is expensive and silent.

A brief costs a minute to write and is readable, editable and versioned. It is also evidence: months later it still says why the work went the way it did, which no summary living inside a finished session can.

When to write one

  • At a task or epic boundary.
  • Before clearing or compacting a long session.
  • Whenever you are about to hand work to someone — or something — that was not present for the decisions.
Docs / CLI reference

CLI reference

The verbs you need, and where the authoritative flags live.

The CLI is authoritative about itself. orch --help, orch <verb> --help and hub --help own the flags and usage. This page names the verb a task needs; it does not copy the flag tables, because a copy rots.

Dispatching work

  • orch jobs — the job types and the axes each is scored on.
  • orch guide — what to use for what, and what is still a guess.
  • orch do <job> — dispatch. Detached by default; it prints a run id and returns.
  • orch contract <job> — the preamble prepended to that job's prompt.
  • orch wait / orch result — collect a detached run.

Escalation

  • orch inbox — questions waiting on a ruling.
  • orch answer <run> — record the ruling and resume.

Judging

  • orch pending — runs you dispatched and have not scored.
  • orch score <run> — the verdict, with --void for your own harness errors.
  • orch judge <run> — per-finding dispositions for a review.

Projects and state

  • orch project list --json — the register: prefixes, landing branches, recipes.
  • orch doctor — what is wrong with this installation.
  • orch monitor — what is wrong on this machine, with --history.
  • orch close-out — release terminal worktrees.

Work tracking

  • hub task — create, move and close tasks.
  • hub note — keep, promote, drop and merge observations.
  • hub serve — the dashboard.
A run whose process died without a terminal status reads as live to the monitor and the heartbeat alike, so neither will ever report clear. If a run has been running implausibly long, check the process before believing the row.