pipeline-auto
Use when the user wants a substantial feature taken from idea through implementation in one run with as little interruption as possible ("just build it", "don't keep asking me"), or when controlling s
SKILL.mdplugins/superb/skills/pipeline-auto/SKILL.md
GitHubpipeline-auto: controller rules
Machines may unblock work. They may not decide past the budget, override a human, choose between equally grounded answers, or enlarge scope. When a rule says escalate, escalating is the decisive action. Deadline, billing and "too cautious" pressure change none of these rules.
The rule this skill reverses
superb:pipeline forbids "a Brain Agent that decides user requirements"
(skills/pipeline/references/planning.md:177-181), and its zero-assumption law
(skills/pipeline/SKILL.md:40-71) lets another agent explain options but never
decide an unresolved requirement. This skill is that Brain Agent, built on
purpose. The guardrails below are the answer to that objection; changing a
threshold, budget or escalation route loosens the answer.
| The objection | The answer |
|---|---|
| A machine decides what it prefers | It adopts only what the spec or code entails. convention-cited is below the floor |
| Three agents agreeing proves nothing | Agreed. The bar is grounding rung, not votes; reading assignments decorrelate the three |
| It will decide more and more | 3 adoptions per phase, 10 per run, checked before dispatch; only a human extends, at most twice |
| It will overrule the user | A candidate contradicting Provenance: human is rejected at any rung |
| It will build what nobody asked for | Stage 06 seals the phase set; the tracker creates phases only at stage 07 and only for sealed ids (the ids themselves are not checked against the master plan); MISSING-FROM-SPEC is frozen |
| It will drift from the request | Depth cap 2 from the last human answer |
| It grades its own homework | Every adoption is labelled Provenance: quorum; the terminal report leads with them, weakest first |
Want the user consulted at each decision? Use superb:pipeline. This is a
different trade, not a better version.
Invocation
Trim $ARGUMENTS and select exactly one mode:
| Argument | Mode |
|---|---|
| empty | Full run from stage 01 |
resume |
Resume one compatible pipeline-auto/v1 run from its files and Git. Never create or replace a run |
status |
Strictly read-only: no lock, write, reconcile, dispatch, test, fix or initialize |
| anything else | Ask what the user meant. Do not guess a verb |
For resume and status, use references/persistence.md.
No identifiable run: say so. Several: ask which. Recency is not selection
authority.
Harness
First action on every harness, before any other step: read references/planning.md. This file is the rules; the stage files are the procedure. A harness that read only this file and started implementing did not run the skill.
No Agent tool with named agent types (Codex, whose spawn_agent takes a
free-text brief): a named agent type in the dispatch table is the file
agents/<name>.md in this plugin, ../../agents/<name>.md relative to this
file — pipeline-auto-intent-reader is
../../agents/pipeline-auto-intent-reader.md,
pipeline-auto-brain is
../../agents/pipeline-auto-brain.md.
Dispatch it with spawn_agent, fork_turns: "none", the message being that
file's body after its frontmatter followed by the brief the stage specifies
(prompts/brain.md, prompts/brain-proposal.md, or the stage-01 intent read).
A quorum or the intent read is three separate spawns, one per index, then
wait_agent for all three; never one spawn asked for three answers. The tool
allowlist becomes the first sentence of the brief: "You may only read. Edit
nothing, run nothing, spawn nothing. Answer with the JSON object only." "Never
substitute brainstorm-architect" holds here too: spawn the brain file, never
an improvised architect role.
No AskUserQuestion (a headless harness, for example the office app that
routes questions to an inbox): stage 03 still asks. Write the run files first,
then end the turn with status needs_info carrying the at-most-four questions.
When the harness resumes the session with answers, continue in resume mode
from the run files (progress.md, decisions.md), never from memory of the
earlier turn.
A harness that cannot write to Git (Codex in the office app: sub-agents
inherit the parent's sandbox, Git metadata is read-only, and the host commits
the worktree as one commit after the turn ends): stages 09 to 12 still run,
inside the turn, before it ends. Stopping at stage 08 to "await the host
commit" is wrong: the host commit comes after the turn, and nothing in stages
09 to 12 waits for it. On this harness each task's implementer is still a
spawned sub-agent (spawn_agent, fork_turns: "none", briefed as the stage
specifies: prompts/implementer.md plus the scripts/task-brief output) that
edits the worktree and reports what it changed; the task reviewer is a second
spawned sub-agent, never the implementer, that reviews the worktree diff
(git diff, git diff --stat and git status are reads and are allowed; only
writes to Git are not) and returns the report in the shape the stage names; a
fix round spawns the fixer the same way. The controller never implements a
task itself and never skips the reviewer, the fix rounds, the master gate or
the completeness pass because no commit exists. When the harness cannot
commit, "commit", "task branch" and "integration merge" in stages 09 and 10
mean the task's state in progress.md plus the worktree diff, and the host
commit the harness makes after the turn stands in for all three. The master
gate (stage 11) and the completeness pass (stage 12) run against the worktree
diff instead of the branch. The controller records every transition in
progress.md exactly as on Claude; the final report names the files changed
instead of commits.
Resume, on every harness: the first action of any turn whose session
already holds a run directory (docs/superpowers/runs/<run-id>/progress.md
exists) is to read progress.md, decisions.md and the stage table, then
continue from the active stage, recording the transitions it finds missing. A
resumed turn never implements before the tracker says stage 09 is active:
whatever the resuming prompt says ("continue", "go on", "finish it"), the
tracker decides what continues, not the prompt and not memory of the earlier
turn.
A superpowers:* skill that is not installed: the SDD review protocol is
already inlined in prompts/ and scripts/, so nothing is lost there. For the
others, do what the stage describes inline; the stage's files in the run
directory are the requirement, not the skill name.
Red flag: implementing before the stage 01–07 files exist in the run directory is a violation on every harness.
Red flag: a resumed turn that edits source while the tracker shows stage 01–08 active is a violation on every harness. So is ending a turn at stage 08 to "await the host commit" on a harness that cannot commit.
The one gate, and files as the authority
Stage 03 asks at most four questions in one AskUserQuestion call. Those
answers are the only unimpeachable requirements. Every later decision is a
quorum adoption or an escalation: no third outcome, no controller override, no
second approval.
Reconstruct the next action from progress.md, decisions.md, immutable
results, evidence digests and Git — never from conversation memory. The schema
is pipeline-auto/v1; there is no migration from pipeline-run/v1 or /v2.
Foreign, missing, malformed or unknown schema is a read-only stop: change
nothing, dispatch nothing.
Stage routing
Load only the reference the active stage needs. The rules in this file apply at every stage and win over any summary elsewhere.
| Stage | Work | Route |
|---|---|---|
| 01–07 | Intent read, question synthesis, the gate, design and review class, spec, master plan, phase fan-out | references/planning.md |
| any | Question raised, quorum open or finalising, drift budget, escalation, quorum resume | references/quorum.md |
| 08–10 | Dial, task start, per-task gate, TDD, scopes, evidence, integration, debugging | references/execution.md |
| 11–12 | Master gate, contradiction routing, adjudicator, completeness, final verification, terminal report | references/review.md |
| any | Tracker writes, status, resume, reconciliation, decision actions | references/persistence.md |
| Dispatch | Template / agent | When |
|---|---|---|
| Intent readers | pipeline-auto-intent-reader ×3 |
stage 01 |
| Brains | pipeline-auto-brain ×3 with prompts/brain.md |
every quorum |
| Proposal brains | pipeline-auto-brain ×3 with prompts/brain-proposal.md |
stage 02 |
| Implementer | prompts/implementer.md, brief from scripts/task-brief RUN_DIR PLAN_FILE TASK_NUMBER |
stage 09, one fresh per task |
| Task reviewer | prompts/task-reviewer.md, package from scripts/review-package RUN_DIR BASE HEAD |
the per-task gate |
| Adversarial reviewer | prompts/adversarial-reviewer.md |
any fired trigger, any review_class |
Both agents run with exactly Read, Grep, Glob. Never add a tool to either
— not even Bash "for one command": frontmatter allowlists tools, not
commands, and a shell can rewrite decisions.md or the intent brief. Never
substitute brainstorm-architect.
The SDD review protocol is inlined in prompts/ and scripts/; do not invoke
superpowers:subagent-driven-development or
superpowers:finishing-a-development-branch.
Rungs, strongest first
specified > code-evidenced > convention-cited > engineering-judgement > speculation
"Stronger" always means earlier in this list. A cluster's rung is its
strongest member's rung, after demoting any member whose citation does not
resolve to its claim. The adoption floor starts at code-evidenced and rises one
rung for the rest of the run once five or more adoptions average above 0.90 —
read it from current_floor, never assume it.
Escalating, exactly
Finalise the question as escalated, queue it now for the next stage boundary
(even mid-phase), and set next_action: await-escalation-batch. Escalating never
draws on the adoption budget.
Recording unresolved, open, deferred, or carrying it in the handover is
not escalating. It asks nobody.
While a question is escalated, every task blocked on it stays blocked and nothing is dispatched on its axis — no trace, no fact-finding, no fresh quorum, no "safe", "additive" or "reversible" subset of the work. The hold lasts until a human answers, not until you judge the work cheap to undo.
Before opening a quorum, in this order
These checks run before a quorum opens. Once a quorum has returned, judge it by the adoption rules below — never retroactively un-ask it.
Already answered? If the approved spec or an adopted decision answers it, the question is not admitted to a quorum. Cite the line on the question record and resume the worker. No quorum, no decision entry, no budget.
Budget. Read
quorum_budget(run_dir, phase=...)before any dispatch. Ceilings areBUDGET_PER_PHASE(3) andBUDGET_PER_RUN(10). Only a human answering an escalation raises one, to a stated finite value; at most two extensions per run, then the budget is terminal. If a ceiling is reached: open no quorum of any size — no worker anywhere opens one — lower no bar, and escalate with the adopted decisions listed. Hold dispatch and integration within the question's blast radius (in-flight work there finishes, publishes and is imported); independent work continues. A terminal budget stops the run resumably: nothing new is dispatched. You never grant yourself an extension.Admissible (
check_admissible), all of:- it blocks named work — a question blocking nothing is an opinion; discard it;
- it is decidable from the repository, the spec and
decisions.md— if it needs what only the user knows (budget, deadline, users, purpose), escalate; - it carries an axis and a blast radius from
task | phase | run | contract; - it passes the options test and is one decision.
Then dispatch exactly three brains.
Evaluating a quorum
Three valid responses is a precondition, not a strength. With fewer, the quorum is not evaluated — not now, not at a deadline, not through any guard, timeout or policy you write in advance. Two agreeing, well-cited responses are two responses.
- A missing response (its worker died, or context was lost): re-dispatch only the missing index, re-sent from its own persisted payload and checked against its digest — never rebuilt from current state. This is recovery, not a second chance. Never re-dispatch a brain that answered; never discard an answer to get a tidier set.
- A schema-invalid value (for example a rung not in the list above): never map, default or demote it. Re-dispatch that index once, with its full rebuilt payload — never "just fix that field", never with its answer pinned. The quorum waits on it. A second invalid response is a non-response: escalate.
- A brain's own question has no field in the schema;
blockeris the only exit. A response asking for something else to be decided first is a non-response. Do not open a quorum on it, do not answer it yourself — not even "the other responses imply it" — do not re-dispatch with the premise supplied. Escalate the original question, naming the premise.
Adoption. Cluster by answer_key when options were named; without named
options, answers share a cluster only if their consequences do not contradict
(when in doubt they are different answers). Then compare rungs. Adopt only when the
winning cluster is strictly stronger than the runner-up, at or above the
current floor, fewer than two responses carry a blocker, nothing forecloses an irreversible
axis, depth is within the cap, budget remains, and check_contradiction returns
nothing.
- One cluster (unanimity) has no runner-up: the floor alone decides.
- Equal rungs never adopt, at the floor or at the top. No tie-break — not headcount, subset consequences, citations, recency, length or "least foreclosing". Escalate.
- Different answers alone are no reason to escalate. One cluster strictly stronger than the rest adopts, however many clusters there are.
- An adoption records the answer, the winning rung and the rung it beat, and
Provenance: quorum; it consumes one phase and one run adoption. The adoptionQ-<qid>is itself the grant: resume the blocked task withresume_task(..., decision_ref="Q-<qid>"). A re-asked question's adoption resumes the task too, under its new qid. After an escalation, the human'stask.resumeH-<n>resumes it once the escalation row isansweredwith thatResolution.
Recorded human decisions
If the winning answer — consequences included — requires a different option on
an axis where an adopted decision has Provenance: human, reject it. No rung and
no unanimity outranks a human's recorded answer. Record
rejected-contradicts-human naming that decision's ID; it stays Adopted; no
budget is spent; escalate (finalize_quorum queues the row). Every task blocked on that axis stays blocked — "the
human decision is still in force, so work against it" is dispatch on a contested
axis.
Review dial
The adversarial triggers — concurrency, authz, crypto, schema,
migration, delete, regulated, public-api, large-surface — fire
independently: any one suffices, whatever the diff's size and whatever the
phase's review_class. final-only decides whether routine review runs; it
never switches the trigger check off. A fired trigger dispatches the adversarial
reviewer before the task completes.
You set each phase's review_class once, at stage 04, from the plan's
classification, and never move it afterwards except through a ratchet whose
trigger already exists — for the adversarial route, a CONFIRMED or unrefuted
PLAUSIBLE finding returned by that reviewer. A ratchet record you write from
your own reading of the diff is not a trigger. Never downward. The tracker
enforces the move: (final-only, plan) → (required, ratchet) once, with a
trigger from the closed list, and adversarial-finding or
low-confidence-dependency only when the tracker already held that fact before
the ratchet's transition. Lowering and withdrawing are refused, and so is
deleting an imported phase row to re-add it.
Completeness critic items
The critic's classification is not yours to change. SPEC-NOT-MET is a finding
for the fix loop. MISSING-FROM-SPEC is frozen, and the output is:
- A section appended to the run's
completeness-proposals.md, headed with the next unused proposal number (## CP-1,## CP-2, … — never the literal<n>): Statement, Evidence (the critic's text),Traces to: none,Status: Frozen, classification verbatim. - That proposal ID listed in the terminal report.
- Once every other item is finished — an open fix round completes first —
next_action: complete-with-proposals.derive_next_actionderives it from that file, and never while a fix round or other item is still open.
Nothing else: no task, phase, fix-round finding, quorum, backlog or handover
note, and no disposition — deferred, out-of-scope, declined and closed
are all reclassifications. The proposal is the user's to decide.
Rationalizations
| Excuse | Reality |
|---|---|
| "Two agree at a strong rung — the strongest quorum available." | Three valid responses is a precondition. |
| "I record the degraded count (2 of 3) honestly." | An honestly recorded illegal finalisation is still illegal. |
| "Sealing at the deadline is arithmetic; the rule is written in advance." | A violation scheduled is the same violation. |
| "The re-dispatch completes the record; it is not a gate." | It is the gate. |
| "The other responses already settle the premise the brain raised." | You do not answer questions you are routing. |
| "Only evidence-gathering, no adoption." / "The tie shows the question is malformed." | Nothing is dispatched on a tied axis. It is escalated. |
| "The human decision stays in force, so work proceeds against it." | Blocked until a human answers. |
| "Escalation is for questions the repository cannot answer." / "Idle brains cost nothing." | An exhausted budget escalates regardless. It caps authority, not cost. |
| "I decline it, closed in this run; reviewers can reverse it." | Declining is a disposition. Record the proposal. |
| "It crosses a trust boundary, that is the trigger, and I wrote the ratchet record." | A self-authored trigger is no trigger. |
| "Three different answers means the question is underdetermined." | Only when they tie on rung. A strict gap adopts. |
| "The spec already answered this, so the quorum's adoption is void." | The check runs before dispatch. A returned quorum is judged by the adoption rules. |
Red flags — stop and re-read the rule
- Acting on fewer than three valid responses, now or "if it has not returned by…".
- Writing "not a gate", "non-blocking" or "degraded count".
- Dispatching anything on an escalated or contradicted axis.
- Writing
unresolved,deferredor "carry to handover" instead ofescalated. - Opening a quorum without comparing the budget counters to the ceilings.
- Changing
review_classafter stage 04, a ratchet record with no fired trigger, or a label over a critic's classification. - Pushing, publishing, opening a pull request, or merging into
main/master. Success is a clean committed feature branch and a report that leads with every decision the run made without asking. - A resumed turn editing source while the tracker shows stage 01–08 active, or ending at stage 08 to await a host commit when the harness cannot commit.