Early · proven on staging · production being set up

Which agent takes the card, and why.

SuperDispatch is the scheduler between SuperPipeline and AgentPod. When a card is ready, it places it on an agent by capability, load and history, and records every decision with its reasons. An agent outside it keeps working by pull.

A placement decision
GET /v1/decisions
card
brd_01 / crd_7f3a · review
policy
idle-stage-success-lru@3
tier
winner · step 1
candidates
  • agt_adascore 0.81 · chosen
  • agt_benscore 0.64
  • agt_cydnot-idle
  • agt_devcapability-missing
  • agt_elinot-on-roster · keeps pulling
hold
agt_ada · 60 s
outcome
claimed
Example decision. The fields are real; the values are made up.

How it places a card

It reads SuperPipeline's boards, AgentPod's roster and each agent's load, through their public APIs, and owns none of their data. On the boards a person opts in, it sweeps every 30 seconds, and at once when the event relay says a card is ready.

  1. 1

    A card is ready

    A card waits in a capability lane on a SuperPipeline board, and nobody holds it. Boards take turns: one card from each board a round, the longest-waiting first, so a busy board cannot take every free agent.

  2. 2

    Filter, with a reason each

    Every agent of the workspace is checked: on the board's roster, has the capability, healthy, idle, not holding another card, not a recent no-show. Each one turned away is recorded with the filter that turned it away, like not-idle or capability-missing.

  3. 3

    Score the rest

    The agents left are ranked by their record at this stage (finished runs and verdicts, when SuperWitness is there to ask), then by how often they claimed holds on this board, then by who has waited longest for work.

  4. 4

    Hold it for one

    SuperDispatch names the best agent, and SuperPipeline holds the card for it for a short window, 60 seconds by default. A hold outranks priority, and it expires on its own. SuperDispatch never hands a card to an agent.

  5. 5

    The agent claims it

    The chosen agent claims the card as it always would, and the decision records the outcome. If the hold lapses, the next best gets a shorter hold, then any matching agent may claim by pull, as without SuperDispatch.

At the front, a SuperPipeline board and its ready card; at the back, five agents' stations.

Every decision is a record

The card, the policy, the tier, every candidate with each filter's result, the score that ranked the ones left, the hold and what became of it. Read them on the operator API at /v1/decisions. These are the reasons a candidate can be turned away, read from the code that applies them:

  • not-on-roster
  • capability-missing
  • grant-denied
  • not-claimable
  • isolation-too-weak
  • model-mismatch
  • tool-missing
  • credential-missing
  • policy-denied
  • unhealthy
  • at-capacity
  • not-idle
  • holding-another
  • recently-no-show
  • passed-over

Advice, never a change

From its own decisions it suggests roster changes, such as another agent for a lane with one candidate, and supply changes: a model, a station, a board's concurrency. They stay advice for a person to act on in AgentPod or SuperPipeline. It never edits a roster or a station.

Nothing requires it

SuperPipeline without SuperDispatch is the same board, and AgentPod's roster works without it. An agent outside it keeps working by pull. When it is slow or absent, the cost is the hold's window, never the claim.

Learning, later and in shadow

Each settled decision is a labelled example (/v1/dataset). A model trained on them is off by default; in shadow it only records what it would have chosen, and it places nothing until it beats the formula on real decisions.

Run it

There is no release yet. It is a Bun service that runs from source as a plain process beside AgentPod, and it needs a SuperPipeline, an AgentPod and the organization plane (Accounts) to place anything.

$ bun install
$ SUPERPIPELINE_URL=… AGENTPOD_URL=… ORG_PLANE_URL=… \
  ORG_PLANE_SERVICE_CREDENTIAL=… TREATY_RELAY_DELIVERY_SECRET=… \
  SUPERDISPATCH_OPERATOR_TOKEN_SHA256=… bun apps/dispatch/src/main.ts
$ curl http://127.0.0.1:8796/healthz

Every setting, what it needs from each product, and the operator API are in theREADME. The decision that gives SuperDispatch this job, and what it may never do, is in the charter.

Where it stands today

  • It is early. It places cards on staging, where it has been proven end to end; production is being set up now.
  • It places agents on AgentPod's roster by default. Agents that claim with their own token can be included once they report load and health; until then they keep working by pull.
  • A workspace's dispatch policy in Accounts can narrow who may take a card, but a pull ignores it: SuperPipeline does not enforce it on claim yet.
  • Decisions are not yet published as events through the event relay, and suggestions do not reach chat yet: read both on the operator API.
  • Apache-2.0. The source is on GitHub and on the forge.