| name | review-committee |
| description | The ReviewerCommittee gate — ONE gate-parameterized review skill. Convene the current gate's STATIC persona subset as parallel independent depth-1 sub-agents (fresh context each), then ASSEMBLE their scores into the machine-readable verdict.json the driver reads. Carries the per-gate persona subsets, each persona's lens, the flag vocabulary, and the EXACT verdict schema. Topic-agnostic. Must be invoked explicitly. |
| disable-model-invocation | false |
| allowed-tools | ["Read","Write","Glob","Grep","Task","Bash(python *)"] |
review-committee
ONE skill, the gate you sit at is in the run context (gate = **<gate>**). You CONVENE that gate's static persona subset as independent parallel sub-agents and ASSEMBLE their scores into a verdict — you do NOT route: the driver reads verdict.json and picks the edge. Write the verdict to the exact path the run context names: workspace/stage-review/<gate>/verdict.json.
Guardrail: you are the review STEP's main agent (depth-0) — only a depth-0 agent may fan out depth-1 personas. The personas are INDEPENDENT and the per-gate subset is STATIC config (below), never a runtime choice. The committee ASSEMBLES; the driver DECIDES.
The gate's persona subset comes from the RUN CONTEXT (do NOT invent it)
The committee is designed per topic (run_panel.py writes <topic>/committee/panel.json), so the persona subset is NOT hardcoded here — the run context names the EXACT personas to convene for this gate ("convene exactly this gate's persona subset: committee-..., ..."). Convene EXACTLY those subagent_types — verdict.json.personas[] must hold exactly that set, no more, no fewer (the driver rejects any other set). Typically the proposer gate convenes the full panel (worth it? novel? identifiable? feasible?) and the planner gate convenes the single designated data-feasibility referee (is this operationalization runnable against the records?).
Inputs (by gate — read what the gate judges)
proposer: workspace/stage-frame/hypothesis/hypothesis.md (the question + the decisive test) + workspace/stage-frame/literature/review.md + workspace/stage-frame/data/review.md.
planner: workspace/stage-research/plan.md + workspace/stage-research/manifest.json (the default-FAIL item manifest) + workspace/stage-frame/data/feasibility.json + workspace/stage-frame/data/review.md.
Search the corpus / register docs YOURSELF (do not rely only on the supplied review)
The producer's workspace/stage-frame/{literature,data}/review.md is its framing — treat it as a claim to AUDIT. Personas may (and the novelty/mechanism/feasibility lenses SHOULD) autonomously read the papers corpus (--papers-dir, one markdown per paper; frontmatter slug/year + text) and the register docs (--data-dir: INDEX.md + registers/<slug>.md). Bind any corpus claim to a slug, any data claim to a [data:<id>]. Never fetch from the network — the corpus + register docs are the only references.
Independence (anti-anchoring)
Judge THIS artifact on its own merits. Do NOT read prior verdicts of this gate or diff against earlier rounds — "improved since last round" is invalid evidence. Calibration: advance / score 8 = this would survive review at a strong field journal in the topic's discipline today.
Method
- Assemble ONE payload for the gate (the inputs above). The SAME payload goes to every persona — only the persona's lens differs. Generation must NOT leak into review.
- Spawn the gate's persona subset in PARALLEL — one
Task call per persona, all in a SINGLE message (subagent_type = each persona slug the run context names, e.g. committee-<slug>). Each is an independent fresh-context sub-agent. In your call supply: (a) the gate, (b) what to judge + the input paths, (c) the per-persona return contract, (d) the output file workspace/stage-review/<gate>/<persona>.md. Sequential strictly-separated passes ONLY as the flagged DEGRADED: no-subagents fallback; never let one persona's text condition another's.
- Each persona returns
{persona, score (1-10, or null at the planner feasibility gate), advance (bool), flag, flags[], failed_criteria[], evidence} bound to un-paraphrasable artifacts (a coefficient / N / p / the nearest-prior [slug] / the exact [data:<id>]) and writes its <persona>.md.
- ASSEMBLE the verdict (schema below). Aggregate the per-persona scores into one
score (mean, rounded to int; null at the planner gate); set advance and the single routing flag; collect personas[], failed_criteria, details, explanation, review_md.
How to set advance and flag (the driver routes on these — get them exact)
advance: true when the gate's subset clears the artifact (all personas advance, or aggregate score ≥ the pass bar named in the run context for the scored proposer gate). Otherwise advance: false AND set ONE flag from the gate's vocabulary:
proposer gate (scored, all 4): on a non-advance set the dominant flag — low_novelty | not_identifiable | infeasible — and put the specific fixes in failed_criteria (the driver re-asks the Proposer with them).
planner gate (patent-attorney sole, unscored — score:null): infeasible → the driver bounces to the Proposer (capped); else advance:true.
Outputs
workspace/stage-review/<gate>/<persona>.md — one per convened persona (its full lens review, bound to artifacts).
workspace/stage-review/<gate>/review.md — the human-readable assembly (per-persona summaries + aggregate rationale + any DEGRADED: note + the single-model self-preference-bias disclosure). review_md in the verdict points here.
workspace/stage-review/<gate>/verdict.json — the machine gate, EXACTLY this schema:
{ "advance": false, "flag": "low_novelty|not_identifiable|infeasible|null",
"score": 7, "personas": [ {"persona":"committee-journal-editor","score":7,"advance":false,"flag":"low_novelty","failed_criteria":["..."],"evidence":"[slug]..."} ],
"failed_criteria": ["<concrete fix the producer must address>"],
"details": [], "explanation": "<one-paragraph aggregate rationale>",
"review_md": "workspace/stage-review/<gate>/review.md" }
advance MUST be a bool and personas[] MUST hold exactly this gate's subset — a missing/malformed verdict fails the step (default-FAIL: a committee that exited 0 without a parseable verdict did NOT finish).
Constraints
- Convene EXACTLY the gate's static subset —
personas[] set must equal it. Never add a persona "for safety" or drop the planner gate's sole vote.
- Bind every score to un-paraphrasable artifacts; the score and the prose must agree.
- ANTI-HIVEMIND: the personas are independent and parallel — never one agent role-playing several hats.
- Disclose the single-model self-preference-bias limitation in
review.md.
- Write ONLY under
workspace/stage-review/<gate>/; never touch the producer's artifacts, PROGRESS.md beyond your one block, or any other gate's directory.