Anyone can move the bars by spending tokens rather than time. The loop is deterministic, so it needs no coordinator:
go run ./tools/gauntlet next # the next unit: an estate and the first active stage it does not pass
just contribute [max-usd] # one worker run on that unit, in a fresh worktree, with your own keyjust contribute runs Claude Code headless under the brief in
.claude/agents/gauntlet-worker.md, which does exactly one unit: run the estate, classify every
difference from stock with the five-row table in HANDOFF.md, fix it generically,
re-run, render, and open a pull request whose title carries the unit ID. It
never merges. The same thing runs on GitHub Actions from your fork:
.github/workflows/contribute.yml is workflow_dispatch, reads your fork’s
ANTHROPIC_API_KEY secret, and opens the pull request against this repository when
a CONTRIBUTE_TOKEN with pull-request scope is present, or prints the compare URL
when it is not. There is no hosted path; every worker runs under the key of
whoever started it.
Two contributors picking the same unit is expected. The worker checks for an
open pull request carrying the unit ID before starting and takes the next unit
if one exists. A pull request that changes only the artifact and the rendered
docs (a re-run that moved verdicts) is merged automatically once CI passes
(.github/workflows/automerge-artifact.yml); anything that changes code waits for a
maintainer.
Providers are lanes. A GCP or Azure estate enters the same manifest with its
own lane, runs the same stages against its own emulator, and next picks it up
like any other; an emulator gap is a unit in the emulator’s repository.