SWITCHYARD

The control plane for fleets of coding agents

Full-throttle AI.
Fully under control.

SwitchYard is the control plane that turns a fleet of coding agents into a shipping engineering org — with your policies at every switch.

ENGINEERS USER FEEDBACK SUPPORT TICKETS LOGS + ALERTS SECURITY SCANS TRIAGE QUEUE: LITE QUEUE: STANDARD QUEUE: DEEP REVIEW INTEGRATE · BATCH SIZE 5 MAIN HUMAN GATE · HELD
Merged 0 In review 0 Batch forming 0/5 Held at human gate 0 Findings filed 0
Yard board · live --:--:--
ItemWorkLaneAgentStatus
GIT-8817Rate-limit retry in webhook workerstandardcodex · reviewed by claudeMERGED
GIT-8841Batch 12 approved PRs · integrationdrainci-router · full suiteVALIDATING
GIT-8823Flaky snapshot in billing suiteliteclaude · reviewed by codexIN REVIEW
GIT-8834Rotate signing keys · r3human— held for operatorHUMAN GATE
GIT-8831Migrate audit log to append-only storedeepclaude · reviewed by grokDISPATCHED
GIT-8840Add rate-limit headers to public APIliteclaude · reviewed by codexTRIAGED

How the line runs

Five stations. One main line.

A rail yard doesn't get faster by adding locomotives. It gets faster by never letting two trains claim the same track. Every piece of work in SwitchYard rides the same five stations.

STATION 01

Ingest

One door into the yard.

Engineers, bug reports, monitoring alerts, other agents — everything enters through the same authenticated gate, and nothing enters half-described. A request without a risk level, a scope, or a clear ask gets sent back with specific questions. What comes out the other side is an issue the rest of the yard can act on without guessing.

  • Every writer is identified. Token-authenticated submission — no anonymous mutations, no side doors.
  • The schema is the bouncer. Malformed work bounces with questions attached, not into a junk drawer.
  • Visible from second one. Accepted items land in the triage queue immediately, on the record.
ENGINEERS TICKETS SCANS ACCEPTED → TRIAGE BOUNCED · NEEDS DETAIL

AUTHENTICATED INTAKE GATE

STATION 02

Triage

The yard sorts itself.

Triage runs every few minutes — or the moment you ask — and puts the whole queue in order. It classifies, dedupes, and routes; it never implements. Every item leaves with a lane matched to its difficulty, a project matched to your roadmap, and dependencies the dispatcher can plan around.

  • Duplicates die here. Findings that share a root cause collapse before they waste an agent-hour.
  • Lanes, not vibes. lite, standard, deep, or human — routing is by measured intensity, so a typo fix never costs frontier-model money.
  • Dependencies as structure. Blocking relations form a graph the scheduler reasons over, not a note nobody reads.
QUEUE: LITE QUEUE: STANDARD QUEUE: DEEP QUEUE: HUMAN TRIAGE

INTENSITY-ROUTED LANES

The grade travels with the item and decides everything downstream — which model builds it, how hard review pushes, and what it takes to merge:

LaneWho builds itWho reviews itHow it merges
Lite r0–r1Fast, cheap modelRival vendor, one tier upAuto — next batch
Standard r2Mid-tier modelRival vendor, one tier upAuto — next batch
Deep complexFrontier modelFrontier rivalAuto — next batch
Human-gated r3–r4Any laneRival + a named humanHolds for sign-off
STATION 03

Dispatch

Parallel, never chaotic.

Waves of headless agents launch into isolated worktrees — sized to your model budget, chosen so no two touch the same files, spread across your machines. Every session is watched until it reaches a terminal state, and every pull request faces a rival vendor's model in review before it counts as done. A stuck agent gets escalated or relaunched. It does not get forgotten.

  • Conflict-aware selection. Work that would collide waits its turn instead of fighting in review.
  • Backpressure is built in. When open PRs pile up, dispatch stops. The yard never floods its own exits.
  • No agent grades its own homework. Code written by one vendor's model is reviewed by another's, and iterated until it earns approval.
REVIEW REVIEW RETRY ISOLATED WORKTREES

SUPERVISED PARALLEL SIDINGS

WEEKLY QUOTA 52% RESET 5 DAYSNEXT WAVE ≤5
$ switchyard dispatch --repo acme-api --max 5
STATION 04

Integrate

The only stage that merges.

Approved PRs don't race each other to main — they leave in scheduled batches. SwitchYard builds one combined tree from the non-overlapping approved set, runs the full suite against fresh main exactly once, and merges the clean set together. Whatever fails is re-queued with the evidence attached. Main stays green at any fleet size, and CI bills you for one validation instead of forty.

  • Disjoint batches. Non-overlapping PRs land together; colliding work is serialized automatically.
  • One tree, one verdict. The full suite runs once against the combined result — batch cost, not per-PR cost.
  • CI that reads the diff. The router selects only the suites the combined tree actually touches — full rigor where the change is, zero spend where it isn't.
  • Failure has a paper trail. Pulled PRs go back to the queue with logs and a reason, never into limbo.
FULL SUITE ×1 MAIN REVIEW: APPROVED

BATCHED CONVERGENCE TO MAIN

STATION 05

New issues

The yard feeds itself.

Shipping work creates work. Reviewers file findings, batch runs surface regressions, and merged features raise their next questions. SwitchYard catches all of it as structured issues and routes it straight back to intake — so the next wave starts where the last one left off, not from a stale backlog.

  • Findings become issues, automatically. Review verdicts and CI evidence turn into structured follow-ups — nothing lives and dies in a comment thread.
  • The flood is expected. Twenty agents will file the same root cause twenty ways; triage collapses them before they cost an agent-hour.
  • Provenance attached. Every new issue links the PR, review, or run that raised it, so the audit trail survives the loop.
INTEGRATE · MERGE FINDINGS RETURN TRIAGE

THE LOOP FEEDS ITSELF

Station 03, up close

How a wave gets planned

Dispatch isn't "launch agents and hope." Every wave goes through the same four-step planning pass before a single session starts.

Step 1 · Capacity

Read what's actually left

Bring your own keys and subscriptions — Anthropic, OpenAI, xAI. SwitchYard reads how much of each weekly limit remains and plans against it, minus the headroom you tell it to keep free.

Step 2 · Grading

Match intelligence to work

Every issue is graded for risk and for the intelligence it actually needs. Typo fixes ride the lite lane on cheap models; migrations get a frontier model on deep. No token spends above its pay grade.

Step 3 · The graph

Pick the least-conflict set

Dependencies, blocking relations, and the files each issue will touch form one graph. Dispatch selects the largest set that can't collide — and holds everything else for a later wave.

Step 4 · The wave

Fire, sized to fit

The wave launches within budget, spread across your machines, supervised to terminal state. When limits tighten mid-week, the next wave shrinks instead of stranding work.

Between stations 03 and 04

Approval is earned, not stamped

Every pull request faces a reviewer from a rival vendor — a model you choose, running a tier above the one that wrote the code. And the reviewer can say no as many times as it takes.

  • You pick both models. Doer and reviewer are configured per lane — Claude writing with GPT reviewing, or the reverse. Explicit choices always beat auto-routing.
  • Cross-vendor, always. The reviewer is never the vendor that wrote the code. Blind spots don't get to grade themselves.
  • Depth scales with the grade. A lite fix gets one brisk pass; deep work faces a frontier reviewer; r3+ adds a named human on top.
  • It iterates until it's right. Changes requested → fix → re-review. One round or four — the PR moves only when the reviewer signs READY TO MERGE.
  • Spinning gets surfaced. When rounds pile up without progress, the item escalates to a person instead of burning tokens forever.
# switchyard.yaml — you choose the pairing review: doer: claude-fable-5 # writes the code reviewer: gpt-5.6-terra # rival vendor, one tier up policy: iterate-until-approved escalate_after: 4 rounds → human

THE REVIEW PAIRING IS CONFIGURATION, NOT CHANCE

20
lifecycle states, versioned and migratable — every item is exactly one of them, always.
3
governors — budget, cadence, cleanup — enforced in code, not in a runbook.
2
human gates the loop will not cross on its own, no matter how confident the agents feel.
1
main line. Green when you leave on Friday, green when you're back on Monday.

The safety rails

The yard governs itself

Autonomy without limits is just an incident with a delay timer. Three governors run continuously, and no agent can talk them out of it.

Budget

Every wave is sized to what's actually left of your weekly limits — per vendor, per window — minus the headroom you reserve. A glidepath rations the week so Monday's enthusiasm can't strand Friday's work on a rate-limit wall.

Cadence

Dispatch is capped by the merge rate. When the approved backlog backs up, the yard stops accepting new trains until integration clears it — so you never wake up to a thousand-PR graveyard.

Cleanup

Agent worktrees are real disk and real state. A state-driven janitor reaps them the moment their work merges — the yard never hoards dead branches, dead sessions, or dead gigabytes.

Where people stay in charge

Two signals it will never run

Between stations, SwitchYard drives itself. At the two places you said people decide, it stops dead — and no agent can flip those signals from the inside.

Caution · Intake gate

Some work never meets an agent

Credentials, production controls, anything your policy marks human-only: routed to a human queue at triage and never auto-dispatched. Not "discouraged." Never picked up.

Stop · Merge gate

High-risk work waits for a name

Elevated-risk changes build, test, and pass review like everything else — then hold at approved until a named person signs off on the record. Integration will not cross this signal, ever.

Why teams switch

What changes when the yard opens

Most teams already have coding agents. What they don't have is a system that makes a fleet of them behave like an engineering org.

Agents without a yard

  • ×The PR pileup. Forty open pull requests, three touching the same file, nobody sure which one wins.
  • ×The finding flood. Fourteen issues, one root cause, fourteen agents happily assigned to all of them.
  • ×Self-graded homework. The model that wrote the bug is the model that approved it.
  • ×CI billed per PR. Every branch runs the full suite; the invoice scales with the fleet, not the work.
  • ×Silent death. A session dies mid-task and its issue sits "in progress" for three weeks.

Agents on rails

  • Disjoint by construction. Dispatch only selects work that can't collide; the rest waits its turn.
  • One cause, one issue. Triage collapses duplicates before they cost a single agent-hour.
  • Cross-vendor review, enforced. Every PR is reviewed by a rival vendor's model before it counts.
  • CI billed per batch. One combined tree, one full-suite run, one clean merge for the whole set.
  • Every session accounted for. Approved, working, stale, or stuck — classified on every poll, escalated with evidence.

Rollout

Twenty minutes from install to first wave

SwitchYard runs against the GitHub and tracker you already have. No new infrastructure, no migration project. Connect, set your gates, dispatch.

Minutes 0–5

Connect

Point SwitchYard at a repo and your tracker. The preflight doctor tells you exactly what's wired, what's missing, and what's optional — before anything moves.

Minutes 5–15

Set the signals

Provision the lifecycle, mark the human-only labels, set the merge-gate policy. Dry-run the queue and read the dispatch plan while it's still just a plan.

Minutes 15–20

Fire the first wave

Dispatch opens on the low-risk lanes and the board goes live: real issues triaged, built in isolated worktrees, cross-vendor reviewed — and held at every gate you just set.

Enterprise posture

Built for the audit, not the demo

The enforcement boundary is server-side policy — protected branches, required review, scoped credentials — not a system prompt asking agents to behave.

A.1Every decision is a link

State transitions, review verdicts, gate approvals, merges — all recorded in your tracker and Git history. "Why did this ship?" has a URL for an answer.

A.2Credentials scoped to the path

Agent write access is issued per profile, per repo, per path glob — with TTLs and revocation. Anything outside the issued scope fails closed.

A.3No single-vendor blind spots

Doer and reviewer roles route across Anthropic, OpenAI, and xAI models by policy and live capacity. Swap vendors without touching the pipeline.

A.4Your infrastructure, your rules

Runs against your GitHub, your tracker, your machines. Hosted workers, alerting, and backups are optional add-ons — each independently detachable.

A.5Dead agents don't orphan work

If a session dies mid-flight, disposition policy finishes what's recoverable and cleanly re-queues the rest. No limbo states, no forgotten branches.

A.6Enforcement you already trust

SwitchYard operates inside your branch protection and required reviews — it never asks for admin bypass, and it can't grant itself one.

A.7A gateway, not a free-for-all

Every agent mutation flows through schema-enforcing middleware. Malformed writes bounce with the reason; valid ones land with provenance attached. Agents never touch your tracker or repo raw.

A.8Agents that contribute back

The same middleware nudges every session to file what it finds — findings, evidence, follow-ups — as structured issues. The system gets richer with each wave, not messier.

The fine print

Questions

Which coding agents does it work with?
SwitchYard is vendor-neutral by architecture. Doer and reviewer roles route across Anthropic, OpenAI, and xAI models based on your policy and live capacity — and the cross-vendor rule means the reviewer is always a different vendor than the author.
Do we hand over merge rights?
No. SwitchYard works inside your existing GitHub branch protection and required reviews. It never uses admin bypass, and the two human gates — intake and merge — are held by your people, on the record.
What happens when an agent gets stuck?
Supervision classifies every session on every poll: approved, still working, stale, or stuck. Stuck sessions are escalated or re-dispatched with the evidence attached. Nothing is ever silently "assumed fine."
What does it cost to run a fleet?
What you decide it costs. The budget governor sizes every wave to measured provider capacity and a weekly glidepath — the fleet spends the budget you set, not the budget it wants. Batched integration also collapses CI cost: one full-suite run per batch instead of one per PR.
Do we need new model contracts?
No — bring your own keys and subscriptions across Anthropic, OpenAI, and xAI. SwitchYard spends capacity you already pay for, plans against what's left of each weekly limit, and never touches the headroom you reserve.
How is this safe to run against a real codebase?
Agents work inside your existing branch protection and required reviews, with write access scoped per repo and per path. Sensitive work never auto-dispatches, elevated-risk changes never auto-merge, and every action lands on the record in your tracker and Git history. First waves run on the low-risk lanes — you widen the blast radius only when the merge record has earned it.

Get on the timetable

Put your backlog
on rails.

Connect one repository and set your gates. Twenty minutes later the board is live and the first wave of agents is shipping real work — stopping exactly where you said stop.