gauntlet
Gauntlet
Runs one ticket end to end and opens a PR only when every gate is green. Preflight is shell run here, in your session, with no model in the loop; the stages run inside the gauntlet-run workflow. The runner is "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gauntlet/run.py"; its README (gauntlet/README.md beside it) is the per-repo bootstrap.
Procedure
-
Parse the arguments. The first token is the ticket reference; an optional
--from <stage>names the stage to enter at (defaultspecify). Valid stages:specify,coder,cleaner,qa,ship. Anything else: stop and list them. -
Resolve a Linear reference. If the reference matches
[A-Z]+-\d+, fetch the issue through the Linear MCP tools, write its title as an H1 and its description verbatim below it to.gauntlet/ticket-<id>.mdin the repo root, and use that path as the reference. A GitHub number or a file path needs nothing —run.pyreads those itself. -
Enter the run's worktree. The Stages are background subagents that Write/Edit the repo; on the shared checkout the platform's bg-isolation guard blocks them, forcing heredoc smuggling (ADR-0001). Isolate the run in a worktree this session owns:
git rev-parse --git-dirvsgit rev-parse --git-common-dir. Equal → you are on the main checkout: EnterWorktree (name it after the ticket, e.g.gauntlet-<ref>) to create and enter one. Unequal → you are already in a linked worktree; reuse it, never nest.- Run preflight and the workflow from inside that worktree.
-
Preflight. From the worktree root run, via Bash:
python3 "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gauntlet/run.py" preflight <ref> [--from <stage>]