autorun
Run the cards that do not need you. One `/super-bootstrap:autorun` turn = read every open card → admit the ones whose next step needs no user (shared/user-wall.md) → one isolated git worktree + one he
SKILL.mdplugins/super-bootstrap/skills/autorun/SKILL.md
GitHubautorun — run what does not need you
Pick → run → sheet. The gateway orchestrates; each admitted card is one worktree session that runs to done or to its first wall. State lives in files — the next invocation re-reads and picks again.
Consumer contract: the super-bootstrap runway — docs/work/{BUG,DEBT,GAP}-*.md cards, /super-bootstrap:commit, /super-bootstrap:merge. First run self-installs the worktree infra (assets/ensure-infra.md).
Pre-flight
- Infra —
assets/ensure-infra.md; absent → one-time install confirm, decline ends the turn. - Base —
git fetch+ fast-forward the base branch; a conflict surfaces and ends the turn. - In flight —
Glob .claude/worktrees/autorun-*/OWNED_BY. Each hit is a claimed card: it is skipped by the pick below and listed understatus. A worktree whose card file is gone → surface forrelease.
Pick
Read every open card thread (docs/work/{BUG,DEBT,GAP}-*.md — the cold-reader read set, docs/work/README.md § Thread contract). Admit a card when its next step needs no user — the test is ${CLAUDE_PLUGIN_ROOT}/shared/user-wall.md, read at pick time — and none of these hold:
- claimed (an
autorun-{id}worktree exists) or already on an unmerged branch (git branch --no-merged {base}); - the deliverable is a harness file (
CLAUDE.md,.claude/**, plugin-source skills / agents / rules) — a worktree cannot audit the harness it runs under; route to/super-bootstrap:needs-me; - held by an open
docs/outward/OUT-*.mdwhoseOwning card:names it.
A prose argument narrows the set (/super-bootstrap:autorun 不碰 business, only DEBT). Cards whose Area: / thread name overlapping files share one worktree and run in dependency order; the rest run in parallel.
Print the pick, then proceed — the user interjects in prose if the pick is wrong:
autorun — {N} cards
run: {ID} {one-line aim} (grouped rows share a worktree, "→" between them)
skip: {ID} {reason — needs you: decision | taste | eyes | waiting on X | claimed | harness | held}
Zero admitted → print the skip list and end the turn.
Run
Per admitted card or group — assets/parallel-worktrees.md § Warm (claim = mkdir .claude/worktrees/autorun-{id}, branch autorun/{id-lower}, template copied, OWNED_BY written), then one background dispatch (§ Dispatch step, -- before the brief, no model pin — the session inherits the default). Append the tools the card's next step needs to that worker's --allowedTools — WebSearch,WebFetch for web research; stack runners come from the repo's own settings, not the dispatch line (§ Worker grants beyond the base set).
Brief — rendered fresh from files at spawn, five parts:
assets/worktree-boundary.md, verbatim.- The card path(s) — "read the cold-reader read set
docs/work/README.md§ Thread contract names — the origin, the latest block of each type, and the Amendments after them." - Work order — run the card whole under this repo's
CLAUDE.mdenvelope: ground it if no Verdict block grounds it yet (/super-bootstrap:triage {ID}), build, verify, then commit on this branch via/super-bootstrap:commit(deferred mode — doc-sync belongs to the merge). A group runs its cards in the listed order, one commit each. Resolve the card as the envelope says (delete the card file in the resolving commit). - Stop conditions —
${CLAUDE_PLUGIN_ROOT}/shared/user-wall.mdverbatim: the moment finishing needs one of those, land what is done (block appended, commit made), write the status, stop. Missing context the tree does not hold →BLOCKED, never a guess. - Status contract — one line at
.autorun-statusin the worktree root, written atomically (temp file + rename), uncommitted:DONE·WALL — {one line: what is needed, from whom}·BLOCKED — {what is missing}.
The turn ends after the last dispatch. Completions arrive as background notifications; a notification with no status file reads as BLOCKED — no status written.
Sheet
When every spawned session has returned, read each status via cat .claude/worktrees/autorun-{id}/.autorun-status (never Read inside a worktree — assets/parallel-worktrees.md § Read discipline) and render one sheet:
autorun — sheet
DONE {ID} {aim} → inspect, then /super-bootstrap:merge autorun/{id-lower}
WALL {ID} {the one line}
BLOCKED {ID} {the one line}
Then one AskUserQuestion per WALL / BLOCKED row — three options, always:
| Pick | Gateway action |
|---|---|
| Resolve now | The user's answer appends to the card (## Amendment / ## Design per docs/work/README.md); re-render the brief and re-spawn in the same worktree. |
| Park (default when the user has no time) | Append ## Progress — {date} · autorun to the card: the wall line + branch: autorun/{id-lower} + what landed. Tear the worktree down (§ Cleanup), keep the branch. A later session picks the card up cold from its thread. |
| Drop | The card is not worth finishing: delete the card file, tear the worktree down, delete the branch — one commit naming why. |
DONE rows wait for the user; the merge runs only through /super-bootstrap:merge.
Sub-verbs
status— listautorun-*worktrees with card, branch, age, and the status line. Read-only.release {id}— tear down a crashed or abandoned worktree (assets/parallel-worktrees.md§ Cleanup); the card and branch stay.
Rules
- Gateway holds destructive git. Merge, push, worktree removal, branch deletion — gateway only, each behind a user prompt. Sessions hand off through the status line.
- State = file presence. Worktree dir +
OWNED_BY+ card thread + branch. Every invocation re-reads; nothing is remembered across turns. - Read-around, never Read-in.
git show autorun/{id-lower}:<path>,catthe status file,Grep/Globmarkers — mechanically backed by thePreToolUse(Read)hook ensure-infra installs. - Verification that depends on module resolution runs at the merge, on the base tree — a nested worktree can resolve phantom deps from the parent (
assets/parallel-worktrees.md§ Nested-worktree false-greens).