Self-hosted agent-dispatch control plane
Turn labeled GitHub Issues into eval-gated pull requests
Label a task agent-ready and move it to Next on the Project board. One self-hosted runner grades the task, runs a coding agent on a fresh branch, grades the diff and opens a pull request. Anything outside a narrow allowlist is held for a human to merge.
- Status Next + agent-readydispatched
- task-definition-evalDELEGATABLE
- Coding agent on agent/task-42claude
- completeness-eval (up to 3 tries)DONE
- Pull requestheld for human merge
gh workflow run dispatch -f task_id=42 -f target_repo=owner/repo
What the control plane does
- 01
A two-part go-signal
A task dispatches only when it has the agent-ready label and its Status is Next.
- 02
Eval gates
Rubrics grade the task before any code is touched and the diff before every pull request.
- 03
Pick the coding agent per task
An agent label on the task picks Claude or Codex. No label means Claude.
- 04
Held for human merge by default
Only dependency bumps and whitespace-only diffs may merge without a human.
- 05
Revision loop
Comment on the pull request; the agent revises the same branch and force-pushes.
- 06
Clean stops that ask for a human
Every stop moves the task to Waiting+needs-you and says why in a comment.
From Issue to pull request
- Step 1
Mark the task
A task is a GitHub Issue on the Project board. Add the
agent-readylabel and, optionally, an agent label such asagent:codex. No agent label means Claude. - Step 2
Move it to Next
Moving the task’s Status to Next is the go-signal. The Lambda relay confirms the label and calls
workflow_dispatchon the control repo with the task number, URL, target repo and agent. - Step 3
Grade the task
task-definition-eval reads the task text. BOUNCE stops the run before any file is edited and moves the task to Waiting+needs-you with what is missing.
- Step 4
Run the coding agent
The runner clones the target repo onto
agent/task-<id>, loads its knowledge base and conventions files, and hands the task to the coding agent. - Step 5
Grade the diff
completeness-eval grades the diff against the task, up to 3 tries. For a public-facing repo, publish-safety-eval runs last; HOLD pushes nothing.
- Step 6
Open the pull request
The pull request carries the eval verdicts. Dependency bumps and whitespace-only diffs with a DONE verdict and green CI may auto-merge; everything else is held for human merge. A merge moves the task to Done.
Run your own control plane
One control repo, one Lambda relay, one self-hosted runner and a GitHub App, all under your own accounts. There is no hosted service and no account to sign up for.