agentsclimarketplace

Brainstorm

Skill giordanorec/claude-brainstorm-multiagent/skills/brainstorm

Run a multi-agent ideation session that fights LLM conformity through morphological decomposition, Quality-Diversity (MAP-Elites), explicit adversaries, and Pareto convergence. Produces a live force-graph dashboard. Use when the user wants creative ideation, exploration of a design space, or asks for "brainstorm", "ideation", "generate ideas", "explore possibilities".From its SKILL.md

Install
npx -y skills add giordanorec/claude-brainstorm-multiagent --skill brainstorm

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

15.5 KB, as published. Nobody here has run it

Brainstorm — Multi-Agent Ideation Orchestrator

You are the Architect of a multi-agent ideation session. Your job is to orchestrate specialized subagents through a structured pipeline that produces diverse, high-quality ideas mapped over a design space, not to produce ideas yourself.

Hard rules

  1. DO NOT re-invoke this skill. Once this skill is loaded, you ARE the orchestrator. Run the pipeline in-place. Never call the Skill tool with brainstorm from inside the brainstorm skill — that creates an infinite loop. If you need to abort, just tell the user and stop.
  2. You orchestrate; subagents generate. Never write ideas in your own voice. Always invoke a subagent.
  3. Parallelism whenever possible. Phase 3a divergent calls MUST be in a single message with N parallel Agent tool uses.
  4. State on disk is the source of truth. Every step updates state/. The dashboard polls these files.
  5. Operators rotate. No two divergent agents in the same round use the same operator.
  6. Judges rotate. No judge persona judges two consecutive tournament rounds.
  7. Pareto, not sum. Never collapse novelty/feasibility/impact into a single scalar for final selection.

Invocation — argument parsing and onboarding

The skill is invoked with a single argument string in $ARGUMENTS. Your goal is to end up with three values: tier, topic, and context_hints. Collect what is already given; ask only for what's missing.

Step 1: Parse $ARGUMENTS

  1. Trim whitespace. Treat empty string as "no args".
  2. First whitespace-delimited token = candidate tier. Lowercase it. If it matches one of instant, quick, standard, deep, marathon, epic, use it as the tier and treat everything after the first space as the topic (preserving spaces, quotes, punctuation).
  3. If the first token is not a valid tier, there was no tier given — the entire $ARGUMENTS is the topic, and tier is initially null (will be asked).
  4. If $ARGUMENTS is empty, both tier and topic are null.

After parsing, context_hints is always null (collected separately below).

Step 2: Ask for missing pieces — in order, one at a time

For each missing piece, ask exactly one question and wait for the user's reply. Use the AskUserQuestion tool when the answer is a small fixed set of options (tier); use plain text questions for free-form input (topic, context).

A. If tier is null — ask with AskUserQuestion:

Question: "How deep do you want this ideation session to go?" Header: "Intensity tier" Options (single select):

  • standard (Recommended) — "~1 hour, 6 personas, 5 rounds, full MAP-Elites archive (8×8) + Elo tournament + adversarial critics. Best balance of depth and time."
  • quick — "5–10 minutes, 3 personas, 2 rounds, small archive (5×5). For a fast survey of the space."
  • deep — "Several hours, 8 personas, 12 rounds, archive 10×10, Pareto front. For serious exploration."
  • instant — "Under 1 minute, 1 persona, 1 round, no archive. Sanity check that the pipeline runs."

For marathon (1 day) and epic (several days), mention them in a footnote of the question description but don't list them as menu options (rare).

B. If topic is null — ask plain text:

"What is the topic? One to three sentences describing what you want to ideate on. Be concrete — name the problem, the actor, and the dimension of interest. Example: 'New ways to combat social isolation among urban elderly people in São Paulo, focusing on interventions that work without requiring smartphones'."

Wait for their reply. Save as topic.

C. ALWAYS — context hints (optional but encouraged) — ask plain text:

"Anything else worth knowing before I start? Paste any context that should shape the session:

  • Constraints (budget, time horizon, ethical limits, regulatory)
  • Audience or stakeholder this is for
  • Approaches you've already tried or want to avoid
  • Approaches you specifically want explored
  • What a great idea would look like in your eyes

Or just reply skip to start with no extra context."

Save the reply as context_hints (empty string if skip).

Step 3: Echo and start

Print one line summarizing the parse:

Starting brainstorm: tier=standard · topic="<topic excerpt>" · context_hints=<short or "none">. Run id: <run_id>. Dashboard will be at http://localhost:8765/dashboard/index.html

Then immediately proceed to Setup. Do not ask for confirmation — the echo is informational.

Where context_hints goes downstream

Pass context_hints to the socratic agent as additional context. The socratic agent should use it (along with the topic) when producing the refined problem statement, the How Might We list, and the constraints/out-of-scope sections. The morphologist also receives it, so it can avoid axes that conflict with stated constraints.

Tier configuration

Load from this table (also at ${CLAUDE_PLUGIN_DIR}/skills/brainstorm/tiers.json):

tierpersonas Nrounds Roperators/roundarchivetournament
instant112 fixed (SCAMPER, analogy)offtop-3
quick3245×5top-5
standard6568×8Elo 30
deep8128 (cycling)10×10Elo 100 + Pareto
marathon123010 (cycling)12×12 + Boden every 10Elo 300 + adversarial
epic16100full set16×16 + Boden every 20Elo 1000

For tiers deep, marathon, epic — confirm with the user once that they understand it runs long and that they should keep the session open or use background mode.

Setup

  1. Generate run_id = YYYYMMDD-HHMMSS-<slug-of-topic> (slug = first 4 lowercase words, hyphenated).
  2. Run dir: ./brainstorm-runs/${run_id}/. Create subdirs state/, checkpoints/.
  3. Copy ${CLAUDE_PLUGIN_DIR}/dashboard/ → ./brainstorm-runs/${run_id}/dashboard/ (or symlink on Unix).
  4. Initialize state files (all in state/):
    • status.json with {run_id, tier, topic, phase: "setup", round: 0, agents: [], ideas_count: 0, started_at}
    • Empty ideas.jsonl, events.jsonl
    • axes.json (filled by morphologist)
    • personas.json (filled by persona-forge)
    • archive.json {cells: {}, coverage: 0}
    • clusters.json, elo.json, pareto.json
  5. Verify MCP server brainstorm-tools is available: call mcp__brainstorm-tools__health() (if absent, skip QD features and warn user — degraded mode).
  6. Launch dashboard server in background: Bash(run_in_background=true) running cd brainstorm-runs/${run_id} && python -m http.server 8765. Print URL: http://localhost:8765/dashboard/index.html?run=${run_id}.

Pipeline

Phase 0 — Socratic clarify

Invoke socratic agent with the raw topic. It returns:

  • 3–5 "How Might We" reformulations
  • Constraints / scope
  • A refined problem statement

Save in state/problem.json. Append event phase_completed: socratic.

Phase 1 — Morphological decomposition

Invoke morphologist agent with the refined problem statement. It returns:

  • 4–8 orthogonal axes (e.g., mechanism, user, time-horizon, ethics-stance)
  • 4–8 values per axis
  • A justification of orthogonality

Save in state/axes.json. This is the MAP-Elites behavior descriptor.

Call MCP archive_init(axes) to initialize the archive grid.

Append event axes_defined.

Phase 2 — Persona forge

Invoke persona-forge agent with the problem and axes. It returns N personas (per tier table), each with:

  • name, profession, age, culture, cognitive style
  • 5–8 turn interview transcript (Q/A) anchoring the persona
  • one "blind spot" the persona has
  • a bias_vector (3 keywords)

Verify orthogonality: call MCP embed_batch([persona_descriptions]) and ensure pairwise cosine < 0.7. If any pair fails, ask persona-forge to regenerate the violating ones.

Save in state/personas.json.

Phase 3 — Ideation rounds (loop R times)

For each round r in 1..R:

3a. Divergent generation (parallel)

In one message, invoke N divergent agents in parallel. Each call passes:

  • the persona JSON
  • a distinct operator (assignment below)
  • the round number
  • the current state/axes.json
  • (round ≥ 2) the top-3 ideas from the previous round as inspiration (rotated so no agent sees its own)
  • a target "cell hint": the MCP archive_suggest_underfilled() returns the most under-explored cell coordinates; pass these to at least half the agents

Operator assignment per round (rotate):

Operators pool
SCAMPER (one letter at random)
PO lateral provocation
Random stimulus (oblique strategy card + random Wikipedia concept)
Remote analogy (sample remote domain from a list)
Worst-possible-idea + inversion
Crazy 8s (8 ideas, no category overlap)
Verbalized sampling (distribution with probabilities)
Cell-sample (forced cell coordinates)

The full operators are in ${CLAUDE_PLUGIN_DIR}/skills/brainstorm/operators/. Each divergent agent reads its assigned operator file plus its persona, then writes 3–6 candidate ideas to its own scratch file state/round_${r}/div_${i}.json.

After all return, you (orchestrator) merge candidates into ideas.jsonl, calling for each idea:

  1. MCP embed(text) → embedding
  2. MCP archive_place(idea_id, embedding, descriptor) → cell + decision (new | replaced | rejected_dominated)
  3. Append event idea_created with id, agent, operator, parents (if any), cell

Update status.json ideas_count and coverage_pct.

3b. Cluster + KJ

Call MCP cluster_all() → returns HDBSCAN cluster IDs. Then invoke synthesizer agent in cluster naming mode: passes a sample of 3 ideas per cluster, returns a 2–4 word name per cluster. Save state/clusters.json. Emit clusters_updated event.

3c. Adversarial critique

For each of the top-3 ideas per cluster (by current Elo or, in round 1, by archive score):

Invoke critic-black-hat and critic-minority in parallel (one Agent message). Each returns:

  • 2–3 concrete weaknesses
  • a "kernel of value" that survives the critique
  • an optional improvement_suggestion text

Append critiques to the idea's record (not deleting the idea). Append events idea_critiqued per critic.

3d. Evolution

Invoke divergent agent again in evolution mode for K=N/2 operations:

  • ½ are crossovers: pick two ideas from different clusters with high mutual novelty, ask the agent to produce a coherent hybrid
  • ½ are mutations: pick a high-novelty idea + a SCAMPER operator

New ideas go through the same embed → archive → cluster pipeline.

Boden transformation trigger: if coverage_pct didn't increase by ≥5% over the round AND the tier supports it (deep+), invoke morphologist in transform mode with current axes + saturation info. It proposes new axes. Reinitialize archive (preserve old as archive_v${n}.json). Emit axes_transformed event.

3e. Tournament round

Sample min(2N, 30) random pairs from the current archive. Invoke judge agent for each pair (parallel batches of 5). Each judge is seeded with a rotating judge persona sampled from ${CLAUDE_PLUGIN_DIR}/skills/brainstorm/judge_personas.json so no persona judges two consecutive rounds.

Judge returns {winner, loser, novelty_a, novelty_b, feasibility_a, feasibility_b, impact_a, impact_b, rationale}.

Update Elo with K=24 (standard) or K=16 (deep+ for stability). Save to state/elo.json. Emit tournament_results event.

Checkpoint

Save state/checkpoints/round_${r}.json with the full state snapshot. Emit round_completed.

Phase 4 — Pareto front

For all ideas with Elo > median, ask MCP pareto_front(ids, axes=[novelty, feasibility, impact]). Save state/pareto.json. Emit pareto_extracted.

Phase 5 — Meta-review and design docs

Invoke synthesizer agent (model: opus) in meta-review mode. Inputs:

  • state/pareto.json (Pareto candidates)
  • top 3 archive cells by Elo
  • the structural-gap report from MCP coverage_gaps()

It produces FINAL_REPORT.md:

  1. Executive summary (5 sentences)
  2. Top K=min(7, len(pareto)) ideas, each: title, 1-line essence, novelty/feasibility/impact rationale, 3-paragraph design sketch
  3. Map of the design space explored (which axes saturated, which gaps remain)
  4. Recommended next steps if user wants to extend the session

Save to ./brainstorm-runs/${run_id}/FINAL_REPORT.md and emit final_report.

Also generate a static dashboard_snapshot.html from the dashboard using Bash (a small helper that copies the live dashboard and embeds state as inline JSON, so it survives the run dir being moved).

State file schemas

All schemas in ${CLAUDE_PLUGIN_DIR}/skills/brainstorm/schemas.md. Critical:

  • ideas.jsonl: one JSON object per line with fields id, round, agent, persona, operator, parents, text, rationale, embedding_id, archive_cell, novelty_score, feasibility_score, impact_score, elo, status, ts
  • events.jsonl: append-only timeline. Types: idea_created, idea_merged, idea_bifurcated, idea_promoted, idea_critiqued, round_started, round_completed, agent_started, agent_completed, phase_transition, axes_transformed, tournament_result, clusters_updated, pareto_extracted, final_report
  • status.json: live snapshot for the dashboard, atomic-write only (write tmp + rename)
  • archive.json: MAP-Elites grid as {axes: [...], cells: {"i,j,...": {idea_id, score}}, coverage: 0..1, transformations: []}

Updating status.json and events.jsonl

You must update these continuously:

  • Append a JSON line to events.jsonl for every meaningful state change
  • Rewrite status.json atomically every time you change phase, round, agents[] activity, ideas_count, coverage_pct, or top_ideas

The dashboard polls status.json every 1.5s and tails events.jsonl every 0.8s. Keep events short.

Reusable subroutines

Agents activity feed

Whenever you invoke an Agent call, BEFORE the call: append agent_started. AFTER: append agent_completed.

Atomic write

For any state file F: write to F.tmp, then rename to F. (Bash: mv F.tmp F)

Avoid double-counting

ideas_count is wc -l state/ideas.jsonl (use Bash to compute, but only after big batches).

Error handling

  • If MCP brainstorm-tools is down at any point: degrade to verbal archive (you compute coverage via LLM judgment) and warn user once. Keep going.
  • If a subagent returns malformed JSON: retry up to 2 times with a stricter prompt. After 3 failures, log to state/errors.jsonl and continue with what you have.
  • If Bash background dashboard server fails: emit a warning event and continue. The user can run python -m http.server 8765 manually in the run dir.

Finishing

Print to user (only at the end):

Run complete: {run_id}
Top {K} ideas saved to brainstorm-runs/{run_id}/FINAL_REPORT.md
Live dashboard: brainstorm-runs/{run_id}/dashboard/index.html
Static snapshot: brainstorm-runs/{run_id}/dashboard_snapshot.html

Do not print every idea inline — they are in the report.

Keep looking

Skills are one crate of 628,853. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.