Skip to content

chernistry/bernstein

v3.8.2 Breaking

This release includes breaking changes for platform teams planning a safe upgrade.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

agent-orchestrator agentic-ai ai-agents aider air-gap audit-trail
+14 more
claude-code cli-tool codex-cli coding-agent deterministic-replay deterministic-scheduler hmac-audit mcp-server model-context-protocol multi-agent parallel-worktrees provenance python reproducibility

Affected surfaces

auth

Summary

AI summary

Fixed local dashboard authentication, restored startup banner, ensured --idle stays on mock adapter, and quieted duplicated LLM preflight notice.

Changes in this release

Bugfix Medium

Local dashboard authenticates its own browser on loopback serve.

Local dashboard authenticates its own browser on loopback serve.

Source: llm_adapter@2026-07-21

Confidence: medium

Bugfix Medium

Restores the startup banner when splash is disabled.

Restores the startup banner when splash is disabled.

Source: llm_adapter@2026-07-21

Confidence: medium

Bugfix Medium

Ensures `bernstein run --idle` stays on the mock adapter.

Ensures `bernstein run --idle` stays on the mock adapter.

Source: llm_adapter@2026-07-21

Confidence: medium

Bugfix Low

Emits internal‑LLM preflight notice once and rewords it.

Emits internal‑LLM preflight notice once and rewords it.

Source: llm_adapter@2026-07-21

Confidence: medium

Full changelog

v3.8.2

Patch release: the local dashboard now authenticates its own browser, the startup banner is restored, --idle runs actually stay on the mock adapter, and a duplicated startup notice is quieted. All four were surfaced by an end-to-end run of the released 3.8.1 build.

Fixed

  • The local dashboard authenticates its own browser on loopback serve (#2739). On bernstein gui serve bound to loopback with dashboard auth configured but BERNSTEIN_AUTH_TOKEN unset, the UI shell loaded but every data panel returned 401: the panels poll the general API, which accepts only the process bearer, while a scoped dashboard token unlocks only the dashboard routes. The local serve path now mints an ephemeral operator bearer, exports it before the app is built so the general API accepts it, and seeds the same token into the opened browser, so the panels load with no operator steps. A non-loopback bind never auto-mints and still refuses without configured auth; an operator-supplied token is reused verbatim; the token rides only the browser URL fragment, never the console or access log.
  • The startup banner is restored on program load (#2740). Two coupled defects had removed the recognisable ASCII wordmark. First, the bare bernstein invocation suppressed its fallback box banner even when the splash was disabled, so with visual.splash: false or BERNSTEIN_NO_SPLASH=1 no banner showed at all; the fallback now prints whenever the splash renders nothing. Second, the block-art logo only rendered in colour-capable terminals on the bare invocation, so plain terminals and every bernstein run fell back to a one-liner; the compact splash now draws the block-art wordmark on any interactive terminal wide enough to hold it, and the bernstein run startup banner is routed through it. Non-interactive output (CI, pipes) keeps the terse form.
  • bernstein run --idle stays on the mock adapter (#2741). The orchestrator subprocess overrode the explicit adapter with the seed's cli field, and since cli defaults to auto, any workspace with a bernstein.yaml silently discarded the mock override that --idle sets. Idle runs then spawned real coding agents, which failed provider authentication, tripped the adapter health monitor, and left every task failed. An explicit --adapter or BERNSTEIN_ADAPTER choice now takes precedence over the seed cli, mirroring the existing model-resolution rule; the seed value is used only when no adapter was passed explicitly.
  • The internal-LLM preflight notice is emitted once and reworded (#2742). The hint was logged on every seed construction, and the seed is parsed twice during gui serve, so operators saw it twice per process. It is now emitted at most once per process, and the wording states the fact and both remedies without alarmist phrasing.

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

Track chernistry/bernstein

Get notified when new releases ship.

Sign up free

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.

All releases →

Related context

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]