This release includes 4 security fixes for security teams reviewing exposed deployments.
Topics
+14 more
Affected surfaces
Summary
AI summaryUpdates Run verification and correctness, Observability, and Packaging across a mixed release.
Full changelog
v3.8.3
A bug-fix release. Most of this wave came out of running the published wheel end to end with a free local model, which surfaced a chain of "green status, no artifact" defects across adapter selection, run verification, and the observability surface. Nothing here changes a public API; upgrade in place.
Adapter selection and routing
- Startup adapter detection now covers the full adapter registry and states when an explicit adapter is pinned instead of claiming auto-routing (#2779).
- An explicit adapter selection is no longer overridden by model-name inference: a route id like
openai/gpt-oss-20b:freeunder a pinned qwen run no longer hijacks the spawn to another adapter (#2776). - Adapter selection in the seed file and
--clinow validates against the live registry rather than three separate stale allowlists, so every registered adapter is actually selectable (#2826). - The qwen adapter stops passing a flag qwen-code removed, which broke spawns whenever a Tavily key was set (#2766); zero-config spawn works for adapters that pick the model server-side (#2753).
Run verification and correctness
path_existscompletion signals are verified against the operator checkout, not the agent's ephemeral worktree, so a gitignored or unmerged file no longer reports the task done with nothing delivered (#2778).- Running on the repository default branch now fails fast with an actionable message and reports the run as unhealthy, instead of discarding every agent's work and printing a clean summary (#2780).
- The scheduled dependency scan no longer audits the orchestrator's own tool venv or injects dozens of foreign upgrade tasks into a scoped run; it is scoped to the target repo's declared manifests, skips its own first tick, and can be turned off (#2825).
- The recovery watchdog now launches from a runnable module, so it actually starts from the published wheel instead of failing silently (#2824).
bernstein democompletes its mock tasks, exits nonzero when they all fail, reports a consistent count, points at a real follow-up command, and cleans up its own processes (#2828).- A merge-back that fails for a non-conflict reason no longer force-deletes the branch holding an agent's only committed copy: the work is preserved to a graveyard ref, the failure is logged at error level, and the task is failed under a bounded retry budget instead of looping (#2832).
Observability
- Live OTLP bridge: the run journal's signed, chain-anchored span projection now streams to any stock OpenTelemetry collector, live during a run and via
bernstein telemetry export-otelbackfill, so orchestrator spans appear in existing tracing stacks with deterministic ids (#2771). bernstein telemetry verify-spanproves a single exported span against the run journal and audit chain: it recomputes the span id from the referenced journal entry and checks the chain anchor, rejecting any span that does not recompute (#2827).
Security
- The webhook secret is no longer written to logs (#2775).
- The identity grant secret is no longer persisted in clear text; the stored reference is a salted hash, and existing chains stay verifiable (#2777).
pyasn1is bumped to 0.6.4 to clear CVE-2026-59885 and CVE-2026-59886 (#2821).
CLI and configuration
- The CLI status, cost, and recap probes resolve the effective server port instead of a hardcoded default, so a run started on a non-default port is reachable (#2819).
- A detached run now persists its auth token to a 0600 file so out-of-process
status,cost, andrecapcan authenticate; a rejected credential is now reported distinctly from an unreachable server (#2830). The browser-dashboard case is tracked separately. - Startup cost lines use the submitted task count (#2752); the first spawn outcome is surfaced before a non-interactive run exits (#2754); unknown top-level seed keys warn with a nearest-match suggestion (#2755); the seed parser accepts
role_model_policy.<role>.endpointand drops unread top-level sections from shipped seed files (#2759, #2757); evolution stops warning about locked files in non-source workspaces (#2750).
Packaging
- The published container image is runnable by default: its entry command no longer points at a removed command, and a foreground
servemode lets the image host a coordinator node (#2829). Multi-arch (arm64) images are tracked separately.
Thanks
Thanks to the external contributors in this release:
- @Sanjays2402 - dropped the removed qwen web-search flag that broke spawns (#2766) and passed the configured model through to the agy adapter (#2813)
- @sairajkasam - the live OTLP bridge that streams chain-anchored journal spans to OpenTelemetry collectors (#2771)
- @AnayGarodia - persisting the effective server port so CLI probes reach a run started on a non-default port (#2819)
Security Fixes
- pyasn1 bumped to 0.6.4 – clears CVE-2026-59885 and CVE-2026-59886
- Webhook secret no longer written to logs
- Identity grant secret stored as salted hash instead of clear text
- CVE-2026-59886
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About chernistry/bernstein
Deterministic multi-agent orchestrator for 18 CLI coding agents (Claude Code, Codex, Cursor, Aider, Gemini CLI, OpenAI Agents SDK, and more). MCP server mode (stdio + HTTP/SSE) exposes the orchestrator to any MCP client. Git worktree isolation per agent, HMAC-chained audit trail, cost-aware model routing via contextual bandit. ~11K monthly PyPI downloads, Apache 2.0.
Related context
Related tools
Earlier breaking changes
- v3.7.1 `bernstein approve` and `bernstein reject` now enforce identifier regex `[A-Za-z0-9._-]{1,64}`.
- v3.7.1 Tampered mission ledger reports as unverified rather than not-found.
- v3.7.1 `mission define` now refuses phases without gate tasks.
- v3.5.0 MCP client, transport, and gateway become stateless; calls carry content‑derived trace IDs in _meta.
Beta — feedback welcome: [email protected]