Known Limitations
July 11, 2026 ยท View on GitHub
Bernstein ships a lot of functionality, but several constraints still matter in practice. This page highlights the most relevant ones so users can plan safely.
1) Adapter parity is not perfect
What: Bernstein ships 40+ CLI adapters, but different CLI agents expose different capabilities and process semantics.
Impact: Stop/restart behavior, output shape, structured output support, and error handling can vary by adapter. The conformance harness (adapters/conformance.py) helps catch regressions across adapters.
Workaround:
- Run
bernstein doctorbefore long runs. - Run
bernstein test-adapter <name>to smoke-test specific adapters. - Prefer proven adapters (claude, codex, gemini) in production workflows.
- Use
bernstein stopfor controlled shutdown; use force-stop only when needed.
2) Multi-node execution is an advanced path
What: Bernstein has worker/cluster primitives and container execution support, but default operation remains single-host orchestration.
Impact: Large fan-out workloads can still bottleneck on one machine if you do not explicitly operate a distributed topology.
Workaround:
- Keep concurrency conservative.
- Use workspace decomposition and staged plans.
- Treat cluster/worker setups as advanced operations that require explicit validation in your environment.
- For a single long-running goal you want to detach from and reattach later, use
bernstein run-service submit/attach(below) rather than a full cluster.
Detached single-host runs (shipped): bernstein run-service decouples a run from the invoking terminal on one host. A session-detached supervisor owns execution while the durable work ledger owns state; attach proves ledger continuity across the detach boundary before rendering progress, and every lifecycle boundary is a signed audit-chain receipt. A supervisor killed mid-run resumes from the ledger tip with zero lost completed tasks. bernstein worker remains the multi-host fan-out path.
Off-host execution on ssh (shipped): bernstein run-service submit --backend ssh runs each task of a detached goal on another host over ssh, in its own isolated remote git worktree (one branch per task), and appends a signed run.ssh_task receipt binding that worktree so an offline verifier can prove each task ran in isolation across the ssh boundary. A supervisor killed mid-run resumes on the ssh backend from the ledger tip with zero lost completed tasks. Remote credentials are resolved from the credential vault only (--ssh-secret ENV=PROVIDER) and never reach the ledger or the receipts. Enabling the hosted sandbox backends in the existing registry (core/sandbox/backends/) behind an optional extra remains a later increment.
3) Some observability is near real-time, not instant
What: Bernstein provides SSE endpoints and metrics, but parts of the terminal UX still rely on polling/log aggregation.
Impact: Short lag can appear between underlying task/agent events and what the UI shows.
Workaround:
- Use API/SSE endpoints for automation and dashboards.
- Use
bernstein logsfor immediate diagnostics when investigating live behavior.
4) Retry and routing are intelligent but not omniscient
What: Retry escalation, routing, and cost controls are implemented, but provider limits and external failures are still discovered reactively in many cases.
Impact: First failures can still happen before fallback logic stabilizes execution.
Workaround:
- Set explicit budgets.
- Use deterministic completion signals/tests.
- Monitor early-run behavior and tune config for your environment.
- Declare per-role fallback chains under
provider_availabilityso dispatch probes provider health before spawning and fails over deterministically; runbernstein doctor --failover-drill(for example in CI) to find broken chains before an outage does.
5) Verification quality depends on project quality
What: Bernstein's gates and janitor checks can only validate what your project exposes (tests, linters, static checks, completion signals).
Impact: Weak test suites reduce confidence in "done" outcomes.
Workaround:
- Maintain strong tests and static checks.
- Add explicit
completion_signalsfor critical tasks. - Use review/audit workflows for high-risk changes.
6) Cost projections are estimates
What: Pre-run/early-run cost estimates are approximate and can drift for complex iterative tasks.
Impact: Expected and actual spend can diverge.
Workaround:
- Set hard budgets.
- Monitor spend via
bernstein costand cost endpoints. - Use anomaly detection and budget thresholds as guardrails.
- Use peak-hour routing (
peak_hour_router.py) to reduce costs during expensive windows.
7) Documentation lag
What: Bernstein evolves quickly; some docs may lag short-term behind newly shipped features.
Workaround:
- Cross-check CLI (
bernstein --help) and API routes when implementing automation. - Prefer core reference docs (
GETTING_STARTED,CONFIG,FEATURE_MATRIX) over older narrative pages. - Use
bernstein debugto generate a debug bundle for comprehensive triage.
8) Protocol negotiation is best-effort
What: Protocol negotiation (protocol_negotiation.py) detects version compatibility at connection time, but not all agents support all protocol versions.
Impact: Mixed-version deployments may see fallback behavior or reduced functionality when newer protocol features are unavailable on the remote side.
Workaround:
- Keep agent CLIs updated to versions that support the protocol features you need.
- Check the schema registry (
schema_registry.py) for supported message versions. - Use
bernstein test-adapterto validate protocol support before production runs.
Last updated: 2026-05-04.