Pipeline stages
How a submission moves from on-chain commit through gates, build, and a round to a verdict.
Each submission moves through a fixed set of stages. Track a submission with
GET /v1/campaigns/{campaign_id}/submissions/{patch_hash}
or
GET /v1/submissions/{patch_hash}.
Prefer the campaign-scoped path. The short path returns 409 when the same
patch_hash exists in more than one campaign. Both return 404 when the
submission is missing. The dashboard pipeline view renders these stages in order.
After bench_queued, the submission waits for a round. How a round
benches, scores, and seats a leader is on
Rounds and leaders. Scores are comparable
inside one round only.
Stages
| Stage | State | Emitted when |
|---|---|---|
| Submitted | committed | Watcher ingests the on-chain commitment |
| Picked up | picked_up | Worker claims the gates job |
| Fetched | fetched | Patch artifact pulled from object storage |
| Verified | verified | Integrity gate passed (hash, allowlist, hotkey bind) |
| Applied | applied | Patch applies onto the pinned baseline |
| Surface OK | surface_ok | Public surface compatibility holds |
| Building | building | Hermetic docker build started |
| Image pushed | image_pushed | Engine image pushed to GHCR (ref + digest) |
| Built | built | Build complete; digest-pinned ref recorded |
| Bench queued | bench_queued | Image is ready; waiting for a round |
| In a round | round_assigned | Seated in a live round |
| Infra failed | infra_failed | Image never ran because of infrastructure; one requeue |
| Scored | scored | Round finished; the image holds a score |
| Disqualified | disqualified | Image ran and failed correctness, or crashed at start |
| Rejected | rejected | The submission never ran (gate or build fail) |
- Miner submit: Hash goes on-chain (Bittensor). Patch goes to S3. Worker finds it by scanning the chain.
- Gates: Worker picks it up, checks the hash, applies the patch, and confirms it only touches allowed files. That is the provenance check.
- Building: Builds a full engine Docker image with the patch applied. Hermetic build: pinned baseline commit, fixed base image, no network during compile. If the patch changes CUDA/kernel code, that compiles inside the image too.
- Publish and queue: Image lands in GHCR, build is marked done, the submission waits at
bench_queued. Only a built image can enter a round. - Round: One pod benches the leader plus up to 5 challengers on one prompt set. See Rounds and leaders.
- Cleanup: Evidence is pulled back. The GPU pod is destroyed.
On-chain weights are live. The seated leader of a campaign earns subnet emission; everything else is burned. See Validators and emissions.
Terminal failure
rejected means the submission never ran: a gate or the build failed. The
rejection detail carries a reason. Build failures may also include a
sanitized, size-capped build log tail.
disqualified is terminal: the image ran and earned that verdict (wrong
output, or a challenger crash at startup). scored is terminal: the image
holds a speedup. infra_failed is not terminal: that entry is requeued once.
A voided round changes no submission state and no leader. See Rounds and leaders.
Build log
Fetch the last N lines of the durable build log (default 200, max 2000) with
either endpoint:
GET /v1/campaigns/{campaign_id}/submissions/{patch_hash}/build-log?tail=N— campaign-scoped; prefer this.GET /v1/submissions/{patch_hash}/build-log?tail=N— short path; returns 409 when the samepatch_hashexists in more than one campaign.
The response is ANSI/control-stripped text/plain. Both return 404 when
the submission or its log does not exist (for example mock builds, or a build
that has not written a log yet).
