Added
- Per-query cost in API mode (
-g/-c): each provider block, the header
panel and theCompleted infooter show the dollar figure derived from the
OpenRouter catalog and the response's token metrics, and--jsongains
responses.<provider>.cost_usdplusmeta.total_cost_usd(providers +
judge). An unpriceable model is omitted rather than shown as$0.00, and a
total ending in+means at least one response could not be priced. CLI mode
shows nothing about dollars because it is subscription-billed.--rawand
--briefare unchanged. --budget <usd>for batch mode (alsoCONCLAVE_BATCH_BUDGET): stops
dispatching new items once cumulative estimated spend reaches the cap,
lets in-flight items finish, and exits non-zero with a summary naming the
cap, the completed count and the skipped count. Undispatched items stay out
of the checkpoint so--resumecontinues the run. Because cost is measured
post-hoc, overshoot by up to--workersitems is expected.- Opt-in response cache:
--cache[=TTL](24h by default) or
CONCLAVE_CACHE_TTL=<hours>reuses an identical provider response instead of
paying for it twice;--no-cacheoverrides an env-enabled cache. The key is
a sha256 of the mode, provider, model and the full prompt including file and
stdin context, so any context change is a miss. A hit is tagged(cached)in
the progress line and provider block, carriescached: truein--json, and
costs nothing. Judge synthesis is never cached. Works in CLI and API mode;
batch mode honours it per item.conclave cache statsand
conclave cache clearmanage the store. ADR-011. make check: one gate runninggo vet,gofmt -l,go testand
conclave models --check, plus a.github/workflows/check.ymlrunning the
same on ubuntu-latest and windows-latest.- Tests for
internal/batch, which had none: item parsing (malformed line
skipped, missing id assigned, duplicate id dropped), worker fan-out,
rate-limit retry and retry exhaustion, checkpoint resume, cost estimation
precedence, and the budget stop, pluscheckpoint_test.gofor
load/append/corrupt-line handling. - Runtime pricing catalog (
internal/pricing): conclave caches OpenRouter's
public models feed under the user cache directory, refreshes it in the
background once perCONCLAVE_PRICING_TTLhours (default 24), and never
blocks a query on the network once a cache exists.CONCLAVE_NO_PRICING=1
disables it. ADR-009. - Model drift warning: when a configured model id is not in the catalog,
conclave prints one stderr line naming the newest listed alternative and
proceeds. Suppressed under--json,--raw,-q. conclave models [provider] [--check|--refresh|--json|--all]to inspect
current ids, context sizes and API prices, and to gate releases
(--checkexits 2 when a compiled default is missing, 3 when the catalog is unreachable).- OpenRouter as an API-mode backend: in
-gmode any provider token written
as an OpenRouter slug (deepseek/deepseek-v4-pro,anthropic/claude-opus-5)
routes throughopenrouter.ai/api/v1/chat/completions, with the slug as
both provider name and model id. Works in the provider list and--judge;
--allnever auto-includes OpenRouter models. KeyOPENROUTER_API_KEY
(env,.env, or OS keyring);conclave initandkeyring listknow it.
Preflight checks/auth/keyand reports an exhausted spend limit as "no
credit". Drift warnings, display names and batch cost estimates resolve
the slug directly in the pricing catalog. CLI mode rejects slash tokens
(API-only, pay-as-you-go). ADR-010. - The judge is now resolved (and preflighted) before the panel runs, so a
judge that cannot be built fails before any provider is paid for. A
slash-routed judge that is not in the OpenRouter catalog is refused
outright (--skip-preflightsends it anyway); panel members only warn. - Provider lists are trimmed (
"a, b"works); malformed slugs (/model,
model/) and a bareopenroutertoken get specific errors; an
OpenRouter error envelope inside an HTTP 200 surfaces as an error.
Fixed
-
Batch mode no longer discards a result that has already been paid for. A
worker whose send raced a cancelled context threw the result away, so an item
that had been queried and billed left no output line, no checkpoint entry and
no trace it had run. Results are now always handed to the writer. -
An interrupted batch exits non-zero and says how many items were not
dispatched. It previously exited 0, letting a pipeline read a partial JSONL
as the complete answer. -
Provider decorators no longer hide a provider's auth check. Embedding the
Providerinterface does not promote the optionalPreflighter, so wrapping
a provider silently skipped its preflight; every decorator now implements
UnwrapandRunPreflightfollows the chain. -
The response cache no longer deletes an entry before replacing it, which
opened a window where a concurrent reader saw nothing, and it no longer leaks
a temp file when the replacement is refused. -
--budgetwarns when it cannot bind: on a non-batch query, where it does
nothing, and when the pricing catalog is unavailable, where estimates cover
only the built-in providers. -
Batch mode no longer checkpoints items that a cancellation stopped from ever
running, which made--resumeskip them permanently. -
A batch run now keeps a checkpoint even without
--resume, so the resume
hint printed by the budget-stop and interrupt summaries is actually true. -
Error paths in batch mode now carry the spend they incurred, so a failing
judge model no longer makes--budgetunenforceable. -
--jsongainsmeta.total_cost_partial, marking a total that understates
the real spend because something could not be priced. The styled output
already showed this as a trailing+. -
Runtime failures no longer print the whole usage block after the error,
which buried the batch summaries. Argument misuse still shows usage. -
conclave models --checkexits 2 on real drift and 3 when the catalog is
unreachable, somake checkand CI branch on the code instead of matching
message text. -
--jsonnow reports the timeout actually in force as
execution.timeout_seconds. The field existed but was never populated, so it
always read0regardless of-t. -
geminiCLI mode: pass-p(gemini-cli 0.58 treats a positional prompt as
interactive mode and never returns headless) and--skip-trustplus
GEMINI_CLI_TRUST_WORKSPACE=true(exit 55 in any un-trusted directory).
When gemini-cli still fails on auth (Google retired the free Code Assist
OAuth tier it defaults to) and aGEMINI_API_KEYis present, the query
falls back to the direct Gemini API with the same model. Set
security.auth.selectedTypetogemini-api-keyin~/.gemini/settings.json
to keep the CLI route. -
Preflight budget raised 2s → 5s; claude/codex cold starts on Windows were
tripping it.codex login statusprints to stderr, which the old check
never read. -
Auto-
initno longer runs when stdin is not a terminal. A subprocess with
no provider keys visible used to block forever on an invisible prompt and
look like a 110s+ hang. -
openaiCLI-mode preflight askscodex login statusbefore demanding
OPENAI_API_KEY, so ChatGPT-subscription users are no longer rejected.
Remediation text for gemini/openai now says which mode needs what.
Changed
- Default models bumped (all verified live 2026-09-08): openai
gpt-5.5→gpt-5.6-sol, claudeclaude-opus-4-8→claude-opus-5,
grokgrok-4-1-fast-reasoning→grok-4.6(the only id the grok CLI
offers), glmglm-5.2→glm-5.3. Cheap models: grok →grok-build-0.1,
glm →glm-5.3-flash.conclave models --checknow passes clean. - Batch-mode cost estimates now use live per-model prices from the catalog;
the hardcoded table ininternal/batch/processor.gois demoted to an
offline fallback (and its gpt-5-nano input price corrected 0.10 → 0.05). docs/MODEL_REGISTRY.mdrefreshed against the 2026-09-08 feed: GPT-5.6
Sol/Terra/Luna, Claude Fable 5 / 5.1, Opus 5, Sonnet 5, Gemini 3.5–3.8
Flash, Grok 4.20–4.6 and Build 0.1, GLM 5.3 / 5.3 Flash. Notes that all
prices are API-mode only. Adds a Drift Watch section:grok-4-1-fast-*
andglm-4.6v-flashxare no longer listed on OpenRouter.- Line endings pinned to LF via
.gitattributesfor.go,.md,.ymland
the Makefile, so gofmt agrees on Windows and Linux. A fresh worktree on an
autocrlfmachine can still show CRLF until re-checked out; see
docs/CHECK_GATE.mdlandmines. make checkenumerates Go files viago listinstead ofgofmt -l ., which
recursed into nested.claude/worktrees/*checkouts and failed on other
sessions' files.- Makefile
VERSIONnow tracks the release (it reported 1.1.0 for 1.2.0 code).