council · diff
git:20260515.312e674 to git:20260727.37a3f77
134 added, 104 removed. Audit A to A.
---
name: council
- description: Spawn up to 5 independent critic subagents in PARALLEL on a target — a research idea, draft, R&R strategy, grant proposal, experimental design, pre-analysis plan, talk plan, IRB protocol, or skill design — collect their raw outputs, then run a SEPARATE synthesis pass that produces a single prioritized action list without majority-voting. Default critic roster is tuned for quantitative-marketing research (skeptic, pre-mortem, methodologist, academic-editor, harsh-referee); `--chef-skill` swaps in a skill-design roster (works with `/skill-creator`). Use whenever the user says "/council", "council review", "get a council on", "spawn critics on", "parallel critique", "kitchen cabinet review", "panel review", "stress-test this idea / plan / skill", or "what would 5 experts say". Target-agnostic and configurable, distinct from `/seven-pass-review` (which is manuscript-bound and runs 7 fixed lens passes on abstract / intro / methods / results / robustness / prose / citations) and from `/evaluate-idea-marketing` and `/evaluate-idea-science` (which run an 8-step linear pre-execution scoring rubric and loop until score >= 7). `/council` is one-shot, parallel, target-agnostic; use it when the target is heterogeneous (e.g., a plan, a skill, an R&R reply) or when the user wants a fast adversarial cross-section rather than a structured scorecard.
- argument-hint: "[target — file path, draft text, or topic description] [--chef-skill] [--critics=skeptic,premortem,methodologist,editor,referee] [--n=5]"
- allowed-tools: ["Read", "Grep", "Glob", "Write", "Bash", "Task", "Monitor"]
- effort: medium
+ description: Spawn five independent critic subagents in parallel on any target (research idea, draft, R&R strategy, grant, experimental design, pre-analysis plan, talk plan, IRB protocol, or a SKILL.md), then a separate synthesis pass ranks findings by how load-bearing they are, never by vote count. Default roster is tuned for quantitative marketing; --chef-skill swaps in a skill-design roster. TRIGGER on "council", "spawn critics", "parallel critique", "kitchen cabinet", "panel review", "stress-test this", "poke holes in this", "what would five experts say". Use review-paper for a complete manuscript, slide-review for an existing deck, and preregister to draft (not critique) a prereg.
---
- # Council — Parallel Critics + Separate Synthesis
+ # council
- Five independent critics, one synthesizer, no majority voting. Single round.
+ Five independent critics, one synthesizer, no majority voting. Single round. Adapted from Chris
+ Blattman's [claudeblattman](https://github.com/chrisblattman/claudeblattman), including the rule
+ that the synthesizer ranks by how load-bearing a finding is and never by how many critics raised it.
## When to use
- - The user is stuck between two framings of a paper, R&R, or grant — and wants adversarial pressure.
- - A plan, design, or skill draft is "almost right" and needs failure-mode pressure before it ships.
- - The target is heterogeneous (idea + design + venue choice mixed together) so `/seven-pass-review` and `/evaluate-idea-*` don't fit cleanly.
- - Pre-submission gut-check that's lighter than `/seven-pass-review` but broader than `/review-paper-light`.
+ - Stuck between two framings of a paper, R&R, or grant, and you want adversarial pressure on both.
+ - A plan, design, or skill draft is almost right and needs failure-mode pressure before it ships.
+ - The target is heterogeneous (idea plus design plus venue choice, or a strategy memo) so a
+ manuscript-shaped review does not fit.
- Not for: numeric audits (use `/audit-reproducibility`), manuscript line-edits (use `/seven-pass-review` or `/review-paper`), or staged idea scoring loops (use `/evaluate-idea-marketing` or `/evaluate-idea-science`).
+ Not for a complete manuscript you want line-edited and refereed against a journal bar: that is
+ `review-paper`. Not for numeric or reproducibility audits. This skill produces a checklist and
+ never edits the target.
## Inputs
- - `$0` — the target. One of:
- - **File path** (`.tex`, `.md`, `.qmd`, `.txt`, `.pdf`, `.R`, `.py`, or a `SKILL.md` for `--chef-skill` mode). Read it once in the main agent before dispatching critics.
- - **Inline topic description** — a paragraph stating the decision, plan, or idea. No file read needed.
- - `--chef-skill` — swap the default roster for the skill-design roster. Use with `/skill-creator` drafts.
- - `--critics=a,b,c` — explicit roster override (names without `-agent` suffix). If a name isn't in the default roster, treat it as a free-form role-string prompt.
- - `--n=K` — number of critics (default 5, hard cap 5). If user asks for more, refuse with "Hard cap is 5. Pick a tighter panel."
-
- ## Critic roster (default, quantitative-marketing tuned)
-
- Spawned as `general-purpose` subagents with inline role-string prefixes. No persona files required.
-
- 1. **Skeptic** — *"Challenge the core claim or hypothesis. What would have to be true for this to be wrong? Where is the load-bearing assumption that the author has not stress-tested? Be specific to the target — name the assumption, not the genre."*
- 2. **Pre-mortem** — *"Imagine it is 12 months from now and this paper / plan / grant has failed. What is the most likely failure mode? Walk back from the failure to the present and name the decision point at which it could have been avoided."*
- 3. **Methodologist** — *"Challenge identification, measurement, and design. Tuned for quant-marketing: DiD, IV, RD, RCT, conjoint, eye-tracking, vignette, field experiment, scraped-panel obs, GAN / SAE / embedding methods. Are exclusion restrictions defensible? Is the unit of analysis vs. unit of treatment consistent? For ML / GenAI components — train / test / holdout discipline? External validity?"*
- 4. **Academic editor** — *"Venue fit, narrative tightness, contribution framing. Default targets: Marketing Science / JMR / JCR / Management Science. If the user signals general-science (PNAS / Nature Human Behaviour / Nature / Science), recalibrate. Does the contribution fit the audience? Is the framing tight enough for a non-specialist editor? What would you tell the user to cut or expand?"*
- 5. **Harsh referee** — *"You are the most likely Reviewer 2. Produce the rejection arguments a sharp referee at the target venue would write. Do not be balanced. Name the specific objection (overclaiming, identification, sample, mechanism, novelty, scope) and give the sentence you would write in the report."*
-
- Each critic ends with: `VERDICT: APPROVE | REVISE | REJECT` and a one-line rationale.
-
- ## `--chef-skill` alternate roster
+ | Argument | Default | Meaning |
+ |---|---|---|
+ | target | required | file path, or an inline paragraph describing the idea, plan, or decision |
+ | `--chef-skill` | off | swap in the skill-design roster |
+ | `--critics=a,b,c` | default roster | explicit roster; unknown names become free-form role prompts |
+ | `--n=K` | 5 | number of critics, hard cap 5 |
- Swap roster for skill / tool design review. Use with `/skill-creator` drafts or any `SKILL.md` the user wants stress-tested before installing.
+ A file target may be `.tex`, `.md`, `.qmd`, `.txt`, `.pdf`, `.R`, `.py`, or a `SKILL.md`. Read it
+ once in the main thread before dispatching, and pass the contents inline to the critics so five
+ subagents do not each re-read it. This setup assumes the Read tool cannot open a `.pdf` (no
+ poppler; adjust to your machine), so extract
+ it with `~/.claude/assets/bin/pdfread.py text <file.pdf>` and pass that text inline. Do not call
+ `pdftotext`.
- 1. **Skill engineer** — *"Will this skill work, will it last, does the abstraction earn its keep? Focus on: invocation discoverability (do the trigger phrases match real user language?), prompt-budget discipline, failure recovery, whether it duplicates existing skill coverage (Glob `~/.claude/skills/*/SKILL.md` to check)."*
- 2. **Trigger-overlap critic** — *"Read the description's trigger phrases and compare to neighboring skills (`/draft`, `/cite`, `/litreview`, `/log-todo`, `/notion-log`, `/review-*`, etc.). Where would a user say one phrase and trigger the wrong skill? Name the collision and the disambiguating phrase that would fix it."*
- 3. **Edge-case critic** — *"What breaks this skill? Empty input, file-not-found, MCP not authenticated, ambiguous target, PDF that won't extract, Windows path with spaces, project the skill wasn't tuned for. List the top 5 edge cases and what the skill should do in each."*
- 4. **MCP / tooling fit** — *"Does this skill match the user's MCP setup (Zotero, Notion, GitHub, semantic-scholar, arxiv, openalex, gmail, gdrive, playwright)? Are the right tool names used? GitHub MCP runs the local `github-mcp-server.exe` (Windows) or `github-mcp-server` (Mac/Linux) with a personal access token pulled via `gh auth token` — full read/write access to repos, issues, PRs, releases, and Actions per the PAT's scope. Does it respect Windows path conventions?"*
- 5. **Cold-start tester** — *"Pretend you are the user three weeks from now, having forgotten this skill exists. Read the description. Will you know when to invoke it? Will the argument-hint tell you what to type? Will the failure modes be intelligible? If not, name the exact phrase that's missing."*
+ If the user asks for more than five critics, refuse: "Hard cap is 5. Pick a tighter panel."
- Each ends with: `VERDICT: SHIP | REVISE | REJECT` and a one-line rationale.
+ ## Default roster (quantitative marketing)
- ## Workflow
+ Spawned as `general-purpose` subagents with inline role-string prefixes. No persona files.
- ### Phase 0 — Input prep
+ 1. Skeptic. "Challenge the core claim. What would have to be true for this to be wrong? Where is
+ the load-bearing assumption the author has not stress-tested? Name the specific assumption in
+ this target, not the genre-typical one."
+ 2. Pre-mortem. "It is twelve months from now and this paper, plan, or grant has failed. What is
+ the most likely failure mode? Walk back from the failure and name the decision point today at
+ which it could have been avoided."
+ 3. Methodologist. "Challenge identification, measurement, and design. Quant-marketing tuned: DiD,
+ IV, RD, RCT, conjoint, eye-tracking, vignette, field experiment, scraped panel, and
+ GAN/SAE/embedding methods. Are the exclusion restrictions defensible? Is the unit of analysis
+ consistent with the unit of treatment? Is the clustering level defensible? For ML or GenAI
+ components, is train/test/holdout discipline intact, and does anything leak?"
+ 4. Academic editor. "Venue fit, narrative tightness, contribution framing. Default targets
+ Marketing Science, JMR, JCR, Management Science; recalibrate if the user signals
+ general-science (PNAS, Nature Human Behaviour) or economics. Does the contribution fit that
+ audience? Is the framing tight enough for a non-specialist editor? What gets cut, what gets
+ expanded?"
+ 5. Harsh referee. "You are the most likely Reviewer 2. Produce the rejection arguments a sharp
+ referee at the target venue would write. Do not be balanced. Name the specific objection
+ (overclaiming, identification, sample, mechanism, novelty, scope) and write the sentence you
+ would put in the report."
- 1. Parse `$0` and flags. If `--chef-skill`, lock to the skill-design roster; skip target-type inference.
- 2. If `$0` is a file path: Read it once in the main agent. For `.pdf`, fall back to `pdftotext -layout` or to the `.tex` source. For `SKILL.md`, also `Glob` neighboring `~/.claude/skills/*/SKILL.md` so the trigger-overlap critic has the catalog to compare against.
- 3. If `$0` is inline text: use as-is.
- 4. Resolve roster: default 5 for the main flow; default 5 for `--chef-skill`. `--critics=...` overrides; `--n=K` truncates to K (cap 5). Validate roster names; unknown names become free-form role-string critics.
- 5. Create scratch dir `~/.claude/cache/council_<YYYYMMDD>_<run_id>/` for raw critic outputs.
+ Each critic ends with `VERDICT: APPROVE | REVISE | REJECT` plus a one-line rationale.
- ### Phase 1 — Parallel critic dispatch (SINGLE message, N Task calls)
+ ## `--chef-skill` roster (skill and tool design)
- This is the load-bearing step. Send ONE message with N `Task` tool calls — one per critic. They must run in parallel; do NOT serialize. Each call:
+ For a `SKILL.md` the user wants stress-tested before installing.
- - `subagent_type`: `general-purpose`
- - `description`: 3–5 word summary (e.g., "Skeptic critique of draft")
- - `prompt`: the critic's role-string prefix + the target content (file contents or inline topic) + the instruction *"Produce raw critique in this role's voice. Be specific to the target, not the genre. End with VERDICT: <APPROVE|REVISE|REJECT> + one-line rationale. Write your output to `~/.claude/cache/council_<run_id>/critic_<role>.md` and also return it as your final message."*
+ 1. Skill engineer. "Will this work, will it last, does the abstraction earn its keep? Invocation
+ discoverability (do the trigger phrases match how this user actually talks?), prompt-budget
+ discipline, failure recovery, and duplicated coverage against skills already installed."
+ 2. Trigger-overlap critic. "Glob `~/.claude/skills/*/SKILL.md` and read the frontmatter
+ descriptions of every installed skill, plus the `hpc:*` plugin skills and the built-in slash
+ commands. Where would the user say one phrase and fire the wrong skill? Name the collision and
+ the disambiguating phrase that fixes it."
+ 3. Edge-case critic. "What breaks this skill? Empty input, file not found, ambiguous target, a
+ PDF with no text layer, an MCP that is not authenticated, a path containing spaces (Overleaf
+ project directories all have them), a Dropbox conflicted copy shadowing the real file, a
+ project the skill was not tuned for. List the top five and what the skill should do in each."
+ 4. Tooling fit, macOS. "Does this skill match what is actually on this machine? Available: Zotero
+ MCP (`mcp__zotero__*`, including semantic search, PDF page reads, annotations, bibliography
+ export), Playwright MCP (one shared browser, so browser steps must serialize), Scholar Gateway
+ (`semanticSearch`, a semantic passage search over a Wiley-leaning corpus, not a fetcher for
+ arbitrary DOIs), WebSearch and WebFetch, and the Notion, Gmail, Google Drive, and Google
+ Calendar connectors through claude.ai. Local CLI:
+ `~/.claude/skills/reading-papers/scripts/paper.py` (search, resolve, get, author,
+ cites, `--json`) for literature lookup and citation checks. This inventory may lag the
+ machine, so verify against the live tool list in your own context before flagging a tool as
+ missing. LaTeX is MacTeX `latexmk`. This setup assumes
+ no Homebrew and no poppler, so `pdftotext` and `pdftoppm` do not exist and the Read tool cannot
+ open a PDF; PDFs go through `~/.claude/assets/bin/pdfread.py` (`text` to extract, `png` to
+ rasterize a page for Read). Images are read visually by the Read tool. An HPC cluster, if
+ you use one, may be reachable as `ssh hpc`. Flag any tool the skill names that is not on this list, any shell
+ command that assumes a package manager, any Windows-ism, and any place the skill should be
+ using a tool that exists and is not."
+ 5. Cold-start tester. "You are this user three weeks from now, having forgotten the skill exists.
+ Read only the frontmatter description. Will you know when to invoke it? Does it tell you what
+ to type? Are the failure modes intelligible? If not, name the exact missing phrase."
- Do not inline-synthesize. Do not summarize across critics in the main agent. Just collect.
+ Each ends with `VERDICT: SHIP | REVISE | REJECT` plus a one-line rationale.
- ### Phase 2 — Synthesizer (SEPARATE Task call, AFTER all critics return)
+ ## Workflow
- Wait for all N critics. Then spawn one MORE `Task` call:
+ Phase 0, prep. Parse the target and flags. With `--chef-skill`, lock the roster and skip
+ target-type inference. Read a file target once here; use inline text as-is. Resolve the roster,
+ truncating to `--n`. Truncation keeps the first K critics in list order, so `--n=3` on the
+ default roster drops the academic editor and the harsh referee. Create a scratch directory `~/.claude/cache/council_<YYYYMMDD>_<run_id>/`
+ for raw critic output.
- - `subagent_type`: `general-purpose`
- - `description`: "Synthesize council critiques"
- - `prompt`: the raw critic outputs + the original target + the synthesis template (below).
+ Phase 1, parallel dispatch. This is the load-bearing step. Send ONE message containing N subagent
+ calls, one per critic, so they run concurrently. Never serialize them. Each call uses
+ `subagent_type: general-purpose`, a three-to-five word description, and a prompt made of the
+ critic's role string, the target content, and: "Produce raw critique in this role's voice. Be
+ specific to this target, not to the genre. Quote the target where you object to it. End with
+ VERDICT plus a one-line rationale. Write your output to
+ `~/.claude/cache/council_<YYYYMMDD>_<run_id>/critic_<role>.md` and also return it as your final
+ message."
- **The synthesizer must NOT majority-vote.** Spell this out in the prompt: *"You are not summarizing votes. A single critic raising a load-bearing concern outweighs 4 critics who didn't notice it. Your job is to reason about which concerns are load-bearing — i.e., which would, if true, kill the paper / plan / skill — and surface those first. If a minority concern is load-bearing, it dominates. If the majority concern is cosmetic, it goes to the bottom."*
+ Do not synthesize inline. Do not summarize across critics in the main thread. Collect.
- ### Phase 3 — Emit report
+ Phase 2, synthesis, a separate call after all critics return. One more `general-purpose` subagent
+ gets the raw critic outputs, the original target, the report shape below, and this instruction
+ spelled out verbatim:
- Print the synthesis to the main conversation. Include the raw critic outputs in a `<details>` block at the bottom for verification.
+ > You are not summarizing votes. A single critic raising a load-bearing concern outweighs four
+ > critics who did not notice it. Decide which concerns are load-bearing, meaning they would kill
+ > the paper, plan, or skill if true, and put those first. A minority concern that is load-bearing
+ > dominates. A majority concern that is cosmetic goes to the bottom.
- ## Synthesis non-majority-voting principle
+ Phase 3, emit. Print the synthesis to the conversation with the raw critic outputs in a
+ `<details>` block underneath.
- Multi-critic systems drift toward majority voting because it's the easy aggregation. That defeats the point. The council exists to surface minority concerns from specialized lenses. Bake this into the synthesizer prompt explicitly:
+ ## Why the non-majority rule matters
- - A concern raised by 1 critic that would kill the project is more important than a concern raised by 4 critics that is cosmetic.
- - If the methodologist names an identification problem and no one else mentions it, that goes at the top — not at the bottom because "only one critic flagged it."
- - The synthesizer reasons about load-bearingness, not frequency.
+ Multi-critic systems drift toward majority voting because counting is the easy aggregation, and
+ that defeats the point of running specialized lenses. If the methodologist names an identification
+ problem nobody else noticed, it goes at the top, not at the bottom for lack of seconds. The
+ synthesizer reasons about load-bearingness, never frequency. Re-read its output before emitting:
+ if it ranked by how many critics agreed, re-spawn it with a sharper instruction.
- ## Output report shape
+ ## Report shape
```markdown
- # Council Review: <target>
+ # Council review: <target>
- **Date:** YYYY-MM-DD
- **Mode:** <default | --chef-skill>
- **Critics:** <N> (<roster>)
- **Synthesizer verdict:** <SHIP | REVISE-MINOR | REVISE-MAJOR | REJECT-AND-REFRAME>
+ Date: YYYY-MM-DD | Mode: <default | chef-skill> | Critics: <N> (<roster>)
+ Synthesizer verdict: <SHIP | REVISE-MINOR | REVISE-MAJOR | REJECT-AND-REFRAME>
## Load-bearing concerns (action required)
- 1. **[lens]** <concern> — *why this is load-bearing in one sentence* — recommended fix
- 2. ...
+ 1. [lens] <concern>. Why it is load-bearing, one sentence. Recommended fix.
## Second-tier concerns
- - **[lens]** <concern> — recommended fix
+ - [lens] <concern>. Recommended fix.
## Polish (optional)
- - ...
## Per-critic verdicts
- | Critic | Verdict | One-line rationale |
- |---|---|---|
- | Skeptic | | |
- | Pre-mortem | | |
- | Methodologist | | |
- | Academic editor | | |
- | Harsh referee | | |
+ | Critic | Verdict | Rationale |
## Contradictions between critics
- [If two critics disagree (e.g., editor says "expand contribution framing" but referee says "trim — overclaiming"), surface here and recommend a reconciliation. Do not silently average.]
-
- <details>
- <summary>Raw critic outputs</summary>
-
- [Inline each critic's raw output, headed by their lens.]
+ <If two critics disagree, for example the editor wants the contribution framing expanded and the
+ referee calls the same passage overclaiming, surface it and recommend a reconciliation. Never
+ silently average them.>
+ <details><summary>Raw critic outputs</summary>
+ <each critic's raw output, headed by lens>
</details>
```
- ## Relation to other skills
+ ## Failure modes
- - **`/seven-pass-review`** — manuscript-bound, 7 fixed lenses (abstract / intro / methods / results / robustness / prose / citations). Use when the target IS a complete paper and you want exhaustive lens-by-lens coverage. `/council` is target-agnostic and cheaper (5 vs 7 critics, no fixed lenses).
- - **`/evaluate-idea-marketing`** and **`/evaluate-idea-science`** — 8-step linear pre-execution scoring rubric with a loop until score >= 7. Use for go / no-go on a research idea before any work is done. `/council` is one-shot, parallel, and works for ideas, plans, drafts, skills, or any heterogeneous target — no scoring loop.
- - **`/review-paper`** — 6-agent journal-targeted referee report. Closer in spirit to `/council` but locked to paper review. Use `/council` when the target is not a paper.
- - **`/review-paper-light`** — 2-agent fast contribution / identification check. Cheaper than `/council`; use when you only need a gut check, not a full panel.
- - **`/skill-creator`** — pairs with `/council --chef-skill` for adversarial review of skill drafts before installation.
- - **`/blindspot`** — adjacent but different: `/blindspot` finds what you haven't considered; `/council` pressure-tests what you HAVE considered.
+ Target unreadable (path wrong, PDF has no text layer, `.tex` with unresolved `\input`s): surface
+ the error and ask for a clean version. Do not dispatch critics on empty content.
- ## Failure modes
+ A critic returns empty or off-topic: mark it DEGRADED in the synthesis and continue. Re-spawn it
+ once at most; never block the report on one critic.
- - **File unreadable.** `.pdf` extraction failed, `.tex` has unresolved `\input{}`s, or path doesn't exist. Surface the error and ask for a clean version; do not proceed with empty content.
- - **A critic returns empty or off-topic.** Mark that critic as DEGRADED in the synthesis and continue. Do not block the report on one critic. Optionally re-spawn that critic once.
- - **All critics agree the target is fine.** Possible. Report it honestly with `SHIP` verdict; do not manufacture concerns. The council can sign off.
- - **Synthesizer drifts into majority voting.** Re-read the synthesizer output before emitting. If it ranks by frequency rather than load-bearingness, re-spawn the synthesizer with a sharper non-majority-vote instruction.
- - **`--chef-skill` invoked on a non-skill target.** Surface the mismatch and ask whether to switch to the default roster.
+ Every critic approves: report it honestly with a SHIP verdict. Do not manufacture concerns to
+ justify the run.
+ `--chef-skill` on a non-skill target: say so and ask whether to switch to the default roster.
+
## Out of scope
- - Iterative debate / round-2 critic calls. Single round only — multi-round drifts toward conformity.
- - Auto-applying fixes. This skill produces a checklist; it does not edit the target.
- - Numeric audits (`/audit-reproducibility`).
- - LLM-proposed dynamic persona generation. Roster is either default, `--chef-skill`, or explicit `--critics=...`.
+ Round-two critic calls, because multi-round debate drifts toward conformity. Auto-applying fixes.
+ Model-invented personas: the roster is default, `--chef-skill`, or explicit `--critics=`.