claude/council/skills/council/SKILL.md
Use when the user asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis. Bare invocations use `core` profile auto-detect; explicit `auto` selects the best-fit 6 personas from the sourced 27-persona engineering and UX roster. Users can still pin `core`, `core-eng`, `core-ux`, `core-mix`, `all`, or `debate`.
npx skillsauth add smykla-skalski/sai councilInstall 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.
Summon engineering persona agents to review code, debate a plan, or advise on strategy. Each persona is built from the writer's primary public corpus (essays, talks, books). Personas argue from their actual positions, with their actual phrases and evidence. They will disagree with each other.
Generic AI review drifts to safe, hedged, template-shaped output. Opinionated persona agents pull responses out of that middle. Each persona is sharp in one direction and blind in others - the council's value is the combination of their disagreements.
| Mode | Keyword | Agents Summoned | Cost & purpose |
|----------|----------|----------------------------------|----------------|
| Core | core or no keyword | 6 personas, profile auto-picked from problem text (eng / ux / mix) | Default compatibility preset. ~6 persona calls + 1 synthesis. Profile is selected by content heuristics; user can pin one with core-eng, core-ux, or core-mix. |
| Auto | auto | 6 best-fit personas selected from the full roster | Explicit best-fit mode when the user has not already chosen an engineering/UX group. Selects by problem evidence, not broad preset. |
| Core (engineering) | core-eng (alias eng) | 6 engineering bias-correction personas | Pin when the problem is code, architecture, refactor, perf, protocol, infra, ops. |
| Core (UI/UX) | core-ux (alias ux) | 6 UI/UX bias-correction personas | Pin when the problem is interaction design, layout, dashboard, accessibility, usability test, visual density. |
| Core (mixed) | core-mix (alias mix, random) | 3 engineering + 3 UX personas | Pin when the surface is a feature shipping both code and UI - the mix forces both lenses in one pass. |
| All | all | All 27 personas (6 engineering core + 6 UX core overlap + 10 extended domain + 11 extended UX/platform) | ~27 persona calls + 1 wider-context synthesis (~4.5x core cost). Use when the problem touches multiple domains (type design, deployment, observability, perf at scale, UX, accessibility, motion, macOS-platform craft) in one review and you want every lens. Reserve for substantial designs. |
| Debate | debate | 3-6 personas you select for the topic | ~3-6 calls per round x 3 rounds + 1 synthesis. Multi-round - personas read each other's positions and respond. Use for hard tradeoff calls where disagreement is the point. |
$ARGUMENTSApply this algorithm in order:
eng -> core-eng, ux -> core-ux, mix -> core-mix, random -> core-mix.auto, core, core-eng, core-ux, core-mix, all, or debate: set mode to that value and problem to the remainder of $ARGUMENTS.mode to core and problem to the full $ARGUMENTS.problem (after trimming) begins with @, treat the rest of that token as a file path and use Read on it - the file contents become the problem context. Any text after the @<path> token is appended as additional framing.mode == auto, run Auto persona selection. Tell the user which personas you picked and why in one compact sentence before spawning.mode == core, run Core profile auto-detect to resolve to one of core-eng, core-ux, or core-mix. Tell the user which profile you picked and why in one sentence before spawning, so they can override on the next call.Use this only for explicit /council auto <problem>. Do not ask the user to choose eng, ux, or mix unless the request is too ambiguous to review at all.
Select exactly 6 personas from the full roster:
eidhof-swiftui-reviewer, ash-cocoa-runtime-reviewer, and king-type-reviewer before generic UX personas, then fill the remaining slots with complementary lenses. CI/oncall rollout risk should select cicd-build-advisor, hebert-resilience-reviewer, and tef-deletability-reviewer, then add the three next most useful risk lenses.all unless the user asked for breadth. Pick the 6 most likely to change the recommendation and mention the omitted coverage in synthesis.antirez-simplicity-reviewer, tef-deletability-reviewer, hebert-resilience-reviewer, meadows-systems-advisor, chin-strategy-advisor, norman-affordance-reviewer, nielsen-heuristics-reviewer, or watson-a11y-reviewer) unless the request is a narrow specialist audit.Auto-selected <persona list> because <specific evidence>.Useful auto shortcuts:
If several shortcuts match, merge them, dedupe personas, and trim or fill to exactly 6 by asking: "which persona would change the final recommendation?"
Use this only when the user explicitly invokes core.
Score the problem text (file contents + framing) against two cue sets:
UX cues: ui, ux, view, screen, sidebar, toolbar, button, menu, window, sheet, tab, dashboard, chart, layout, typography, color, contrast, animation, motion, transition, easing, swiftui, appkit, cocoa, accessibility, a11y, voiceover, screen reader, wcag, aria, focus, keyboard navigation, affordance, usability, recording, figma, mockup, interaction, tooltip, hover, drag, gesture.
Engineering cues: refactor, architecture, module, crate, package, function, class, struct, actor, protocol (in code-design sense), api, endpoint, schema, migration, database, sql, query, cache, lock, thread, concurrency, async, await, goroutine, tokio, performance (in CPU/memory/throughput sense), latency (system), throughput, pipeline, ci, cd, deploy, kubernetes, terraform, helm, oncall, incident, dependency, lint, test (unit/integration), mock, fuzz, tla+.
Apply file path hints first - they're the strongest signal. *.swift, *.css, *.html, and UI source paths (e.g. apps/<name>/Sources/...) bias toward UX; *.rs, *.go, Cargo.toml, Dockerfile, *.tf bias toward engineering. Treat each path hint as adding 2 to the matching side's score so it can outweigh stray cue keywords in framing prose.
Then resolve in this order - check each rule in turn and stop on the first match:
both halves, backend + UI, code and UI, crate and SwiftUI, API and view, frontend and backend, server and client - pick core-mix. The user is telling you the surface is dual; respect that intent over keyword arithmetic.core-mix. Two cues on each side means the problem genuinely touches both lenses; mix forces both into the review without paying for all.core-ux. If engineering score > UX score, pick core-eng.core-mix and tell the user the auto-detect found nothing concrete so it's hedging.Why this order: the explicit framing rule (#1) catches the case where the user has already done the classification work in their prose - silently overriding that with keyword counts is hostile. The threshold rule (#2) catches the case where prose doesn't say "both halves" but the cues do. The strict-comparison rule (#3) only fires when one side is clearly thin or absent. The all-zero fallback (#4) is the last resort and must be transparent so the user knows nothing matched.
Never silently fall back to core-eng - that hides the choice from the user. Bare invocations use core profile auto-detect; explicit auto uses the 6-person best-fit roster.
Located in agents/. Each persona is a self-contained subagent with its own system prompt, voice, philosophy, and review questions. The canonical registry (with full person/lens/dossier mapping and the "what each persona is good at catching" symptom map) lives in references/personas.md; the tables below are a quick-reference convenience for selection.
| Persona | Lens | |---------|------| | antirez-simplicity-reviewer | Code as artifact, design sacrifices, comments-pro, lazy-evaluation, hack value | | tef-deletability-reviewer | Easy to delete > easy to extend, anti-naive-DRY, protocol over topology | | muratori-perf-reviewer | Semantic compression, performance from day one, anti-Clean-Code-orthodoxy | | hebert-resilience-reviewer | Operability, supervision trees, complexity has to live somewhere, sociotechnical resilience | | meadows-systems-advisor | 12 leverage points, stocks/flows/loops, intervene at the right level | | chin-strategy-advisor | Tacit knowledge, NDM, anti-framework-cult, close the loop |
| Persona | Lens | |---------|------| | norman-affordance-reviewer | Affordances vs signifiers, mappings, mental models, seven stages of action, error mode design | | nielsen-heuristics-reviewer | 10 Usability Heuristics, severity rating 0-4, discount usability, 5-users finding | | krug-usability-reviewer | Don't make me think, muddling through, three laws, trunk test, recording-as-usability-test | | watson-a11y-reviewer | Lived screen-reader experience, semantic HTML over ARIA, accessible-name computation, focus order | | tognazzini-fpid-reviewer | First Principles of Interaction Design, Fitts's law, anticipation, latency, autonomy, protect user's work | | tufte-density-reviewer | Data-ink ratio, chartjunk, sparklines, small multiples, "above all else show the data" |
| Persona | Lens | |---------|------| | antirez-simplicity-reviewer | Engineering simplicity / design sacrifices | | tef-deletability-reviewer | Deletability / anti-DRY / protocol over topology | | hebert-resilience-reviewer | Operability / failure modes / sociotechnical resilience | | norman-affordance-reviewer | Affordances / mental models / error mode design | | nielsen-heuristics-reviewer | 10 Usability Heuristics / severity rating | | watson-a11y-reviewer | Lived a11y / semantic structure / focus order |
The mixed core is opinionated about the split. It picks the three engineering personas that most reliably catch product-level over-engineering (antirez, tef, hebert) and the three UX personas that most reliably catch product-level usability and a11y debt (norman, nielsen, watson). For deeper UI surface review use core-ux; for deeper code review use core-eng; for both at full strength use all.
all mode and debate selection| Persona | Lens | |---------|------| | king-type-reviewer | Parse-don't-validate, totality, make illegal states unrepresentable, types as axioms | | hughes-pbt-advisor | Property-based testing, generators not examples, shrinking is the value, stateful PBT | | evans-ddd-reviewer | Ubiquitous language, bounded contexts, strategic design, distill the core domain | | fp-structure-reviewer | Impureim sandwich, dependency rejection, railway-oriented programming, code that fits in your head | | wayne-spec-advisor | Formal methods, TLA+, model-check the protocol, the spec is the design | | iac-craft-reviewer | Immutable infrastructure, drift detection, pipeline IS the change-management process, phoenix not snowflake | | test-architect | Functional core/imperative shell, values not objects, boundaries, tests as design pressure | | gregg-perf-reviewer | USE method, methodology over tools, profile in production, off-CPU and BPF observability | | ai-quality-advisor | Prompt injection, eval-driven LLM development, lethal trifecta, sandboxed tool use | | cicd-build-advisor | Test in production, observability over monitoring, deploy small deploy often, oncall as cultural force |
| Persona | Lens | |---------|------| | eidhof-swiftui-reviewer | SwiftUI declarative discipline, view identity, state ownership, environment over singletons, value semantics | | ash-cocoa-runtime-reviewer | Cocoa runtime mechanics, ARC retain/release, GCD edge cases, NSRunLoop, blocks, Swift bridging cost | | simmons-mac-craft-reviewer | Mac app craft, "feels like a real Mac app", lifecycle finesse, multi-window, sandbox vs HIG, ship-it-small | | norman-affordance-reviewer | Affordances vs signifiers, mappings, mental models, seven stages of action, error mode design | | tognazzini-fpid-reviewer | First Principles of Interaction Design, Fitts's law, anticipation, latency, autonomy, protect user's work | | krug-usability-reviewer | Don't make me think, muddling through, three laws, trunk test, recording-as-usability-test, three-users-a-month | | nielsen-heuristics-reviewer | 10 Usability Heuristics, severity rating 0-4, discount usability, 5-users finding, thinking-aloud protocol | | watson-a11y-reviewer | Lived screen-reader experience, semantic HTML over ARIA, accessible-name computation, focus order, four rules of ARIA | | head-motion-reviewer | Motion has purpose, easing curves, timing budgets 200-500ms, vestibular safety, prefers-reduced-motion | | siracusa-mac-critic | Mac platform critique, AppKit/Cocoa appreciation, backwards compatibility, "this is not how a Mac app does X" | | tufte-density-reviewer | Data-ink ratio, chartjunk, sparklines, small multiples, "above all else show the data", lie factor |
mode and problem per the parse algorithm above. If the resolved problem starts with @, read the file via Read first; the file contents are the problem context. If the resolved mode is auto, select 6 personas with Auto persona selection and announce the list in one sentence. If the resolved mode is the bare core, run Core profile auto-detect to pick core-eng, core-ux, or core-mix, and announce the chosen profile to the user in one sentence (e.g., "Picking core-ux because the problem references sidebar, accessibility, and SwiftUI. Override with core-eng or core-mix next time.").subagent_type matching the persona's registered name. Use the right roster for the mode:
auto (6): the personas selected by Auto persona selectioncore-eng (6): antirez-simplicity-reviewer, tef-deletability-reviewer, muratori-perf-reviewer, hebert-resilience-reviewer, meadows-systems-advisor, chin-strategy-advisorcore-ux (6): norman-affordance-reviewer, nielsen-heuristics-reviewer, krug-usability-reviewer, watson-a11y-reviewer, tognazzini-fpid-reviewer, tufte-density-reviewercore-mix (6): antirez-simplicity-reviewer, tef-deletability-reviewer, hebert-resilience-reviewer, norman-affordance-reviewer, nielsen-heuristics-reviewer, watson-a11y-reviewerking-type-reviewer, hughes-pbt-advisor, evans-ddd-reviewer, fp-structure-reviewer, wayne-spec-advisor, iac-craft-reviewer, test-architect, gregg-perf-reviewer, ai-quality-advisor, cicd-build-advisor), and extended UX/platform (eidhof-swiftui-reviewer, ash-cocoa-runtime-reviewer, simmons-mac-craft-reviewer, tognazzini-fpid-reviewer, krug-usability-reviewer, nielsen-heuristics-reviewer, watson-a11y-reviewer, head-motion-reviewer, siracusa-mac-critic, tufte-density-reviewer, norman-affordance-reviewer) rosters - dedupe so each persona is spawned once.
Each call gets:## <Persona name> review; ignore any preface during synthesisneed task/need target parking text, or attempts to spawn/message other agents as invalid internal failures. Never show those invalid payloads to the user and never synthesize them.@, read the file first.## <Persona name> review.When briefing a persona, instruct them to return a structured response:
## <Persona name> review
### What I see
<2-4 sentences naming what the proposal/code is, in their voice>
### What concerns me
<3-6 bullets, each grounded in their actual philosophy, with the specific
phrase or concept from their canon they're invoking>
### What I'd ask before approving
<3-5 questions, drawn from their canonical question list>
### Concrete next move
<1 sentence: the single change they'd push for>
### Where I'd be wrong
<1-2 sentences: their honest blind spot - every persona must include this>
The "Where I'd be wrong" section is required. Without it the personas drift toward dogma. With it they stay honest to their own published nuance.
When you brief a persona, include these constraints in the briefing:
The persona dossiers in references/ are derived from each thinker's public writing for personal review use. They quote directly with citations to the original sources, often 200+ lines of verbatim quotation per persona.
Constraints:
Use this shape when integrating persona returns. The point is to make the disagreement legible, not to flatten it.
# Council review: <topic>
## Convergence (high-confidence signals)
<2-5 bullets. Each bullet names the shared finding and lists the personas
who arrived at it independently. Format: `- [finding] — [persona1, persona2,
persona3]`. Convergence across opposed lenses is the strongest signal in the
review; surface it first.>
## Disagreement (real tradeoffs the user must decide)
<2-4 bullets. Each bullet names the axis of disagreement and the personas on
each side, with a one-line summary of each position. Format:
`- [axis] — [persona A] argues X / [persona B] argues Y. Decision is yours
because <constraint that breaks the tie>.`>
## Per-persona top-3
<For each persona that returned, three bullets in their voice. Quote phrases
from their dossier; do not paraphrase into AI-review tone. Name the concrete
file/line/decision they're objecting to. Keep each bullet under 30 words.>
### antirez
- ...
- ...
- ...
### tef
- ...
(repeat per persona)
## What to do next
<3-7 numbered concrete actions, smallest first, each tied back to which
persona(s) called for it. Separate "before merging this PR" from "before
shipping the next iteration" if both timescales are in play.>
## What we did not address
<1-3 bullets naming gaps the council does not cover for this problem
(see "What no persona is good at catching" in references/personas.md).
Explicit gaps prevent the user mistaking the review for full coverage.>
references/personas.md is the canonical persona registry. The tables in this file are a quick-reference convenience for selection - keep them in sync with personas.md when you add or rename a persona.
name, description, tools, permissionMode; voice rules (don't-bullets); core lens (numbered principles with sourced quotes); required output format including the mandatory "Where I'd be wrong" section; debate-mode named-agreement and named-disagreement scaffolding; honest skew.core-* preset or only in auto / all / debate selection (domain-specific lens).development
Run the council workflow from a normal Copilot session only when the user explicitly asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis. Do not use it for commit, stage, merge, approval, or generic pre-commit requests. Accept the same mode syntax as the bundled council reviewers: `core|auto|core-eng|core-ux|core-mix|all|debate <problem|@file>`. During council slash-command use, the current session agent moderates reviewer agents directly. Runs broader than 6 reviewers require explicit AskUserQuestion approval before launch.
tools
Use when the user invokes $council, $council:council, Council review, or Council debate. Use loaded SKILL body or one direct installed `skills/council/SKILL.md` read. Direct read path must contain `/.codex/plugins/cache/sai/council/` and end `/skills/council/SKILL.md`. `cd <cwd> && sed -n ... <path>` is valid. Do not use `pwd`, `ls`, `find`, `rg`, `cat`, multiple `&&`, or `;`. Never use repo-local paths. If unavailable, stop exactly `Council not run: skill unavailable.` At most one pre-tool message, exact `Council progress:` line only. Non-final lines start `Council progress:`.
development
Run council reviews with sourced engineering, UX, reliability, performance, AI, and strategy persona lenses. Use when the user asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis.
development
Write or review behavior-first tests by reusing the source workflow under `claude/test-writer`. Use when the user wants tests added or existing tests reviewed in Codex.