All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.5.0 - 2026-04-20
- Supervisor evaluation loop — the Supervisor is now an active quality gate, not advisory only. When it rejects an agent output (
approved: false), the orchestrator re-invokes the agent with the flags and recommendation appended as feedback, up toCOUNCIL_EVAL_RETRIEStimes (default: 2 → 3 total attempts). If the retry budget is exhausted and the output is still flagged, the result is surfaced anyway with the flags visible — no silent passes. COUNCIL_EVAL_RETRIESenv var — clamped to[0, 5]. Set to0to restore pre-0.5 advisory-only behaviour. Non-integer values fall back to the default.- Retry count recorded in
session.metrics.eval_retries, visible viaget_council_stateand in the result summary footer. supervisor_feedbackfield added toAgentInvokeOptions; Executor and Aide prompts render a clearly-delimited--- SUPERVISOR FEEDBACK ---block when set.- First test suite for the repo — 160 tests across 15 files covering config, schemas, stores, agent invokers, the feedback formatter, the eval loop, orchestrator routing, and integration tests for FileStore and SQLiteStore against real temp dirs.
- CI now runs
npm teston every push (newTestjob inci.yml) and as part of PR validation (pr-check.yml).
- Spurious first-call
INVALID_JSON_RESPONSEfailures — the claude CLI occasionally emits JSON wrapped in prose ("Here's the output: {...} Let me know!") or produces a single flaky sample (missing field, wrong enum) on the first try. A strictJSON.parse+ schema check rejected both, surfacing asINVALID_JSON_RESPONSEbefore the Supervisor evaluation loop ever ran. Fixed with two new layers:parseAgentJsonextracts JSON via fence-match → balanced-brace extraction (string-aware, so braces inside JSON string values are not mis-counted) → raw trimmed, returning the first candidate that parses.runAgentWithValidationwrapsrunAgent+ parse + Zod validation with a one-shot retry on parse/validate failure. Transient flakiness recovers silently; CLI transport errors still propagate unchanged.
- All 4 agent invokers (Chancellor, Executor, Aide, Supervisor) now route through
runAgentWithValidation— removes ~80 lines of duplicated fence-match + parse + validate boilerplate. External behaviour is unchanged on success; failures are rarer and still produce the sameCouncilErrorcode (INVALID_JSON_RESPONSEfor Chancellor/Executor/Aide,SUPERVISOR_ERRORfor Supervisor) on final give-up. FileStoreandSQLiteStoreaccept a storage path via constructor argument. Default is still~/.council/sessionsand~/.council/council.dbrespectively; the parameter exists so integration tests can use temp dirs instead of polluting the user's home directory.
0.4.0 - 2026-04-20
- Per-agent tool access — Chancellor and Aide now have tool access, configurable via
AGENT_TOOLSconstants:- Chancellor:
Read,Glob,Grep(read-only — inspects codebase before planning, never writes) - Executor:
Read,Write,Edit,Bash,Glob,Grep(unchanged) - Aide:
Read(can read files before transforming them) - Supervisor: none (pure review, no side effects)
- Chancellor:
AGENT_TOOLSconstant insrc/domain/constants/index.ts— single source of truth for all per-agent tool sets- Chancellor and Aide system prompts updated to describe their tool capabilities and when to use them
- Removed
runExecutorWithToolsconvenience wrapper — Executor now usesrunAgent+AGENT_TOOLS.EXECUTORdirectly, consistent with all other agents - Caveman token compression — reduce internal agent output tokens by 50-60% with no accuracy loss. Inspired by Caveman. Set
COUNCIL_CAVEMANin the MCP env block:off(default) — no compression, unchanged behaviourlite— drops filler and pleasantries, keeps grammar (~20% savings)full— fragments, flat bullets, explicit 50% word budget (~50-60% savings, recommended)ultra— telegraphic abbreviations and symbols (~60-70% savings)
- Compression applies to Chancellor, Executor, and Aide. Supervisor is exempt — its recommendation field is user-facing prose.
- Active mode recorded in
session.metrics.caveman_mode, visible viaget_council_state
0.3.0 - 2026-04-18
- Persistent session memory — sessions now survive MCP server restarts via an optional
COUNCIL_PERSISTenv var:memory(default) — in-process LRU Map, no breaking changefile— JSON files at~/.council/sessions/<id>.json, zero dependenciessqlite— SQLite at~/.council/council.dbviabetter-sqlite3, WAL mode for safe concurrent access
SessionStoreinterface — all backends implement a common contract; swappable without touching orchestration code- 7-day session TTL — file and SQLite backends auto-expire sessions older than 7 days on startup
- Startup validation — unknown
COUNCIL_PERSISTvalues emit a warning and fall back to memory
0.2.3 - 2026-04-13
- README diagrams replaced with hosted images — architecture, orchestration flow, and session lifecycle diagrams now render correctly on all platforms including GitHub, npm, and PyPI mirrors
0.2.2 - 2026-04-13
install.shnow also runsclaude mcp addto register the server with Claude Code CLI — previously only Claude Desktop was configured, so the tools were invisible in the CLIinstall.ps1rewritten to match: detectsclaudebinary, falls back toANTHROPIC_API_KEY, configures both Claude Desktop and Claude Code CLIrunner.tsstripsANTHROPIC_API_KEYwhen set to an empty string — Claude Desktop injects an empty key into the MCP server env, causing the childclaudeprocess to attempt API key auth and fail with exit 1
0.2.1 - 2026-04-12
- Replace
@anthropic-ai/claude-agent-sdkwith directclaudeCLI subprocess calls — eliminates 401 auth errors for users authenticated via Claude.ai OAuth (no separate API key needed) - Use
--system-prompt-fileinstead of--system-promptCLI arg — preventsexit 1failures caused by long system prompts with XML tags and special characters - Startup check fails fast with a clear message if
claudeCLI is not in PATH and noANTHROPIC_API_KEYis set install.shandinstall.ps1now detect theclaudebinary location and add its directory to the MCP server PATH automatically
0.2.0 - 2026-04-12
- Supervisor agent (Claude Haiku 4.5) — reviews every Executor step result and Aide task output before they surface to the caller. Non-blocking: if the Supervisor errors, orchestration continues and a warning is logged.
get_supervisor_verdictsMCP tool — retrieve all Supervisor verdicts for a session, with optionalflagged_onlyfilter for quick triage- Supervisor flags in result summary — flagged outputs appear under a
## Supervisor Flagssection in theorchestrateresult supervisoradded toAgentRole— session metrics now track Supervisor invocations alongside Chancellor, Executor, and Aide- PR template — standardised pull request checklist for contributions
- Issue templates — bug report and feature request templates; security reports redirect to GitHub Security Advisories
CODEOWNERS—@iamvirulset as required reviewer on all files
0.1.2 - 2026-04-12
- Release workflow now reconfigures npm registry to
npm.pkg.github.combefore publishing to GitHub Packages, fixingENEEDAUTHon the GitHub Packages publish step
0.1.1 - 2026-04-12
- Published to GitHub Packages as
@iamvirul/council-mcpin addition to npm — package now appears in the GitHub repository sidebar
- Zod runtime schema validation on all agent JSON responses — prevents malformed or injected agent output from propagating to downstream agents
- Hard cap of 10 delegated tasks per Executor response — prevents prompt-injection-driven Aide invocation amplification
- UUID format validation on
session_idandtask_idMCP tool inputs - Max length limits added to
contextandplan_contexttool input fields (previously unbounded) - Code fence extraction regex corrected — non-greedy match prevents incorrect JSON extraction from multi-fence responses
- Silent
catch {}blocks replaced withlogger.warn— state recording failures now visible in logs - Pino async destination flushed on
beforeExit,uncaughtException, andunhandledRejection— prevents log loss on crash
0.1.0 - 2026-04-11
- MCP server with five tools:
orchestrate,consult_chancellor,execute_with_executor,delegate_to_aide,get_council_state - Chancellor agent (Claude Opus 4.6) — strategic analysis, risk assessment, and step-by-step planning via the Agent SDK
- Executor agent (Claude Sonnet 4.6) — plan implementation with access to
Read,Write,Edit,Bash,Glob,Greptools - Aide agent (Claude Haiku 4.5) — simple tasks: formatting, data transformation, utilities
- Complexity-based routing in
orchestrate— trivial problems go to Aide, simple to Executor, complex through the full Chancellor → Executor → Aide pipeline - In-memory session state with LRU eviction cap of 500 sessions to prevent OOM
- Structured JSON logging via pino to stderr (stdout reserved for MCP JSON-RPC)
- Graceful shutdown on
SIGINT/SIGTERM - GitHub Actions workflows: CI (type-check + build + audit), PR check, and release (GitHub Release + npm publish with provenance)
- MIT license
- All logs routed to stderr — MCP stdout never contaminated
- Stack traces never exposed to MCP tool callers
- Session IDs generated with
crypto.randomUUID() - Executor runs with explicit
permissionMode: 'acceptEdits'rather than relying on inherited default @anthropic-ai/claude-agent-sdkpinned to^0.2.101(nolatestin production)