skills/jam-brainstorm-facilitator/SKILL.md
Role-plays as focus group personas and synthesizes brainstorming discussions. Use when: brainstorming, ideation, running a full jam session with evidence gathering, discussion rounds, and decision record storage — dispatched by the wicked-garden-jam skill's brainstorm sub-action.
npx skillsauth add mikeparcewski/wicked-garden wicked-garden-jam-brainstorm-facilitatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You orchestrate brainstorming sessions with dynamic focus groups.
Guide structured brainstorming through:
The dispatcher gives you: topic (required), and optionally personas,
rounds (default 2-3), and convergence_mode (normal | fast, default
normal).
Track the session as a native task (fail open on any tool errors):
TaskCreate(subject='Jam: {topic}', metadata={'event_type':'task','chain_id':'jam-{topic-slug}.root','source_agent':'jam-facilitator','initiative':'{topic-slug}'})TaskUpdate(taskId, description='append: {persona_name}: {key_insight}' / 'Synthesis: {summary}' / 'Decision: {decision_record}')Continue storing outcomes in wicked-brain:memory (native task = process, brain memory = outcome).
Before assembling personas, gather real evidence from the ecosystem:
Step 1a: Recall past decisions (if wicked-brain available)
Skill(
skill="wicked-brain:memory",
args="recall \"past decisions related to: {topic}\" --filter_type decision"
)
This surfaces: "Last time we discussed caching, we chose Redis because of X. Outcome: validated."
Step 1b: Gather code evidence (if code-related topic)
Use Grep or wicked-garden:search to find relevant code patterns, existing implementations, or blast radius.
This surfaces: "There are 3 existing cache implementations in the codebase using pattern X."
Step 1c: Check past brainstorm outcomes (if wicked-brain available)
Skill(
skill="wicked-brain:memory",
args="recall \"brainstorm outcomes tagged jam,outcome\" --filter_type decision"
)
This surfaces: "2 past decisions on similar topics: 1 validated, 1 modified."
Step 1d: Compile evidence summary (max 500 words) Format gathered evidence as a structured brief:
## Evidence Brief
- **Past decisions**: {list of relevant decisions with outcomes}
- **Code context**: {existing implementations, patterns, blast radius}
- **Past outcomes**: {what worked/failed in similar decisions}
If no ecosystem plugins available, skip evidence gathering and proceed with opinion-only debate (current behavior).
Step 1e: Understand the topic
Generate 4-6 relevant personas based on topic. Inject evidence brief into each persona's context so they argue from data, not just opinions.
Archetype Pool:
| Archetype | Personas | |-----------|----------| | Technical | Architect, Debugger, Optimizer, Security Reviewer | | User-Focused | Power User, Newcomer, Support Rep, Accessibility Advocate | | Business | Product Manager, Skeptic, Evangelist, Cost Optimizer | | Process | Maintainer, Tester, Documentarian, Release Manager |
Select personas that:
For a deeper problem-type → persona map (architecture, product scope, process,
creative, risk, greenfield) and facilitation anti-patterns, read
${CLAUDE_PLUGIN_ROOT}/skills/jam/refs/facilitation-patterns.md.
Run 2-3 rounds (configurable). After EACH round, perform a convergence check before proceeding to the next round.
Evaluate three criteria:
If all three are YES and the convergence mode is fast: skip remaining rounds and proceed directly to synthesis. This is the expected outcome for fast convergence -- do not add rounds just because they were planned.
If all three are YES and the convergence mode is normal: note early convergence but continue planned rounds (they may still add value).
If any are NO: continue to the next round as planned.
Round 1: Initial Perspectives Each persona shares their view:
**[Persona Name]** ({archetype})
{Their perspective, concerns, suggestions}
[Convergence check — proceed to synthesis if fast mode and criteria met]
Round 2: Building & Responding Personas respond to each other:
**[Persona Name]**
Building on [Other]'s point about X, I think...
I disagree with [Other] because...
[Convergence check — proceed to synthesis if fast mode and criteria met]
Round 3 (optional): Convergence Find common ground and remaining tensions.
After each round, persist transcript entries for the session record. After all rounds are complete, run the following script once to store the full transcript:
sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/jam/save_transcript.py" \
--session-id "{session_id}" \
--entries '{json_array_of_entries}'
Each entry in the JSON array must match this schema:
{
"session_id": "{session_id}",
"round": 1,
"persona_name": "Technical Architect",
"persona_type": "technical",
"raw_text": "...",
"thinking": "...",
"timestamp": "{ISO timestamp}",
"entry_type": "perspective"
}
persona_type is one of: technical, user, business, process.
When recording persona contributions, include a thinking field capturing the persona's deliberative process — alternatives they considered, uncertainties they weighed, trade-offs they evaluated — before their final stated position in raw_text. The thinking field is optional; omit it for synthesis and council_response entries.
After synthesizing (step 4), append one final entry with entry_type: synthesis, round: 0, persona_name: Facilitator, and raw_text set to the full synthesis markdown.
If the script is unavailable, skip transcript storage silently and continue.
After each round, emit an event to the unified event log for cross-domain visibility:
sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" -c "
import sys; sys.path.insert(0, '${CLAUDE_PLUGIN_ROOT}/scripts')
from _event_store import EventStore
EventStore.ensure_schema()
EventStore.append(
domain='jam',
action='rounds.{round_number}.completed',
source='sessions',
record_id='{session_id}',
payload={'round': {round_number}, 'personas': {persona_count}, 'topic': '{topic_summary}'},
tags=['jam-round'],
)
"
After synthesis, emit a synthesis event:
sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" -c "
import sys; sys.path.insert(0, '${CLAUDE_PLUGIN_ROOT}/scripts')
from _event_store import EventStore
EventStore.ensure_schema()
EventStore.append(
domain='jam',
action='sessions.synthesized',
source='sessions',
record_id='{session_id}',
payload={'topic': '{topic}', 'insights_count': {N}, 'confidence': '{HIGH/MEDIUM/LOW}'},
tags=['jam-synthesis'],
)
"
If event emission fails, skip silently — it is supplementary, not required.
Also emit to wicked-bus (additive — both EventStore and bus).
Payload rules: IDs + counts + outcomes only — never persona dialogue, thinking text, or full prompts. Truncate any topic field to the first 80 characters before emitting.
At session start (emit expected_persona_count so the synthesis-trigger consumer knows when Round 1 is complete):
sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/_bus_emit.py" wicked.garden.session.started '{"session_id":"{session_id}","topic":"{topic_truncated_80}","persona_count":{N},"expected_persona_count":{N}}' 2>/dev/null || true
After each Round 1 persona contributes (fire once per persona; Round 2 and beyond must NOT emit this event):
sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/_bus_emit.py" wicked.garden.persona.contributed '{"session_id":"{session_id}","persona_name":"{persona_name}","round":1,"expected_persona_count":{N}}' 2>/dev/null || true
After synthesis:
sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/_bus_emit.py" wicked.garden.session.synthesized '{"session_id":"{session_id}","insight_count":{N},"duration_secs":{D}}' 2>/dev/null || true
expected_persona_count equals the number of personas chosen in step 2 (Persona Assembly). Record it in the jam session object when the session is first created so downstream consumers can resolve it even if they missed the started event.
After rounds complete, synthesize:
## Key Insights
1. **[Insight]** - {HIGH|MEDIUM|LOW} confidence
- Supporting evidence from discussion
- Caveats or conditions
## Action Items
1. [Prioritized action]
2. [Next steps]
## Open Questions
- [Unresolved tension or question]
For synthesis techniques (non-obvious connection, surprising agreement,
productive tension, missing voice) and the quality checklist, read
${CLAUDE_PLUGIN_ROOT}/skills/jam/refs/synthesis-patterns.md.
After the final persona round, if an external CLI (gemini, codex) is installed:
Skip this step if no external CLIs are available. This is graceful enhancement, not required.
After synthesis, automatically store a structured decision record:
Skill(skill="wicked-brain:memory", args="store \"Decision: {topic}\nChosen: {recommended option from synthesis}\nRationale: {key reasoning}\nAlternatives considered: {other options}\nConfidence: {HIGH/MEDIUM/LOW}\nEvidence used: {summary of evidence brief}\nPersonas: {list of personas}\" --type decision --tags \"jam,decision,{2-3 topic keywords}\" --importance high")
This creates organizational memory — every brainstorm becomes a searchable, recallable decision record.
Put synthesis FIRST (context efficiency):
## Brainstorm: {Topic}
### Key Insights
{Synthesis first - most important info}
### Action Items
{What to do next}
### Open Questions
{Unresolved items}
---
### Discussion Summary
#### Round 1
{Brief summary}
#### Round 2
{Brief summary}
### Personas
{Who participated}
Forked-context worker, reachable two ways:
wicked-garden-jam-brainstorm-facilitator (used by the wicked-garden-jam skill's brainstorm sub-action).subagent_type: compat key —
Task(subagent_type="wicked-garden:jam:brainstorm-facilitator") maps to this fork skill.development
Pattern-conformance agent-half: evaluates a produced artifact or diff against a set of architectural/design pattern rules from the conformance-rule store (wicked_governance schema). Returns structured findings with rule ID, severity, and rationale — the deterministic half (mechanical rule recall) is done by the guard pipeline; this is the semantic evaluation step. Triggered by: the guard_pipeline `outgov_pattern` check (session-close), or explicitly by an engineering review when WICKED_OUTGOV_RULES_DIR is populated. NOT a replacement for the full `engineering` review skill — focuses only on conformance to stored Pattern rules; architecture and code-quality checks live in the `engineering` skill. Semantic evaluation reuses `wicked-garden-qe-semantic-reviewer` as the designated agent-half evaluator (per garden#983 spec). This skill is the orchestrating wrapper that loads applicable Pattern rules and delegates the per-rule semantic judgment to qe-semantic-reviewer.
tools
The FOUNDATIONAL domain-model capability: extract a codebase's domain — testable business rules (with confidence + provenance), entities, requirements — as a schema-conformant model on the estate graph. The workers annotate the store; wicked-core reads it and builds the requirements graph, coverage-gating fail-closed. Steers three fork workers. A shared substrate, not a modernization tool. The `modernize` archetype DERIVES from it; build / migrate / review / specify / explore consume the SAME domain model — none OWN it. Understanding a codebase's domain is upstream of almost everything else garden does. Use when: "extract the business rules / domain model from this codebase", "build a requirements graph from the code", "what does this system actually require", "reverse-engineer the domain before we build/port/migrate". Works on ANY codebase (modern or legacy) — the value is the domain model, not the porting. NOT the code transform itself (that is the archetype consuming this model). This skill produces the DOMAIN MODEL, not new code.
development
Domain-graph fork worker for the modernize archetype. Groups the estate's Louvain communities into business domains, attaches each requirement to its cluster (advisory cluster_id provenance), and invokes wicked-core's domain-graph build (which reads the annotated estate store, recomputes coverage fail-closed, and builds the requirements graph) — then validates core's output against the vendored schema. Use when: dispatched by wicked-garden-domain after rule extraction to turn a flat rule set into cluster-keyed domains; "group these into domains", "build the requirements graph", "translate clusters into a domain model". NOT for mining the rules themselves (that is domain-extractor) or threat-modeling (that is domain-coverage).
tools
Rule-extraction fork worker for the FOUNDATIONAL domain-model capability. Mines testable business rules from a codebase — each with a numeric confidence and a provenance{source, ref, source_kinds} — and annotates them into the estate store so wicked-core can build the domain-model requirements graph (coverage-gated). This is a substrate, not a modernization tool: the `modernize` archetype DERIVES from it, and build / migrate / review / specify / explore can consume the same domain model — none OWN it. Use when: dispatched by wicked-garden-domain to mine the business_rules of a codebase (or a module); "extract the domain rules", "what does this system require", building the requirements half of a domain model. NOT for grouping into domains (that is domain-modeler) or judging coverage (that is domain-coverage — a seat-distinct evaluator).