skills/counsel/SKILL.md
Multi-agent AI board meeting. 12 advisors debate your decision from different philosophical frameworks. Interactive HTML UI with real-time roundtable visualization. Use when facing high-uncertainty decisions.
npx skillsauth add shanezhong/skills counselInstall 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.
Multi-agent decision support system inspired by jiangjiax/counsel. 12 advisors examine your decision from fundamentally different angles using Nominal Group Technique (parallel, invisible generation), structured debate, and synthesis. Results displayed in an interactive browser UI in real-time.
Single source of truth: ~/.claude/skills/counsel/advisors.json (served at GET /api/advisors). The list includes Steve Jobs, Paul Graham, Jeff Bezos, Elon Musk, Warren Buffett, Ray Dalio, Charlie Munger, Kevin Kelly, Marc Andreessen, Naval Ravikant, Peter Thiel, Albert Einstein. Read advisors.json when spawning agents to get exact persona framings — don't duplicate the list inline.
~/.claude/skills/counsel/
├── SKILL.md (this file — instructions)
├── advisors.json (SSOT for advisor personas)
├── server.py (HTTP server + SSE)
└── templates/
└── index.html (interactive SPA frontend)
Session state (written by server, read/displayed by UI):
counsel-sessions/[date]-[slug]/
├── session.json (progressive session state)
├── server.pid (server process PID)
└── server.url (http://localhost:<port>)
counsel-sessions/YYYY-MM-DD-[slug]/SESSION_DIR="counsel-sessions/YYYY-MM-DD-[slug]"
/Users/shane/Documents/playground/.venv/bin/python3 ~/.claude/skills/counsel/server.py --session "$SESSION_DIR" > "$SESSION_DIR/server.log" 2>&1 &
for i in 1 2 3 4 5; do [ -f "$SESSION_DIR/server.url" ] && break; sleep 0.5; done
URL=$(cat "$SESSION_DIR/server.url")
open "$URL"
curl calls should target $URL (not a hard-coded localhost:8787). Export it once and reuse:
export COUNSEL_URL="$URL"
Every message in the terminal conversation must be synced to the UI's chat panel. After each facilitator message or user response, POST via curl -sf (the -f makes curl fail on HTTP errors so you notice):
curl -sf -X POST "$COUNSEL_URL/api/update" -H 'Content-Type: application/json' \
-d '{"type":"chat","data":{"role":"facilitator","text":"YOUR MESSAGE"}}'
Roles: facilitator (you), user (their reply), system (stage transitions like "Moving to advisor statements...").
You are the Facilitator. Your role is process-only — never inject content opinions.
chat event.init event:
curl -sf -X POST "$COUNSEL_URL/api/update" -H 'Content-Type: application/json' \
-d '{"type":"init","question":"THE DECISION QUESTION","timestamp":"YYYY-MM-DD"}'
advisors.json — read it at startup.advisor_question event:
curl -sf -X POST "$COUNSEL_URL/api/update" -H 'Content-Type: application/json' \
-d '{"type":"advisor_question","data":{"advisor_id":"jobs","question":"THE QUESTION"}}'
Note on real-time UI: Claude Code collects all 12 parallel Agent() results before returning control to you, so UI updates arrive in a batch after each parallel phase — not truly one-by-one. The SSE/roundtable stack is still correct; this is just a UX caveat to set expectations.
This step MUST use true parallel generation with mutual invisibility.
Spawn 12 Agent() calls in a single message (model: sonnet). Each agent receives:
advisors.json)After each advisor returns, POST to server:
curl -sf -X POST "$COUNSEL_URL/api/update" -H 'Content-Type: application/json' \
-d '{"type":"advisor_statement","data":{"advisor_id":"ID","stance":"SUPPORT|AGAINST|CONDITIONAL","summary":"ONE LINE","statement":"FULL TEXT"}}'
The server dedupes by advisor_id — re-POSTing the same advisor replaces the earlier entry (safe to retry on failure).
As Facilitator, analyze the 12 statements and extract 3-5 conflict dimensions where advisors genuinely disagree.
POST dimensions:
curl -sf -X POST "$COUNSEL_URL/api/update" -H 'Content-Type: application/json' \
-d '{"type":"dimensions","data":["Dimension 1 description","Dimension 2 description","Dimension 3 description"]}'
Present them to the user: "These are the fault lines. Which 2-3 do you want to deep-dive?"
For each selected dimension, spawn a debate round:
curl -sf -X POST "$COUNSEL_URL/api/update" -H 'Content-Type: application/json' \
-d '{"type":"debate","data":{"dimension":"THE DIMENSION","title":"SHORT TITLE","messages":[{"advisor_id":"ID","text":"ARGUMENT"}]}}'
Then spawn a Pre-Mortem agent (model: sonnet): "Assume this decision has already failed spectacularly 2 years from now. What went wrong? Be specific — name the failure mode, the timeline, and the early warning signs that were ignored."
POST pre-mortem:
curl -sf -X POST "$COUNSEL_URL/api/update" -H 'Content-Type: application/json' \
-d '{"type":"premortem","data":{"text":"THE PRE-MORTEM SCENARIO"}}'
Produce a final synthesis and POST:
curl -sf -X POST "$COUNSEL_URL/api/update" -H 'Content-Type: application/json' \
-d '{"type":"synthesis","data":{"consensus":"WHERE ADVISORS AGREE","tensions":"UNRESOLVED DISAGREEMENTS","actions":["Action 1","Action 2","Action 3"],"verdict":"FINAL RECOMMENDATION"}}'
The UI unlocks the Synthesis tab and displays the full results.
After the session is complete, stop the background server using the PID file:
[ -f "$SESSION_DIR/server.pid" ] && kill "$(cat "$SESSION_DIR/server.pid")" 2>/dev/null || true
(Do NOT use kill %1 — each Claude Code Bash call is a separate shell, so job IDs don't persist between calls.)
-sf: Always use curl -sf so HTTP errors surface. If a POST fails, do NOT proceed silently — the server validates body shape and returns 400 on malformed input.tools
Replace with description of the skill and when Claude should use it.
documentation
Find one fresh YouTube AI interview/podcast video matching strict editorial criteria, intended as the source for a blog post (substack-writer Step 1). Use when the user says "find a YouTube video for today's blog", "find an AI interview video", "auto-pick a video for substack-writer", or runs the daily content cron. Filters by duration, upload month, dedup against previously used videos, then the agent picks one with reasoning.
development
Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like "the xlsx in my downloads") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.
tools
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.