marshal-plan-consensus
Reach a consensus on the APPROACH before committing a fleet to build it. Spawn several biased, independent solvers that each propose a plan for the same question, then an independent judge that conver
SKILL.mdskills/marshal-plan-consensus/SKILL.md
GitHubReaching a consensus plan before you build
Related: this skill produces a plan. To have one judged by a declared panel before you commit to it,
run_team(name, target="plan", text=...)- seemarshal-adversarial-review. Use that when the question is "is this plan sound?"; use the loop below when the question is still "what should the plan even be?"
When what to do is clear you just decompose and delegate (marshal-orchestrate). When how to do
it is contested - several plausible designs, fuzzy scope, an expensive-to-undo direction - you first
turn the question into an evidenced plan that survived independent scrutiny. The loop is frame
-> solve (in isolation) -> judge -> converge or build.
This is not one agent's plan. It is biased, independent, multi-angle convergence: each solver starts from a different prior, proposes without seeing the others, and an independent judge arbitrates - it never authors a fourth plan of its own.
When to use
- A non-trivial goal where the approach is genuinely contested, or a wrong turn is costly (a schema, a public API, a migration strategy, a refactor boundary).
- Not for obvious tasks - reaching for consensus on a clear change is wasted spend; just orchestrate.
The three rules that make it work
- Biased. Each solver holds ONE prior (below) and argues it. Don't ask one agent for "the best plan" - that collapses to a single opinion.
- Independent. Solvers must not see each other's plans. Spawn them together so they run in parallel isolation; only the judge reads all of them.
- Sealed. Each solver ends with one parseable line:
PLAN: propose|abstain - <one-line approach>, above a short plan body (scope, files, key decisions, what it explicitly will NOT do).
1. Frame the question
Write ONE concrete, narrow question, plus the constraints/rules that govern it and the minimal files or context a solver needs to answer. Vague questions produce vague plans.
2. Spawn the solvers (no-peek, read-only)
Route to read-only clients (they inspect the repo and produce a plan, not edits) and give each the
same question + its prior + the required PLAN: line. Run them together so they cannot see each
other:
run_many([
{client: <read-only>, goal: MINIMAL_PRIOR + question, task_id: "plan.<id>"},
{client: <read-only>, goal: STRUCTURAL_PRIOR + question, task_id: "plan.<id>"},
{client: <read-only>, goal: DELETE_PRIOR + question, task_id: "plan.<id>"},
])
Share one task_id so usage() / report() group the round. The priors:
- minimal - the smallest viable change that resolves the goal; explicitly do NOT over-engineer.
- structural - the structurally clean design; accept higher cost (a helper, an abstraction, an extra handoff) to land something an architecture review won't reject later.
- delete - question the necessity. Can this be solved by deleting or collapsing, or not built at
all? If it must be built,
abstainand let minimal/structural win.
3. Judge - converge, don't author
Feed the three sealed plans to one independent judge agent. It arbitrates between the proposals; it must not invent a fourth design not present in any solver (that means it's solving, not judging). It emits exactly one:
consensus- the proposals agree (same boundary, same files, no contradictory choices). Output the one concrete converged plan.converge- they disagree but are close: narrow the question to the open disagreement and re-run step 2.escalate- genuinely stuck or the goal is ill-posed. Stop and bring it to a human.
Even when a direction looks obvious, run the gate: it turns a hunch into a plan with stated scope, files, and non-goals.
4. Converge loop
On converge, re-run the solvers with the narrowed question. Cap at ~3 rounds. If a round makes no
progress (same split twice), escalate to a human or drop the goal - never loop forever.
5. Build
On consensus, the converged plan is your spec: hand it to marshal-orchestrate (decompose into
independent tasks -> spawn -> review -> integrate), and gate the result with marshal-review-gate
when the change warrants a quorum.
Invariants to respect
- Solvers and judge are headless - the question + prior in the prompt is all they get; no questions.
- Independent means parallel + isolated; only the judge sees all plans, never a solver.
- The judge converges among the proposals; it never authors a new plan of its own.
- An obvious direction still passes the gate; cap the rounds and escalate - never loop forever.