Repository navigation
Releases
Releases · LevapVeeskela/lv24-opencode-consilium
v1.12.1
Full Changelog: v1.12.0...v1.12.1
Python MCP launcher
pip install lv24-opencode-consiliumnow installs three console scripts:
consilium,consilium-mcpandlv24-opencode-consilium.consilium-mcpstarts the same stdio MCP server through
npx --yes --package lv24-opencode-consilium@<version> consilium-mcp.- Arguments, environment and exit codes are forwarded; interrupted runs exit 130.
python -m lv24_opencode_consilium.mcpworks without the console script.- Node.js >= 18, npm/npx and OpenCode remain prerequisites; npm remains canonical.
Isolation hardening
--isolate --read-onlynow fails fast with CLI exit2when the repository
contains.opencode/opencode.jsonc, before any worktree, hook or agent. The
error includes the path and both remedies: rename it to
.opencode/opencode.json, or use--allow-write.- Tracked and untracked
.jsoncfiles are both rejected intentionally
(fail closed); the library/MCP/plugin surface receives a typed
IsolationConfigErrorwithcode: ISOLATION_JSONC_UNSUPPORTED. - Worktree cleanup canonicalizes paths and matches registered worktrees by
basename as well as path. A live worktree is never treated as unregistered
when git reports a macOS/private/varpath or a Windows 8.3/long path. - Directories that still contain a worktree
.gitmarker are never age-collected
as crumbs.
Cross-platform coverage
- New manual-only
worktree-testsGitHub Actions workflow runs the worktree
suites on Ubuntu, Windows and macOS (Node 24, pinned actions, no secrets). - Added Windows file-lock/Unicode/space/long-path cases and macOS
symlink/realpath/cancellation cases. - Workflow is
workflow_dispatchonly; the whole matrix is green.
Tests
- 601 JavaScript tests (599 passed, 2 platform-specific skipped) and 16 Python
launcher tests. tsc --noEmit, build, wheel/sdist +twine check, and actionlint pass.
Install
npm install -g lv24-opencode-consilium@1.12.1
pip install lv24-opencode-consilium==1.12.1
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.12.1v1.12.0
Full Changelog: v1.11.0...v1.12.0
Managed read-only worktrees
--isolatenow creates a Consilium-managed git worktree per agent under
.consilium/worktreesinstead of delegating to OpenCode's native worktree.- Each worktree is based on
HEADplus tracked staged/unstaged changes
(git stash create); untracked files are not copied. - With
--read-only, V2agents.<name>.permissionsand V1
agent.<name>.toolsare applied inside each worktree; the main project
overlay is not touched during isolation. - Worktrees are removed after every call (success, error, cancellation), and a
conservative stale cleanup handles crashed runs. - Non-git projects fail before any model call; watch ignores
.consilium/worktrees.
MCP replay and streaming
- New
consilium_replaytool restores a saved run's task, experts, chair,
models and replayable options, then runs the council again. - Progress is streamed through
notifications/progresswith the same
progressTokencontract asconsilium_run. - Callers can override
read_only,isolate,artifacts,output_file,
max_cost,deadline_ms,rounds,findings,sessionandtimeout_ms. - Replay shares the execution/cancel path with
consilium_run; paths remain
workspace-confined.
Automated eval reports
- New
npm run eval:report/scripts/eval-report.mjsvalidates recorded
eval --jsonandeval --compare-rounds --jsonoutput and renders
docs/eval-results.md. - The generator refuses invalid or incomplete JSON and never invents numbers.
- The 22-fixture corpus and the manual fallback template remain; measured model
results still require a working provider.
Fixes and hygiene
- POSIX Python launcher tests no longer depend on
dirnamewhen the fake
npxPATH is intentionally minimal. - MCP replay tests cover managed worktrees, read-only overlays, progress,
cancellation and path confinement. - 588 JavaScript tests and 9 Python tests.
Install
npm install -g lv24-opencode-consilium@1.12.0
pip install lv24-opencode-consilium==1.12.0
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.12.0v1.11.0
Full Changelog: v1.10.0...v1.11.0
Read-only and isolated runs
--read-onlyrestricts experts and the chair toread,globandgrep.
Write/edit/patch/shell/webfetch/websearch/subagent/question/MCP tools and
external-directory access are denied;.envstays unreadable.- Enforcement uses a temporary
.opencode/opencode.jsonlayer with V2
agents.<name>.permissionsand V1agent.<name>.tools, a lock, a backup and
byte-exact restore on success, error, cancellation and exit. - Invalid JSON, an existing
.opencode/opencode.jsoncand symlinked layers fail
closed instead of silently running without enforcement. auditand the composite GitHub Action are read-only by default;
--allow-write/read-only: falseopt out.--isolateruns each agent in an OpenCode-managed git worktree.- The effective policy is recorded in
metadata.safety.
MCP artifact tools
Four read-only tools that never call a model:
consilium_list_runs— newest saved runs with id, task, success and finding counts.consilium_get_run— fullrun.jsonfor an id orlatest.consilium_sarif— SARIF 2.1.0, in the response or atomically in the workspace.consilium_diff_runs— markdown comparison of two saved runs.
consilium_run also accepts read_only and isolate.
Ticket reports
--report jirarenders Jira wiki markup (h2.,||...||,{code}).--report linearrenders clean Linear Markdown..jiraand.linearare inferred by--report-file; explicit--report
works with any filename.- Both include verdict, models, cost, duration, findings, rejected positions and
parse errors; empty findings produce a valid report.
Evaluation
- The deterministic corpus grows from 10 to 22 fixtures, covering injection,
authorization, concurrency, reliability, SSRF/path traversal, data integrity,
pagination/caching and prompt injection. - No benchmark numbers are fabricated or committed:
docs/eval-results.md
contains the reproducible commands and reporting template. A measured table
requires a real model provider. - V1
tools/permissionnow migrate to ordered V2 rules;temperature/
top_p/maxStepsstill block migration with a warning. - 561 JavaScript tests and 9 Python tests.
Release hygiene
- npm source maps now embed
sourcesContent, so stack traces work from the
packaged tarball. - Python launcher tests run in the PyPI workflow before building.
- GitHub Actions are pinned to Node 24-compatible releases.
AGENTS.mddocuments the repository map, invariants and release flow.
Install
npm install -g lv24-opencode-consilium@1.11.0
pip install lv24-opencode-consilium==1.11.0
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.11.0v1.10.0
Full Changelog: v1.9.0...v1.10.0
PyPI (new distribution channel)
pip install lv24-opencode-consiliuminstalls a thin, dependency-free Python launcher.- Its
consiliumandlv24-opencode-consiliumconsole scripts delegate to the npm CLI throughnpx. - Node.js >= 18, npm and the OpenCode CLI remain prerequisites; npm stays canonical.
- Pinning:
CONSILIUM_NPM_VERSION=1.10.0(orlatest) selects the npm version the launcher runs. - Publishing uses PyPI Trusted Publishing (OIDC) from
.github/workflows/pypi-publish.yml:
no API token, no password, no OTP. A GitHub release publishes npm and PyPI. - Guide:
docs/pypi.md
SARIF export and GitHub code scanning
- New
consilium sarif [--run <id|latest>] [--output <file>]exports SARIF 2.1.0
from saved artifacts without re-running the council. - The composite GitHub Action now:
- runs the review with
--artifacts; - exports the newest run with
consilium sarif --run latest; - uploads it with
github/codeql-action/upload-sarif; - exposes
sarif,sarif-fileandcategoryinputs.
- runs the review with
- Requires
security-events: writeand code scanning enabled for the repository.
SARIF export/upload failures usecontinue-on-errorand never mask the gate.
Also
- Version consistency now covers
python/pyproject.tomland__version__. - 522 JavaScript tests and 5 Python tests.
- Documentation updated in English, Russian and Chinese.
Install
npm install -g lv24-opencode-consilium@1.10.0
pip install lv24-opencode-consilium==1.10.0
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.10.0v1.9.0
Full Changelog: v1.8.0...v1.9.0
SARIF and code scanning
--report sarifemits SARIF 2.1.0 for GitHub code scanning and other SARIF viewers.- One result per finding;
critical/high→error,medium→warning,low/info→note. - File/line locations, stable fingerprints, one rule per category, sources/contested in properties.
--report-file report.sarif(or.sarif.json) infers the format; upload withgithub/codeql-action/upload-sarif.
Debate evaluation
consilium eval --compare-roundsruns every fixture with one and two rounds and prints a delta table:
catch rate, false-positive rate, p50 latency and total cost, plus a verdict.consilium eval --rounds 2runs the suite in debate mode.--fail-undergates the debate catch rate;--max-costcovers both runs.
Scheduled audits
docs/scheduling.mdcovers cron, Windows Task Scheduler, launchd and GitHub Actions for
consilium audit --since <ref>with--deadlineand--max-cost.- Runnable wrappers:
examples/consilium-audit.sh,examples/consilium-audit.ps1and
examples/consilium-audit-nightly.yml(outside.github/workflows/— nothing runs automatically here).
Also
- 515 tests.
- npm publishing now runs through Trusted Publishing (OIDC): publishing this release triggered
.github/workflows/npm-publish.yml, which published the version with provenance — no token or OTP.
Install
npm install -g lv24-opencode-consilium@1.9.0
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.9.0v1.8.0
Full Changelog: v1.7.0...v1.8.0
Debate rounds
--rounds 2adds a second expert round: each expert sees anonymized peer answers (A/B/C), critiques errors and omissions, and states a final position.- The expert's own first-round answer is included for continuity; peer answers are marked as untrusted data and never reveal agent names.
- The chair receives the final positions plus a note listing which experts changed their position;
metadata.debate = { rounds, participants, changed }. - Round 2 doubles model calls and is skipped when fewer than two experts succeeded, the deadline fired, or
--max-costis already exceeded. Findings are collected from the final answers.
init --local
- Probes Ollama (
/api/tags) and LM Studio (/v1/models) for model lists. - Assigns models round-robin to
arch,ux,ba,secand the chair, and writesconsilium.config.jsonwithlocalOnly: true. --dry-runprints the assignment;--jsonprints the proposed config; refuses to overwrite without--force; merges existing timeouts/retry/report settings.
consilium audit --since
- Builds an untrusted
<ref>...HEADdiff and runs the council end-to-end, reusing reports, artifacts and--fail-on. --dry-runprints the ref, file count and truncation flag without calling models.--sinceis required and validated (no shell metacharacters); schedule from cron, Task Scheduler or CI — no daemon.
Also
- Custom presets, local-only privacy and deadlines from 1.7.0 remain unchanged.
- 491 tests, no missing public exports.
Install
npm install -g lv24-opencode-consilium@1.8.0
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.8.0v1.7.0
Full Changelog: v1.6.0...v1.7.0
Deadlines and partial synthesis
--deadline <ms>(configdeadlineMs) caps the expert phase at up to 24 hours.- When the deadline fires, in-flight experts are cancelled, finished answers are kept, and the chair synthesizes them with an explicit note listing how many experts finished and which roles are missing.
metadata.deadline = { limitMs, hit, completed, missing }.- Zero completed experts skip the chair and fail with
errorCode: DEADLINE; a partial run with at least one expert succeeds. - The timer is cleared on every path; user cancellation still wins.
Local and privacy mode
--local-onlyrequires an explicit local model (Ollama, LM Studio, llama.cpp, vLLM) for every expert and the chair — no implicit cloud fallback.models --localfilters the ranked catalog;models --probe-localreports whether local providers are running.- The guarantee is enforced in the library, CLI, MCP and plugin, not just one entry point.
doctoradds alocal-providerscheck that fails whenlocalOnlyis on and no provider is reachable.
Custom presets
presetsinconsilium.config.jsonmerge over the built-ins; a custom preset can override a built-in name.consilium presets [--json]lists the merged set.- Custom presets work in the CLI (
--preset docs), MCPconsilium_runand the V2 plugin; the MCP/plugin schemas no longer reject unknown preset names before config lookup.
Fixes
- The trusted-project-config marker is now an enumerable symbol, so it survives object spreads used by presets, deadline prompts and CLI overrides (this fixes trusted
.cmdOpenCode paths on Windows). localOnlyvalidation also rejects agents without an explicit model instead of silently allowing a cloud fallback.
Install
npm install -g lv24-opencode-consilium@1.7.0
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.7.0v1.6.0
Full Changelog: v1.5.0...v1.6.0
Evaluation harness
consilium evalruns a deterministic planted-bug corpus (10 fixtures) with claim/file/severity matching — no LLM judge.- Reports per-fixture caught/missed/false positives, aggregate catch and FP rates, p50 latency and cost.
--fail-under <pct>exits3below the threshold;--max-coststops the suite at the budget.- Fixtures ship in
eval/fixtures; the format is documented ineval/README.md.
Context pack
--context autoadds changed files, the nearestAGENTS.md, related tests and recent commits to the task.- Priority rules → files → tests → commits, 48k chars total, 12k per file, 20 files; binary/lock/generated files are skipped.
- Every section is wrapped in
<untrusted-*>markers so repository text cannot act as instructions.
Reliability memory
- Model outcomes, error codes and latency are stored in
.consilium/reliability.json. consilium models --reliabilityprints the table; ranking accepts an optional reliability bonus after 3+ attempts.- Best-effort writes: a blocked/unwritable
.consiliumnever fails a run.
GitHub Action
- Composite action at
.github/actions/consilium: reviews a PR diff, posts/updates one comment with the<!-- consilium:report -->marker, then propagates the gate exit code. - Fork PRs are skipped by default; pin the npm version with the
versioninput. Guide:docs/github-action.md.
Findings and history
- Fuzzy claim merging deduplicates paraphrased findings (Jaccard + containment, same file/category).
consilium history [--limit N]lists recent runs;consilium stats [--json] [--html <file>]aggregates success rate, p50/p95, cost, findings, per-model errors and top failure codes.
Quality
- The published plugin type no longer imports
@opencode/plugin; the.d.tsis self-contained. - Version is single-sourced across package/config/MCP/example/llms/workflow and covered by a test.
- Bins are executable in git.
Install
npm install -g lv24-opencode-consilium@1.6.0
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.6.0v1.5.0
Full Changelog: v1.4.3...v1.5.0
Structured findings and a policy gate
--findingsmakes every expert and the chair return a validatedfindings[]JSON block: severity, category, file, line, claim, evidence, confidence. The chair also lists positions it rejected with reasons.- Findings are deduplicated by a stable fingerprint (category + file + normalized claim, line excluded), merged across roles with the maximum severity, and marked
contestedwhen rejected. metadata.findings={ items, counts, rejected, parseErrors }; HTML and PR reports render the findings table and a collapsible dissent ledger. Malformed JSON never fails a run.--fail-on <severity>gates on new findings; exit code3means the gate failed.consilium baseline accept|prunemanages.consilium/baseline.json, so accepted findings are ignored by the gate and can be shared with the team.
Correctness
- Config: per-agent V1/V2 precedence across layers, per-file parse warnings, explicit
chair.modelwins,excludedAgentsvalidation. - Models: cached fallback survives total network failure,
minContextapplies to fresh fetches, dedupe prefers available copies, the chair agent is always emitted byinit --free, missing cost telemetry is no longer fabricated as0. - Runner: SIGKILL escalation survives settle,
RATE_LIMITEDretries without an explicit delay, timeouts clamp to the Node maximum, sessions requireses_, CLI command words only atargv[0],--no-artifactsno longer breaks replay lookup, fallback chains use the configured length. - Watch/reports: reruns are queued during an active run, signals registered before the first run,
envshebangs accepted, presets no longer empty the council, consensus has explicit no-data states, smart selection respectsmax, MCP progress totals match the selected council.
Also
/councilOpenCode slash command template (.opencode/commands/council.md).- 317 tests.
- No missing public exports across all 22 subpaths; new findings/baseline helpers are additive.
Install
npm install -g lv24-opencode-consilium@1.5.0
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.5.0v1.4.3
Full Changelog: v1.4.2...v1.4.3
Security hardening
- Project config is untrusted by default. A repository's
consilium.config.jsonmay define models, experts, prompts and presets, but process/path keys (opencodePath,opencodeArgs,autoApprove,cwd,opencodeConfigPath, stringoutput.file,reportFile, stringartifacts) are ignored with a warning. Pass the file explicitly with-cto trust it. - Windows spawn:
.cmd/.batshims run throughcmd.exeonly after every argument passes a strict allowlist;.exeand POSIX binaries spawn directly. Bareopencodeis resolved through PATH. - MCP:
tools/callrequires anid, the queue is capped at 16, cancelled queued calls are skipped,output_fileand artifact paths are confined to the workspace, andconsilium_init_freewrites.bakfiles and requiresconfirm: truewithforce. - Injection: dynamic diff fences with untrusted-data markers; report inline code and markdown links are escaped.
- Artifacts: atomic run directories, case-insensitive expert filenames, token redaction, automatic
.consilium/.gitignore; reports are written atomically.
Compatibility
- No missing public exports across all 22 subpaths (one additive export:
PathContainmentError). - 246 tests pass.
Install
npm install -g lv24-opencode-consilium@1.4.3
docker pull ghcr.io/levapveeskela/lv24-opencode-consilium:1.4.3