{"id":51464170,"url":"https://github.com/pedrofuentes/council","last_synced_at":"2026-07-06T09:01:18.607Z","repository":{"id":365844876,"uuid":"1231472431","full_name":"pedrofuentes/Council","owner":"pedrofuentes","description":"Persistent AI expert panels that deliberate, disagree, and remember.","archived":false,"fork":false,"pushed_at":"2026-07-03T08:22:40.000Z","size":8417,"stargazers_count":0,"open_issues_count":423,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-03T08:23:18.180Z","etag":null,"topics":["ai","council","council-of-agents","debate"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pedrofuentes.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-07T01:57:10.000Z","updated_at":"2026-07-03T08:14:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pedrofuentes/Council","commit_stats":null,"previous_names":["pedrofuentes/council"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/pedrofuentes/Council","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofuentes%2FCouncil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofuentes%2FCouncil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofuentes%2FCouncil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofuentes%2FCouncil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pedrofuentes","download_url":"https://codeload.github.com/pedrofuentes/Council/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofuentes%2FCouncil/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35184015,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","council","council-of-agents","debate"],"created_at":"2026-07-06T09:01:17.518Z","updated_at":"2026-07-06T09:01:18.596Z","avatar_url":"https://github.com/pedrofuentes.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🏛️ Council\n\n**Structured multi-expert deliberation in your terminal — with memory, genuine disagreement, and no sycophancy.**\n\nStop getting single-perspective advice from AI. Council creates persistent expert panels that deliberate, disagree, and remember across sessions — so you get deeper insights for complex decisions.\n\n[![npm version](https://img.shields.io/npm/v/@council-ai/cli?logo=npm)](https://www.npmjs.com/package/@council-ai/cli) [![npm downloads](https://img.shields.io/npm/dm/@council-ai/cli?logo=npm)](https://www.npmjs.com/package/@council-ai/cli) [![CI](https://github.com/pedrofuentes/Council/actions/workflows/ci.yml/badge.svg)](https://github.com/pedrofuentes/Council/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![npm provenance](https://img.shields.io/badge/npm-provenance-cb3837?logo=npm)](https://docs.npmjs.com/generating-provenance-statements)\n\n**Provider-flexible:** Runs on GitHub Copilot today. OpenAI and Anthropic support planned ([see roadmap](./ROADMAP.md#phase-8-growth--ecosystem)).\n\n---\n\n## Quick Start\n\n```bash\n# Install\nnpm install -g @council-ai/cli\n\n# Verify setup (checks Node.js, SQLite, Copilot SDK, disk)\ncouncil doctor\n\n# Run your first deliberation — Council auto-composes an expert panel for you\ncouncil convene \"Should we build our own analytics or buy a vendor solution?\"\n```\n\nBecause the example above passed no `--template`, Council **auto-composes** a\npanel for your topic, prints the proposed roster, and asks you to confirm\n(`Proceed with this panel? [y/N]`) before the debate starts. Add `--yes` to skip\nthe prompt in non-interactive or scripted runs — a non-interactive shell (piped\ninput or CI) _requires_ `--yes` and otherwise exits with an error rather than\nhanging. Pass `--template \u003cname\u003e` to use a built-in panel and bypass\nauto-composition (and its confirmation prompt) entirely.\n\nWhen a debate completes, `council convene` automatically generates a final\nstructured conclusion by default. This costs one additional premium synthesis\nrequest; pass `--no-conclude` to save the request and skip the conclusion.\n\n**Requirements:** Node.js 24+, GitHub Copilot subscription (Individual, Business, or Enterprise). No API keys, no credits to manage.\n\n### First run: choosing a default model\n\nThe first time you run a command that needs a model (for example\n`council convene`), Council performs a one-time setup: it discovers the models\navailable to your Copilot subscription, recommends one (`claude-sonnet-4.5`), and\nasks you to choose a default. Your selection is saved to config as\n`defaults.model`, so the wizard runs only once.\n\n- **Non-interactive shells** (piped input or CI) skip the prompt and\n  automatically use the recommended model, printing\n  `Non-interactive session detected; using recommended model \u003cid\u003e`.\n- **If live model discovery fails**, Council falls back to a built-in static\n  list and warns `Live model discovery failed, so Council is showing a built-in\nfallback list` before continuing.\n- `council doctor`, `council config`, `council demo`, and `council docs` never\n  trigger the wizard — run `council doctor` to verify your setup or\n  `council config` to change the default model later.\n\n---\n\n## Why Council?\n\nChatGPT gives you **one perspective**. Council gives you **structured deliberation** from multiple expert viewpoints — with memory, disagreement, and synthesis.\n\n| You ask...                        | Single AI says...      | Council deliberates...                                                                                                          |\n| --------------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------- |\n| \"Build or buy analytics?\"         | Generic pros/cons list | CTO estimates build cost, CFO models 3-year TCO, VP Product argues speed to insight — synthesis names the real risk             |\n| \"Should we add a freemium tier?\"  | Balanced advice        | VP Growth projects conversion funnels, CFO flags margin erosion, Head of CS warns about support load — genuine disagreement     |\n| \"Should we use microservices?\"    | Generic pros/cons list | CTO argues operational risk, PM argues time-to-learning, Adversary challenges both — then synthesis names the crux              |\n| \"Review this auth middleware\"     | Unified feedback       | Security auditor flags JWT expiry, performance engineer finds N+1, future maintainer asks \"will I understand this in 6 months?\" |\n| \"Should I take the manager role?\" | Balanced advice        | IC mentor argues stay, manager argues switch, career coach provides a decision framework                                        |\n\n---\n\n## Core Features\n\n- **Auto-composition:** Describe your problem; Council designs an expert panel for you.\n- **Persistent memory:** Experts remember prior debates and evolve their perspectives across sessions.\n- **Anti-sycophancy enforcement:** 3-layer quality gate ensures genuine disagreement and specificity (forbidden phrases, disagreement budget, concrete evidence requirements).\n- **Structured \u0026 freeform modes:** 4-phase choreography (opening → cross-exam → rebuttal → synthesis) or flexible moderated discussion.\n- **Document-driven persona experts:** Ground experts in your own reference material (CVs, RFCs, design docs, transcripts) for domain-specific voice and expertise.\n- **Persistent chat:** 1:1 conversations with experts or multi-expert panel chat with `@mention` support and inline debates.\n- **Export \u0026 share:** Markdown, JSON, ADR (Architecture Decision Record), and shareable formats.\n\n**Shipped:** Phases 1–7.6 complete ([ROADMAP.md](./ROADMAP.md)). CLI includes `convene`, `ask`, `chat`, `conclude`, `resume`, `export`, `sessions`, `templates`, `expert`, `panel`, `memory`, `doctor`, `demo`, `docs`, `config`, `telemetry`, and `update`.\n\n---\n\n## Demo\n\n```bash\n$ council convene \"Should we build our own analytics or buy a vendor solution?\"\n\n🏛️  Panel assembled:\n  • [1] Priya Mehta (CTO) (claude-sonnet-4.5)\n  • [2] James Whitfield (CFO) (claude-sonnet-4.5)\n  • [3] Lisa Park (VP Product) (claude-sonnet-4.5)\n\n━━━ Round 1 ━━━\n\n[[1] Priya Mehta (CTO)]\nBuilding in-house gives us full control over the data pipeline, but we need\nto be honest about the cost: a team of 3 engineers for 6+ months, ongoing\nmaintenance, and we still won't match the feature set of Amplitude or Mixpanel\non day one...\n\n[[2] James Whitfield (CFO)]\nPriya's estimate undersells the true cost. Three engineers at $180K fully\nloaded is $270K just in salary for the build phase. A vendor at $3K/month is\n$36K/year. Even over 3 years, the buy option is 60% cheaper — and that's\nbefore we account for opportunity cost of those engineers not shipping product...\n\n[[3] Lisa Park (VP Product)]\nBoth of you are optimizing for cost, but the real question is speed to insight.\nWe're making pricing decisions next quarter with no data. A vendor gets us\ndashboards in 2 weeks. Building means we're flying blind for 6 months...\n\n━━━ Synthesis ━━━\nThe panel splits on build vs. buy but converges on one point: the 6-month\ndata gap is the real risk. Start with a vendor, ring-fence the build option\nfor year two if data ownership becomes a competitive advantage...\n```\n\n---\n\n## Learn More\n\n- **[Installation \u0026 First Debate](packages/site/src/content/docs/tutorials/01-install-and-first-debate.mdx)** — Get started in 5 minutes\n- **[Tutorials](packages/site/src/content/docs/tutorials/)** — Step-by-step guides for key workflows\n- **[How-To Guides](packages/site/src/content/docs/how-to/)** — Practical recipes for common tasks\n- **[Architecture \u0026 Concepts](packages/site/src/content/docs/explanation/)** — Understand deliberation model, anti-sycophancy, memory, and RAG\n- **[Reference](packages/site/src/content/docs/reference/)** — CLI command reference and API docs\n- **[Panel Gallery](/gallery)** — Browse community-contributed panel templates (coming soon)\n- **[ROADMAP.md](./ROADMAP.md)** — Completed phases (1–7.6) and Phase 8 plans (GitHub Action, direct provider APIs, telemetry)\n- **[CONTRIBUTING.md](./CONTRIBUTING.md)** — Development setup, testing, and contribution guidelines\n\n---\n\n## Commands at a Glance\n\n```bash\n# Getting started\ncouncil doctor                                      # Verify Node, SQLite, Copilot SDK, disk\ncouncil config                                      # View/edit configuration\n\n# Run a deliberation\ncouncil convene \"Should we go public?\"              # Auto-compose a panel (asks to confirm; add --yes to skip)\ncouncil convene \"...\" --template code-review        # Use built-in template (no confirmation prompt)\ncouncil templates                                   # List all built-in templates\n\n# Conversation\ncouncil ask \u003cexpert\u003e \"What do you think?\"           # One-shot question to a single expert\ncouncil chat \u003cexpert-or-panel\u003e                      # Persistent 1:1 or panel chat\ncouncil resume \u003cpanel\u003e                              # Show transcript or continue debate\n\n# Decision framework\ncouncil conclude \u003cpanel\u003e                            # Synthesize into decision matrix\n\n# Export \u0026 inspect\ncouncil export \u003cpanel\u003e                              # Export to markdown (or --format adr/json)\ncouncil sessions                                    # List all past debates\ncouncil memory list                                 # Summary of all panels\ncouncil memory inspect \u003cpanel\u003e                      # Detail view\n\n# Manage library\ncouncil expert create                               # Interactive wizard for new expert\ncouncil expert create --persona                     # Persona expert (with docs/ folder)\ncouncil panel create                                # Create a custom panel\ncouncil expert list                                 # View your expert library\ncouncil panel list                                  # View your panels\n\n# Keep up to date\ncouncil update                                      # Upgrade to latest published version\n```\n\n`council --help` (and bare `council help`) print this list **grouped into\nlabelled sections** — Getting Started, Deliberation, Conversation, Library, and\nInspection, followed by a catch-all **Other** section for any registered\ncommands that don't map to a category — instead of one flat list, and close\nwith an onboarding cue so a brand-new setup always has an obvious next step:\n\n```text\nCommands:\n\nGetting Started:  doctor, demo, config, telemetry, docs, update, ui\nDeliberation:     convene, resume, conclude, review\nConversation:     ask, chat\nLibrary:          expert, panel, templates\nInspection:       sessions, memory, export\n\nOther:            models\n\nNew to Council? Start with: council doctor\n```\n\nIn the real terminal each command sits on its own line with a one-line\ndescription; the grouped section order above is what you see.\n\n---\n\n## Built-in Panels\n\nCouncil ships with **17 built-in expert panels** covering engineering, product, go-to-market, finance, people, legal, and executive decisions. Each panel is pre-configured with domain experts who bring distinct perspectives and genuine disagreement.\n\n### Engineering\n\n| Panel                 | Use for...                                                         |\n| --------------------- | ------------------------------------------------------------------ |\n| `architecture-review` | Multi-perspective review of architecture and engineering decisions |\n| `code-review`         | Multi-perspective code review with separated concerns              |\n| `incident-postmortem` | Blameless analysis of a production incident                        |\n\n### Product \u0026 Design\n\n| Panel                     | Use for...                                              |\n| ------------------------- | ------------------------------------------------------- |\n| `product-strategy-review` | Pressure-tests a product strategy or major bet          |\n| `roadmap-prioritization`  | Turns a noisy backlog into a defensible ranked roadmap  |\n| `ux-review`               | Reviews a user experience — a flow, screen, or redesign |\n\n### Go-to-Market\n\n| Panel                      | Use for...                                                                  |\n| -------------------------- | --------------------------------------------------------------------------- |\n| `brand-positioning-review` | Pressure-tests a brand and positioning decision from five conflicting seats |\n| `enterprise-deal-review`   | Reviews a high-stakes enterprise deal from five seats                       |\n| `growth-experiment-review` | Reviews a growth experiment before launch or before shipping the \"winner\"   |\n| `negotiation-prep`         | Prepares for a high-stakes negotiation from five seats                      |\n| `pricing-packaging-review` | Stress-tests a pricing and packaging decision                               |\n\n### Finance, People, Legal \u0026 Executive\n\n| Panel                           | Use for...                                                                                     |\n| ------------------------------- | ---------------------------------------------------------------------------------------------- |\n| `executive-strategy-board-prep` | Prepares an executive team for a board meeting or major strategy decision                      |\n| `fpna-budget-review`            | Pressure-tests an annual or quarterly budget (decision-support, not financial advice)          |\n| `hiring-decision-review`        | Stress-tests a hiring decision before the offer (decision-support, not professional HR advice) |\n| `legal-risk-review`             | Reviews a contract, launch, or risk decision (decision-support, not legal advice)              |\n\n### Startup \u0026 Career\n\n| Panel                | Use for...                                                                    |\n| -------------------- | ----------------------------------------------------------------------------- |\n| `career-coaching`    | Career-decision panel for engineers weighing IC vs. management or job changes |\n| `startup-validation` | Stress-test a startup or product idea                                         |\n\n**Usage:** `council convene \"\u003ctopic\u003e\" --panel \u003cname\u003e`  \n**See all:** `council templates`\n\n---\n\n## Example Use Cases\n\n- **Architecture review:** Multi-expert deliberation on technical decisions (microservices, build vs. buy, tech stack)\n- **Code review:** Security auditor + performance engineer + future maintainer review PRs or modules\n- **Incident postmortem:** Analyze failures with multiple expert perspectives on root cause and remediation\n- **Career decisions:** IC mentor + manager + career coach deliberate on role changes, negotiation, growth\n- **Startup strategy:** CEO + CFO + VP Product debate product-market fit, pricing, fundraising timing\n\n---\n\n## Documentation \u0026 Community\n\n- **Documentation:** [packages/site/](packages/site/src/content/docs/) — Tutorials, how-to guides, reference, architecture\n- **Roadmap:** [ROADMAP.md](./ROADMAP.md) — Completed phases and Phase 8 plans\n- **Contributing:** [CONTRIBUTING.md](./CONTRIBUTING.md) — Development setup, testing, pull requests\n- **Issues:** [GitHub Issues](https://github.com/pedrofuentes/Council/issues) — Bug reports and feature requests\n- **License:** [MIT](LICENSE)\n\n---\n\n## What's Next\n\nBelow you'll find the full CLI reference, advanced usage patterns, persona expert setup, and deep-dive explanations of Council's deliberation model, anti-sycophancy enforcement, memory system, and document intelligence (RAG).\n\n**New to Council?** Start with `council doctor` to verify your setup, then run `council convene \"your first question\"`.\n\n---\n\n## Full CLI Reference\n\n```bash\n# Verify your setup\ncouncil config show                # print effective config values with sources\ncouncil config path                # print config file location\ncouncil config edit                # open in $EDITOR\n\n# Auto-compose a panel from the topic (no --template needed — Council\n# designs an expert panel for you using a meta-prompt). Council prints the\n# proposed roster and asks \"Proceed with this panel? [y/N]\" before debating.\ncouncil convene \"Should we go public?\"\n\n# Skip the auto-compose confirmation prompt. --yes is REQUIRED for\n# non-interactive / CI runs: a non-TTY shell without it exits with\n# \"Auto-compose requires --yes in non-interactive mode\" instead of prompting.\ncouncil convene \"Should we go public?\" --yes\n\n# Override the default model for a single debate (no config edit needed)\ncouncil convene \"Should we go public?\" --model gpt-4.1\n\n# Run a panel debate against the real Copilot SDK (with an explicit template).\n# Passing --template (or its --panel alias) selects a ready-made panel and\n# skips auto-composition and its confirmation prompt entirely.\ncouncil convene \"Should we rewrite our billing system?\" \\\n  --template code-review --max-rounds 4\n\n# --panel is a shorthand alias for --template\ncouncil convene \"Review our API\" --panel code-review\n\n# Tip: single-quote topics containing $, backticks, or other shell metacharacters\ncouncil convene 'What is the $cost of `make build`?'\n\n# Add yourself as a human participant alongside the AI experts (repeatable)\ncouncil convene \"Should we migrate to microservices?\" --template architecture-review \\\n  --human \"Pedro\"\n# Multiple human participants:\ncouncil convene \"Product direction vote\" --template product-strategy-review \\\n  --human \"Alice\" --human \"Bob\"\n\n# Press Ctrl+C at any time during a debate to abort gracefully — the partial\n# transcript is saved and you can `council resume` later. A second Ctrl+C\n# force-kills the process.\n\n# Or run offline with the deterministic mock engine (for testing/CI). No\n# --template is required: with --engine mock, auto-compose skips the LLM and\n# returns a fixed built-in panel (an Optimist, a Skeptic, and a Pragmatist), so\n# the run makes zero network calls. The auto-compose roster confirmation still\n# applies, so add --yes for non-interactive / CI runs.\ncouncil convene \"Test prompt\" --engine mock --yes\n# Pinning --template with --engine mock still works and skips auto-compose:\ncouncil convene \"Test prompt\" --template code-review --engine mock\n\n# Suppress non-essential stderr output (informational messages)\ncouncil convene \"Topic\" --quiet\n\n# Force ASCII symbols (environment-driven: COUNCIL_ASCII=1, NO_COLOR, or TERM=dumb)\nCOUNCIL_ASCII=1 council convene \"Topic\"\n\n# Use structured 4-phase choreography (opening → cross-exam → rebuttal → synthesis)\ncouncil convene \"Should we ship the MVP?\" --template architecture-review \\\n  --mode structured\n\n# Choose a moderator strategy for freeform debates (default: round-robin)\ncouncil convene \"Ship now or wait?\" --template code-review \\\n  --strategy consensus-check\ncouncil convene \"Ship now or wait?\" --template code-review \\\n  --strategy devils-advocate:senior   # pin \"senior\" as the contrarian\n\n# Tame long debates with context-window management\ncouncil convene \"Long architectural debate\" --template architecture-review \\\n  --max-rounds 10 \\\n  --context-scope recent          # only the most-recent turns are passed forward\ncouncil convene \"Long debate\" --template architecture-review \\\n  --max-rounds 10 \\\n  --context-scope same-round      # each expert only sees its round-mates\ncouncil convene \"Long debate\" --template architecture-review \\\n  --max-rounds 10 \\\n  --summarize-after 3             # prepend a rolling summary after round 3\n# Rolling summaries are generated by the LLM by default. Add --heuristic-summaries\n# for a simpler local (no-LLM) summarizer — useful for offline/air-gapped runs.\ncouncil convene \"Long debate\" --template architecture-review \\\n  --max-rounds 10 \\\n  --summarize-after 3 --heuristic-summaries\n\n# Pipe NDJSON output to jq, logs, or scripts\ncouncil convene \"...\" --template code-review --format json | jq .\n# Completed debates emit {\"kind\":\"conclusion\",\"conclusion\":{...}} as the final\n# NDJSON line after debate.end, unless you pass --no-conclude.\n# NDJSON event kinds emitted during a debate:\n#   panel.assembled   — session open; carries the assembled expert roster\n#   round.start       — a new round begins\n#   turn.start        — an expert begins speaking\n#   turn.delta        — a streaming token fragment ({expertSlug, text})\n#   turn.discard      — discard buffered deltas for this turn (retry incoming)\n#   turn.retry        — transient error triggered an automatic retry;\n#                       carries {expertSlug, attempt, reason, reasonCode?}\n#                       reasonCode maps to a friendly message; filter or surface\n#                       as a progress indicator\n#   turn.quality_gate — anti-sycophancy gate flagged the response (warn/regenerate)\n#   turn.end          — expert turn complete (success only; carries full content)\n#   round.end         — a round finished (may carry a rolling summary)\n#   cost.update       — running premium-request and cost totals\n#   debate.end        — all rounds finished\n#   error             — engine error ({expertSlug?, message, recoverable})\n#   conclusion        — final synthesis object (present unless --no-conclude)\n\n# Show the transcript of a previous debate\ncouncil resume \u003cpanel-name\u003e\n\n# Continue a previous panel with a new prompt\ncouncil resume \u003cpanel-name\u003e --prompt \"What about the migration risk?\"\n\n# Export a panel transcript for sharing — includes the full multi-debate\n# history of the panel (every original + resumed debate, with globally\n# renumbered rounds), not just a single debate.\ncouncil export \u003cprefix\u003e                             # prefix match (auto-selects if unique;\n                                                    # ambiguous prefixes open a picker on a TTY, or list matches and\n                                                    # exit non-zero when non-interactive; see the resolver notes below)\ncouncil export \u003cpanel-name\u003e                         # markdown (default)\ncouncil export \u003cpanel-name\u003e --format adr            # Architecture Decision Record\ncouncil export \u003cpanel-name\u003e --format json --output transcript.ndjson\n\n# Inspect what's persisted locally\ncouncil memory list                                 # summary of all panels\ncouncil memory inspect \u003cpanel-name\u003e                 # detail view\ncouncil memory inspect \u003cpanel-name\u003e --expert cto    # single-expert detail (includes provenance: source debate, trust score)\n\n# Curate (destructive — requires --yes)\ncouncil memory reset \u003cpanel-name\u003e --yes             # clear debates+turns, keep panel+experts\ncouncil memory reset \u003cpanel-name\u003e --hard --yes      # delete the panel entirely\n\n# Manage the expert library (~/Council/experts/*.yaml)\ncouncil expert create                               # interactive wizard\ncouncil expert create --persona                     # persona expert (creates docs/ folder)\ncouncil expert list                                 # table view (also --format json)\ncouncil expert inspect \u003cslug\u003e                       # full detail + panel memberships; trained personas also show Learned Profile (`profile` in JSON)\ncouncil expert edit \u003cslug\u003e                          # open YAML in $EDITOR, re-validate on save\ncouncil expert delete \u003cslug\u003e                        # refuses if in any panel (use --force to override)\n# Slug conflicts are keyed off \u003cslug\u003e.yaml. If the YAML was deleted but a stale\n# expert_library row remains, `council expert create --slug \u003cslug\u003e ...` recreates\n# the YAML and refreshes the cache automatically.\n\n# Chat 1:1 with a persona expert — drop reference docs in\n# ~/Council/experts/\u003cslug\u003e/docs/ (any supported format — run \"council docs formats\").\n# On every `council chat \u003cslug\u003e` invocation, Council auto-detects new,\n# changed, or deleted documents, re-extracts and re-indexes them\n# (deletions prune the FTS index and mark the DB row as removed),\n# refreshes the persona profile, and only THEN registers the expert —\n# so the next reply already reflects the latest reference material.\n# Files outside the docs folder (e.g. symlinks pointing elsewhere) are\n# rejected for safety; the docs folder itself must be a real directory\n# (symlinks/junctions as the root are also rejected). An empty docs\n# folder is fine: the persona just runs as a generic expert.\ncouncil chat \u003cpersona-slug\u003e                         # auto-processes ~/Council/experts/\u003cslug\u003e/docs/\n\n# Manage a panel's shared document corpus (Roadmap 6.7) — drop reference\n# material into the auto-provisioned ~/Council/panels/\u003cname\u003e/docs/ folder\n# OR link an external folder. On `council chat \u003cpanel\u003e`, the scanner\n# walks every managed + linked folder, indexes new/changed files into\n# the FTS5 corpus under source_type='panel', and prunes any tracked\n# documents that have disappeared from disk. The indexed panel corpus is\n# retrieved for panel chat turns, inline @convene deliberations, and saved-panel\n# `council convene --template \u003cname\u003e` debates; run `council panel docs list \u003cname\u003e --refresh`\n# first when you need to force a rescan before convene.\ncouncil panel docs \u003cname\u003e                                  # list indexed docs (DB read — no scan)\ncouncil panel docs list \u003cname\u003e --refresh                   # re-scan managed + linked folders, then list\ncouncil panel docs link \u003cname\u003e --path \u003cfolder\u003e [--yes]     # link an external folder (symlinks rejected; prompts unless --yes)\ncouncil panel docs unlink \u003cname\u003e --path \u003cfolder\u003e           # remove a linked folder + its FTS entries\n```\n\n### Resolving a panel by name or prefix\n\n`council resume`, `council conclude`, and `council export` share one resolver\nfor turning the panel argument into a stored session, so all three behave the\nsame way:\n\n- **Exact match** — an argument that exactly matches a session name is used as-is.\n- **Unique prefix** — a prefix that matches exactly one session auto-selects it.\n- **Ambiguous prefix** — when a prefix matches several sessions, an interactive\n  terminal shows a numbered picker (`Select a panel [1-N] (Enter to cancel):`),\n  while a non-interactive shell (piped output or CI) instead lists the matches\n  and exits non-zero (`Ambiguous prefix '\u003cp\u003e' matches N panels.`) so scripts\n  fail loudly instead of guessing.\n- **No match** — Council prints the closest `Did you mean …?` suggestions and\n  exits non-zero.\n\n### Argument parsing notes\n\nCommander 15 makes excess positional arguments a hard error for most commands:\n`too many arguments. Expected N arguments but got ...`. If you meant to pass\nexpert slugs to `convene`, use unquoted space-separated slugs (`--experts cto cfo`),\na quoted comma-separated list (`--experts \"cto,cfo\"`), or repeated flags\n(`--experts cto --experts cfo`). `council convene` and `council panel create` are\nthe exceptions: they accept stray operands only to warn about the likely\nmissing `--experts` flag.\n\n`council resume --latest` ignores the argument and reopens the most recently\nactive panel; `council conclude` with no argument falls back to the most\nrecently debated panel.\n\n### Output format and TTY detection\n\nStreaming debate commands (`convene`, `resume`, `ask`, `review`) accept\n`--format auto|plain|json` (default `auto`):\n\n- **`auto`** renders the interactive Ink TUI when stdout is a TTY, and falls back to\n  plain streaming text when it is not (piped output, `CI=true`, `TERM=dumb`, or\n  `ACCESSIBILITY=1`). This is the human-friendly default.\n- **`plain`** always streams plain text, regardless of TTY.\n- **`json`** always emits newline-delimited JSON (NDJSON) — one event per line —\n  regardless of TTY.\n\nExplicit `--format plain|json` overrides the `auto` TTY check, so scripts and CI get a\n**stable, predictable renderer instead of the interactive TUI**. In particular,\n`--format json` stays pure NDJSON when redirected or piped (e.g. `… --format json | jq .`) —\nthe determinism guarantee automation relies on. `council resume \u003cpanel\u003e` transcript\nreplay additionally coerces `auto` to `plain` (a static replay gains nothing from the\nInk TUI); pass `--format json` for machine-readable transcript output. See\n[DECISIONS.md](./DECISIONS.md) → ADR-030 for the rationale.\n\nWhen the Ink TUI is active, press **`?`** at any time to open the help overlay — a\nfloating panel listing all available keyboard shortcuts. Press **`?`** again (or\n**`Esc`**) to close it and return to the debate.\n\nCommon TUI shortcuts:\n\n| Keys                             | Action                                            |\n| -------------------------------- | ------------------------------------------------- |\n| **`↑`**/**`↓`**, **`j`**/**`k`** | Move through lists and menus                      |\n| **`Enter`**                      | Open, select, or confirm the focused item         |\n| **`Esc`**                        | Go back or close the current overlay              |\n| **`Ctrl+K`**                     | Open the command palette                          |\n| **`?`**                          | Toggle contextual help for the current screen     |\n| **`a`**                          | Open the Actions menu on screens that provide one |\n| **`q`**                          | Quit the TUI                                      |\n\n### Streaming and chat output\n\nWhile a debate streams in plain output (either `--format plain` or the\nnon-interactive `auto` fallback), a **recoverable** engine error — a transient\nrate-limit or network blip — is printed with a `— retrying automatically`\nsuffix, so an auto-retried hiccup is easy to tell apart from a fatal error;\nCouncil retries such failures before giving up.\n\n`council chat` adds a few interactive touches on top of the plain stream:\n\n- A dim `thinking...` indicator is shown next to the expert's prompt the moment\n  it is queried, and is overwritten in place by the expert's name as soon as the\n  first token arrives.\n- Multi-line replies are indented — each continuation line is prefixed with two\n  spaces so a long answer stays visually attached to the expert who is speaking.\n- A reply that fails with a recoverable error prints\n  `Transient error from engine. Retrying once...` and is retried a single time.\n\n## Keeping Council Up to Date\n\n`council update` upgrades the globally-installed `@council-ai/cli` to the latest\npublished version. It auto-detects the package manager that owns the install\n(npm, pnpm, yarn, or bun), shows the exact command it will run, and asks for\nconfirmation before shelling out.\n\n```bash\ncouncil update                      # detect the package manager and upgrade (prompts first)\ncouncil update --yes                # skip the confirmation prompt\ncouncil update --dry-run            # print the upgrade command without running it\ncouncil update --pm pnpm            # force a specific package manager (npm | pnpm | yarn | bun)\n```\n\nThe upgrade runs via an argv-array `execFile` (never a shell string) with a\nfixed `@council-ai/cli@latest` spec, so no untrusted input is interpolated into\nthe spawned command. The child process is bounded for robustness:\n\n- **Timeout** — the install is terminated after 5 minutes; a wedged package\n  manager can't hang `council update` forever.\n- **Output buffer** — up to 64 MiB of stdout/stderr is captured (well above\n  Node's 1 MiB default), so a verbose `npm i -g` is never falsely reported as a\n  failure.\n- **Clear failures** — a non-zero exit, a timeout, a signal kill, and an\n  output-buffer overflow are each reported distinctly with the captured output,\n  and are never mislabelled as \"package manager not installed\".\n\nExit codes follow the usual convention: `0` when already up to date or after a\nsuccessful upgrade, and a non-zero code on failure — including a distinct\nnetwork error code when the registry can't be reached (so \"offline\" is\ndistinguishable from \"already up to date\" in scripts).\n\n## Persona Experts \u0026 Document Intelligence\n\nA **persona expert** is one whose voice is shaped by a corpus of reference\ndocuments (CVs, design docs, RFCs, prior emails, transcripts). Create one\nwith `council expert create --persona --slug \u003cslug\u003e` — Council provisions\n`~/Council/experts/\u003cslug\u003e/docs/` and the expert is registered with\n`kind: \"persona\"`.\n\n**On every `council chat \u003cpersona-slug\u003e` invocation** (Roadmap 6.1, 6.2,\n6.4, 6.8):\n\n1. **Detect** new, modified, and deleted files by SHA-256 checksum\n   against the `expert_documents` table (defined in `src/memory/migrations/001_unified.sql`).\n2. **Extract** content from any of the 16 registered formats via the\n   modular extractor registry (`src/core/documents/extractors/`) —\n   a TOCTOU-safe fd-bound read dispatches to the format-specific\n   extractor registered for the file's extension (or detected from its\n   magic bytes). Run `council docs formats` for the full list.\n3. **Index** the normalised text into FTS5 (`document_index`) for retrieval-augmented prompts.\n4. **Analyze** the corpus into a structured `PersonaProfile`\n   (`communicationStyle`, `decisionPatterns`, `biases`, `vocabulary`,\n   `epistemicStance`) via a transient LLM \"Profile Analyzer\" expert. The\n   profile is persisted to `persona_profiles` and\n   injected into the expert's system prompt as `[N] PERSONA PROFILE` so\n   the very next reply already reflects the latest material.\n\n**Recency weighting** — each document block in the analyzer meta-prompt\nis annotated with a `[Weight: 0.NN]` tag computed via exponential decay\n(`weight = 2^(-ageDays / halfLifeDays)`, default half-life = 90 days).\nThe LLM is instructed to weight more-recent material more heavily, so\nan updated CV or revised RFC takes priority over older versions without\nyou having to delete the predecessors. The analyzer preserves the\ncaller's input order — weight tags reflect age regardless of how\ndocuments were enumerated.\n\n**Reset behaviour** — `council memory reset \u003cpanel\u003e` clears debate\ntranscripts, extracted memory, and provenance metadata but **preserves persona profiles**\n(Roadmap 7.4): rebuilding a profile costs an LLM call, and the profile\nis derived from on-disk documents that survive the reset anyway.\n\n**Security** — the docs folder must be a real directory (symlinks /\njunctions as the root are rejected up front); per-file confinement uses\na once-resolved canonical root passed through both the detector and the\nextractor (closing root-swap TOCTOU windows). Profile fields and\ndocument content are sanitised through layered defenses before reaching\nthe privileged system prompt — see ADR-008.\n\nGeneric experts (`kind` unset or `\"generic\"`) skip the entire pipeline\nand behave exactly as before — `personaProfile` arguments to\n`buildSystemPrompt()` are ignored unless the expert is a persona\n(Roadmap 7.1).\n\n## Supported Document Formats\n\nCouncil's built-in extractor registry covers 16 file types. Native text-based formats\nneed no conversion; rich-document formats are converted to plain text before indexing.\n\n**Native (no conversion needed):**\n\n| Extension          | Format     |\n| ------------------ | ---------- |\n| `.md`, `.markdown` | Markdown   |\n| `.txt`             | Plain text |\n| `.html`, `.htm`    | HTML       |\n\n**Rich documents (converted to text):**\n\n| Extension | Format                                        |\n| --------- | --------------------------------------------- |\n| `.pdf`    | PDF                                           |\n| `.docx`   | Word document                                 |\n| `.pptx`   | PowerPoint presentation                       |\n| `.xlsx`   | Excel spreadsheet                             |\n| `.xls`    | Legacy Excel (re-save as `.xlsx` recommended) |\n| `.csv`    | Comma-separated values                        |\n| `.tsv`    | Tab-separated values                          |\n| `.rtf`    | Rich Text Format                              |\n| `.odt`    | OpenDocument Text                             |\n| `.ods`    | OpenDocument Spreadsheet                      |\n| `.odp`    | OpenDocument Presentation                     |\n\n### Document commands\n\n```bash\ncouncil docs formats               # list supported formats, AI-extraction status, and size limit\ncouncil docs review \u003cpanel\u003e        # list files that failed extraction or use unsupported formats\n                                   #   (exits non-zero when any are present — CI-friendly)\ncouncil docs extract \u003cpanel\u003e       # run AI extraction on files held for review (ask mode):\n                                   #   prompts for confirmation, then extracts and indexes them\ncouncil docs doctor \u003cpanel\u003e        # document-health diagnostics: indexed count, word count,\n                                   #   pending review, corrupt files, AI-extraction mode\n```\n\n### Document configuration\n\n| Key                                       | Values                   | Default                                                     | Description                                                                                                                                                                                     |\n| ----------------------------------------- | ------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `documents.maxFileSizeMB`                 | 1–500                    | `50`                                                        | Maximum file size the extractor will read                                                                                                                                                       |\n| `documents.aiExtraction`                  | `off` \\| `ask` \\| `auto` | `off`                                                       | AI-based fallback for unsupported formats                                                                                                                                                       |\n| `documents.aiExtractionAllowedExtensions` | list of extensions       | `[]` (all eligible)                                         | Restrict AI extraction to specific extensions. A non-empty allowlist overrides the extension blocklist for listed extensions, but magic-byte signature blocklist still applies unconditionally. |\n| `expert.supportedFormats`                 | list of extensions       | 14 extensions (all above **except** `.markdown` and `.htm`) | Formats a panel's document scanner will accept                                                                                                                                                  |\n\n### Chat configuration\n\n| Key                            | Values   | Default | Description                                                                        |\n| ------------------------------ | -------- | ------- | ---------------------------------------------------------------------------------- |\n| `chat.longConversationWarning` | 50–10000 | `500`   | Turn count that triggers a one-time advisory in chat once the threshold is reached |\n\nConfigure with `council config set \u003ckey\u003e \u003cvalue\u003e` or open `~/.council/config.yaml` with `council config edit`.\n\n## Built-in Panels\n\n| Panel                 | Experts                                                               | Best For                         |\n| --------------------- | --------------------------------------------------------------------- | -------------------------------- |\n| `architecture-review` | CTO, Staff Engineer, SRE, Product Manager                             | Technical architecture decisions |\n| `startup-validation`  | VC Partner, Target Customer, Competitor, Distribution Expert          | Idea validation                  |\n| `code-review`         | Senior Dev, Security Auditor, Performance Engineer, Future Maintainer | Code quality                     |\n| `incident-postmortem` | SRE, Engineering Manager, Customer Advocate, Blameless Facilitator    | Blameless analysis               |\n| `career-coaching`     | IC Mentor, Engineering Manager, VP Eng, Career Coach                  | Career decisions                 |\n\n```bash\ncouncil convene --template architecture-review \"Should we adopt GraphQL?\"\n```\n\n\u003e **Migration note**: On first use of `--template` after upgrading, Council auto-migrates built-in panels to the library format — extracting experts into `~/Council/experts/` and rewriting panels to use slug references. Migration **never overwrites existing files**: if you've already created `~/Council/experts/cto.yaml` with a custom definition, the migration skips it and your panel references your custom expert instead of the built-in one. To reset to built-in defaults, delete the expert YAML and re-run.\n\n## Create Custom Panels\n\nUser panels live in `\u003cdataHome\u003e/panels/\u003cname\u003e.yaml` (default `~/Council/panels/`)\nand take precedence over Council's built-in templates of the same name.\nEach `experts` entry is **either** an inline definition **or** a slug\nstring referencing an expert in your library (see `council experts ...`).\n\n```yaml\n# ~/Council/panels/my-team.yaml\nname: product-strategy\ndescription: \"Evaluate product decisions\"\nexperts:\n  # Reference a reusable library expert by slug:\n  - pm-veteran\n  # Or define one inline for this panel only:\n  - slug: engineer\n    displayName: \"Staff Engineer\"\n    role: \"Systems thinker focused on long-term maintainability\"\n    expertise:\n      weightedEvidence:\n        - \"Distributed systems design\"\n        - \"Production incident postmortems\"\n      referenceCases:\n        - \"Microservices sprawl: more services than engineers\"\n      notExpertIn: [\"product-market fit\", \"pricing\"]\n    epistemicStance: \u003e\n      You've debugged enough on-call pages to distrust shiny abstractions.\n      You optimise for the team that maintains this in two years.\n```\n\nRun with `council convene \"\u003ctopic\u003e\" --template my-team`. Slug references\nare resolved against your expert library; unresolved slugs produce an\nexplicit error so you can either add them with `council expert create`\nor inline the definition.\n\n### First-run template migration\n\nOn the first `council convene --template \u003cname\u003e` after upgrade, Council\nextracts the inline experts from the built-in panels\n(`architecture-review`, `career-coaching`, `code-review`,\n`incident-postmortem`, `startup-validation`) into\n`~/Council/experts/\u003cslug\u003e.yaml` and rewrites the panels into\n`~/Council/panels/\u003cname\u003e.yaml` referencing those experts by slug. This\nmakes the stock experts editable (with `council expert edit \u003cslug\u003e`)\nand reusable from your own panels. Migration is **non-destructive**\n(existing user files are never overwritten) and **idempotent** — it\nshort-circuits on subsequent runs and re-registers library DB rows from\ndisk if the database is reset.\n\n## How It Works\n\n1. **Panels** are groups of AI experts with distinct roles, perspectives, and expertise priors\n2. **Deliberation** happens in rounds — experts respond, challenge each other, and build on disagreements\n3. **Memory** persists across sessions — your panel remembers previous discussions\n4. **Synthesis** produces actionable output with areas of agreement and unresolved tensions\n5. **Interruptible** — press Ctrl+C during a debate to abort gracefully; Council saves the partial transcript (`Debate interrupted. Partial results saved.`), and a bare `council resume \u003cpanel\u003e` then re-runs the debate on the same topic (with prior turns in memory) instead of just replaying it\n\n### What Makes Council Different\n\n- **Expertise as prior, not persona** — Experts have distinct _objective functions_, not just different labels. Disagreement emerges naturally from weighing evidence differently.\n- **Anti-sycophancy by design** — 3-layer system prevents experts from agreeing with each other reflexively: forbidden phrases, mandatory disagreement budget, identity stakes.\n- **Persistent memory** — Experts remember past positions, updated priors, and unresolved questions across sessions. By default, an LLM extraction pass runs at the end of each debate and persists structured memory per expert; the next debate recalls that distilled context instead of a heuristic scan. Pass `--heuristic-memory` to convene/resume to opt out (e.g. for offline or air-gapped runs).\n- **CLI-native** — Built for developer workflows. Pipe-friendly (`--format json`), scriptable, CI-compatible.\n- **Zero key management** — Uses GitHub Copilot SDK. One auth, all models (GPT, Claude, Gemini).\n\n## Commands\n\n```bash\n# Debate orchestration (engine defaults to copilot; pass --engine mock for offline/CI)\ncouncil convene \u003ctopic\u003e                                        # Auto-compose a panel + start deliberation\ncouncil convene \u003ctopic\u003e --template \u003cname\u003e                      # Use a built-in or library panel\ncouncil convene \u003ctopic\u003e --no-conclude                          # Skip the default final conclusion synthesis\ncouncil ask \u003cpanel\u003e \"\u003cquestion\u003e\"                               # One-shot to one expert (active session or saved/library panel; pin with --expert \u003cslug\u003e)\ncouncil conclude [panel]                                       # Decision matrix + recommendation\ncouncil conclude [panel] --timeout 90000                      # Custom synthesis timeout (ms)\ncouncil conclude [panel] --model gpt-4.1                       # Override the synthesis model for this run\ncouncil convene \u003ctopic\u003e --model \u003cmodel-id\u003e                     # Override the per-debate model\ncouncil resume \u003cpanel\u003e                                          # Replay transcript — or auto-continue if the latest debate was interrupted\ncouncil resume \u003cpanel\u003e --prompt \"\u003cprompt\u003e\"                      # Continue the panel with a new round\ncouncil resume --latest                                         # Resume most recently active panel\ncouncil resume \u003cprefix\u003e                                         # Prefix match: unique auto-selects; ambiguous opens a picker (TTY) or lists + exits non-zero\ncouncil export \u003cpanel\u003e --format \u003cfmt\u003e                          # Export (markdown | json | adr)\n\n# Safety: every entry point (convene, ask, chat, in-REPL @convene) runs a warn-only\n# topic-admission check first — sensitive topics emit \"⚠ This topic touches sensitive\n# areas (…)\" but are never blocked.\n\n# Persistent conversational chat (Phase 5) — engine defaults to copilot\ncouncil chat \u003cexpert-slug\u003e                       # 1:1 conversational REPL with an expert\ncouncil chat \u003cpanel-name\u003e                        # Group chat with a panel (supports @mentions, @convene)\n# Panel chat prints the addressable expert roster at startup (e.g. \"Experts:\n# @sasha-cfo, @diego-cto …\"); address one with @\u003cslug\u003e. Display-name mentions\n# like @\"Sasha Lin\" are rejected with a hint, never silently broadcast.\ncouncil chat \u003ctarget\u003e --new                      # Archive active session and start fresh\ncouncil chat --list                              # List every chat session across all targets (no engine needed)\ncouncil chat \u003ctarget\u003e --history                  # Show active + archived sessions read-only (no engine needed)\n\n# Expert library (Phase 4)\ncouncil expert create [--persona]           # Interactive wizard; also recreates ghost experts when \u003cslug\u003e.yaml is missing\ncouncil expert list [--format json]         # Browse the expert library\ncouncil expert inspect \u003cslug\u003e               # Full detail + panel memberships; trained personas include Learned Profile / JSON `profile`\ncouncil expert edit \u003cslug\u003e                  # Open YAML in $EDITOR; re-validates on save\ncouncil expert delete \u003cslug\u003e [--force]      # Refuses if expert is in any panel\ncouncil expert docs \u003cslug\u003e                  # Manage a persona expert's reference-docs folder\ncouncil expert train \u003cslug\u003e [--retrain] [--file \u003cpath\u003e...] [--url \u003curl\u003e...]   # (Re-)run the persona profile analyzer; --file/--url ingestion is atomic (a failed input aborts before any file is added)\n\n# Panel library (Phase 4)\ncouncil panel create \u003cname\u003e                 # Interactive wizard: pick experts, set description + mode\ncouncil panel save \u003csession\u003e [name]         # Promote an auto-composed convene session into a reusable library panel\ncouncil panel list [--format json]          # Browse panels in the library\ncouncil panel inspect \u003cname\u003e                # Panel metadata + resolved expert roster\ncouncil panel edit \u003cname\u003e                   # Open YAML in $EDITOR; re-validates on save\ncouncil panel delete \u003cname\u003e [--yes]         # Remove panel YAML + docs dir + DB rows (--yes skips prompt; hidden --force alias still works)\ncouncil panel docs \u003cname\u003e                   # List a panel's indexed docs (DB read; add `list \u003cname\u003e --refresh` to re-scan)\ncouncil panel docs link \u003cname\u003e --path \u003cp\u003e   # Link an external folder into a panel's RAG corpus (prompts; --yes to skip)\ncouncil panel docs unlink \u003cname\u003e --path \u003cp\u003e # Unlink a folder + clean up its FTS entries\n\n# Configuration\ncouncil config show                         # Print effective config values with sources\ncouncil config path                         # Print config file path\ncouncil config edit                         # Open config in $EDITOR\ncouncil config set \u003ckey\u003e \u003cvalue\u003e            # Set a single config value (dot-notation key)\ncouncil config model [name]                 # Set the default AI model: interactive picker on a TTY, or pass a name (non-interactive with no name lists models and exits non-zero)\ncouncil config wizard                        # Guided interactive setup for common config values\n\n# Inspection \u0026 diagnostics\ncouncil sessions                            # List all debate sessions (with status/turns/experts)\ncouncil sessions cancel [name]              # Cancel running debates (mark interrupted); --all for every panel\ncouncil sessions delete \u003cname\u003e              # Delete a completed/interrupted session (prefix match, confirm unless --yes, blocks if running)\ncouncil templates                           # List built-in panel templates with descriptions\ncouncil templates inspect \u003cname\u003e            # Show template details (experts, mode, rounds)\ncouncil memory list                         # Show what experts remember\ncouncil memory inspect \u003cpanel\u003e              # Per-panel + per-expert memory detail\ncouncil memory reset \u003cpanel\u003e --yes          # Destructive: clear debate state\ncouncil models                              # List available Copilot models (live discovery with static fallback)\ncouncil doctor                              # Diagnose setup issues (incl. terminal capabilities)\n\n# Document formats and health\ncouncil docs formats                        # List supported formats, AI-extraction status, size limit\ncouncil docs review \u003cpanel\u003e                 # List files that failed extraction or are unsupported\n                                            #   (exits non-zero when any are present — CI-friendly)\ncouncil docs extract \u003cpanel\u003e                # Extract files held for review (ask mode); prompts to confirm\ncouncil docs extract \u003cpanel\u003e --yes          # Skip confirmation (non-interactive/CI runs)\ncouncil docs doctor \u003cpanel\u003e                 # Document-health diagnostics for a panel\n\n# Global flags available on all commands\ncouncil \u003ccommand\u003e --quiet                   # Suppress panel roster, setup output, and cost indicators\n                                            #   (preserves debate transcript and conclusion)\n\n# ASCII mode (environment-driven, not a flag)\n# Set COUNCIL_ASCII=1, NO_COLOR=1, or TERM=dumb to force ASCII symbols\nCOUNCIL_ASCII=1 council convene \"Topic\"\n```\n\n\u003e `council sessions` (default `--format plain`) shortens each session's topic to\n\u003e 80 characters, appending `...`, so long topics stay on one scannable line.\n\u003e `--format json` is unaffected: it streams the full session record as NDJSON\n\u003e (one JSON object per line) with the complete, untruncated topic for scripting.\n\n\u003e Configuration lives in `~/.council/config.yaml` (auto-created on first run).\n\u003e Manage it with `council config show|path|edit`.\n\n\u003e `council config show` first prints the resolved filesystem locations, then the\n\u003e effective values (each annotated with its source). The path fields are:\n\u003e\n\u003e - **Config path** — the `config.yaml` currently in effect.\n\u003e - **Council home** — holds the config file and the `council.db` database\n\u003e   (default `~/.council`; override with `COUNCIL_HOME`). When `COUNCIL_HOME` is\n\u003e   unset, `COUNCIL_DATA_HOME` also relocates the Council home, so a single\n\u003e   `COUNCIL_DATA_HOME` override moves the config file and `council.db` alongside\n\u003e   the data home.\n\u003e - **Data home** — holds experts, panels, and documents (default `~/Council`;\n\u003e   override with `COUNCIL_DATA_HOME` or the `paths.dataHome` config value).\n\u003e - **Experts directory** / **Panels directory** — always `\u003cdata home\u003e/experts`\n\u003e   and `\u003cdata home\u003e/panels`.\n\u003e - **Database** — the SQLite file at `\u003ccouncil home\u003e/council.db`.\n\n\u003e **Local database requirements:** Council's `council.db` runs in SQLite\n\u003e **WAL** (write-ahead logging) mode. On open it applies `PRAGMA busy_timeout =\n5000` — so a momentarily locked database is retried for up to five seconds\n\u003e before erroring — and then `PRAGMA journal_mode = WAL`. If the filesystem\n\u003e holding the Council home cannot honour WAL (some network and virtualised\n\u003e mounts — e.g. certain NFS/SMB/9p shares — do not), startup fails fast with\n\u003e `Failed to enable SQLite journal mode WAL; got \u003cmode\u003e`. Point `COUNCIL_HOME`\n\u003e at a local, WAL-capable filesystem to resolve it.\n\n\u003e **Plural aliases**: `council panels`, `council experts`, and `council history` work as\n\u003e aliases for `council panel`, `council expert`, and `council sessions` respectively —\n\u003e use whichever feels more natural.\n\n## Roadmap\n\nSee [ROADMAP.md](./ROADMAP.md) for the high-level plan and [IMPLEMENTATION-PLAN.md](./IMPLEMENTATION-PLAN.md) for implementation details.\n\n**Current focus:** Phase 8 — Growth \u0026 Ecosystem (`gh` extension, GitHub Action, direct provider APIs). Council already ships on npm as [`@council-ai/cli`](https://www.npmjs.com/package/@council-ai/cli), so the [Quick Start](#quick-start) `npm install -g @council-ai/cli` installs the released CLI.\n\n## Contributing\n\nWe welcome contributions! The easiest way to start: **create a panel template** (YAML file in `packages/cli/panels/`) and submit a PR.\n\nSee [docs/DEVELOPMENT-WORKFLOW.md](./docs/DEVELOPMENT-WORKFLOW.md) for development setup.\n\n## License\n\nMIT © Pedro Fuentes\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedrofuentes%2Fcouncil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpedrofuentes%2Fcouncil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedrofuentes%2Fcouncil/lists"}