Deterministic orchestrator for CLI coding agents (Claude Code, Codex, Gemini CLI, +40 more). No model in the coordination loop, so parallel runs in per-task git worktrees replay byte-identically. Signed lineage plus an opt-in HMAC audit chain a reviewer checks offline, without rerunning it. Cluster mode, air-gap deploy. https://bernstein.run
$ npx -y skills add sipyourdrink-ltd/bernstein --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
Repo: sipyourdrink-ltd/bernstein
What's inside

"To achieve great things, two things are needed: a plan and not quite enough time." - Leonard Bernstein
website ยท docs ยท install ยท first run ยท glossary ยท limitations ยท name policy ยท sponsor
Bernstein is a deterministic orchestrator for CLI coding agents (Claude Code, Codex, Gemini CLI, and 40+ more). Scheduling is plain Python - no LLM in the coordination loop - so runs are reproducible end to end. Every coding task runs in its own git worktree behind lint/type/test gates; artifact-mode tasks, which complete on a signed lineage receipt instead of a commit, get a plain working directory instead. Results stay checkable after the fact: an always-on lineage spine and replay journal, plus an opt-in HMAC-chained audit log (BERNSTEIN_AUDIT=1) with receipts you can verify offline. Air-gap install profile included. Apache-2.0.
Four things set it apart; everything after is detail.
.sdd/workspaces/. Under this default isolation there is no shared mutable state between agents; filesystem enforcement beyond that separation is opt-in, from the sandbox backends (disabling worktrees runs every task in the shared checkout).--prompt wrapper, file-based state, no SaaS hop, no third-party data plane.The full list is on the capabilities page; the feature matrix is the exhaustive index.
pipx install bernstein
bernstein init
bernstein -g "fix the failing test in tests/test_foo.py"
pip, uv, brew, dnf, npm, Docker, and the air-gapped wheelhouse are covered in the install guide.
The recording above is a real run, and it ships with its own proof: the cast, the signed run receipt that exact run produced, and the public key that pins it live together in docs/assets/demo-run/. Verify the run you just watched, offline:
bernstein verify receipt docs/assets/demo-run/run-receipt.json \
--public-key docs/assets/demo-run/run-receipt.pub.pem
CI re-verifies the committed receipt on every push โ and proves a tampered copy fails โ so the published evidence cannot rot into a decorative file. scripts/record_demo.sh regenerates the recording, receipt, and key from a fresh real run; nothing inside the terminal is synthesised.
A run in flight is watchable from either operator surface. Both read the same task API, so neither is a lagging mirror of the other.
![]() | ![]() |
|---|---|
bernstein live โ the terminal dashboard | bernstein gui serve โ the same run in a browser |
Determinism here is something you check, not something you take on faith. Run once with audit enabled, then verify what was recorded:
BERNSTEIN_AUDIT=1 bernstein -g "fix the failing test in tests/test_foo.py"
bernstein replay list # run ids recorded on disk
bernstein replay latest --verify # recompute the journal head, name the first divergent step
bernstein lineage verify <run_id> # recompute the always-on lineage spine
bernstein audit verify # HMAC chain + Merkle seal (written because audit was enabled)
bernstein audit diagnose <run_id> --signal gate --sign-key KEY
# name the exact step a failure entered the run, as a signed receipt
bernstein verify run <run_id> --signing-key-path key.pem # sign one portable run receipt
bernstein verify receipt .sdd/runs/<run_id>/run-receipt.json # verify it offline: file only
The journal and the lineage spine are written on every run. bernstein audit verify only has a chain to check when the run was started with BERNSTEIN_AUDIT=1, a compliance preset, or bernstein run --audit. The --audit flag belongs to bernstein run; on the bernstein -g form above, set the environment variable.
The run receipt binds the journal head and the lineage-spine head (plus, opt-in, an audit-chain range) under one Ed25519-signed subject with the public key embedded, so a reviewer holding the file and the operator's public key can confirm the recorded actions are exactly what executed - no HMAC key, no live .sdd/, exit 2 naming the first divergent step on tamper. With the file alone (no --public-key pin) the check is integrity-only: it proves the receipt is internally consistent, not who signed it, and the verdict says so. Details in deterministic replay.
The same checkability applies to evaluation numbers: bernstein bench run <suite> --reliability k (also spelled bernstein eval --reliability k) runs every task k times under fixed coordination and reports a pass^k floor (all k attempts must pass) alongside the pass@1 ceiling, sealed in a signed receipt that bernstein bench reliability-verify recomputes offline โ a fabricated floor fails verification. Details: pass^k reliability floor.
Each goal moves through four stages:
Why the scheduler is plain Python, and what that trades away: why deterministic.
cd your-project
bernstein init # creates .sdd/ workspace + bernstein.yaml
bernstein -g "Add rate limiting" # agents spawn, work in parallel, verify, exit
bernstein live # watch progress in the TUI dashboard
bernstein run plan.yaml # multi-stage plan: skip LLM planning, execute directly
bernstein stop # graceful shutdown with drain
The full operator surface (PR automation, schedules, chat bridges, the autofix daemon) is in operator commands.
Repository hygiene gates: bernstein readme-l10n verify fails a PR whose translated READMEs drifted from the English source (naming the stale section), bernstein readme-l10n sync rebinds them after an English edit. See readme-l10n.
Claude Code, Codex CLI, Gemini CLI, GitHub Copilot CLI, Cursor, Aider, Goose, OpenAI Agents SDK, Amp, Cody, Continue, Devin Terminal, Junie, Kilo, Kiro, AWS Q Developer, Ollama, OpenCode, OpenHands, Open Interpreter, gptme, Plandex, AIChat, Letta Code, Qwen, and more. The adapter index carries install commands for 29 of them; bernstein integrations list enumerates all 50 wired-in adapters from the registry in src/bernstein/adapters/registry.py, which is the single source of truth for what resolves; src/bernstein/adapters/use_cases.py carries the end-user copy for each one. Anything else with a --prompt flag works through the generic wrapper.
Mix agents in the same run: cheap local models for boilerplate, heavier cloud models for architecture. bernstein integrations list --installed shows what is available on your machine.
Everything deep lives on the docs site:
| capabilities | the full capability list: MCP server mode, signed agent cards, sandbox backends, artifact sinks, regulatory mappings |
| who this is for | where the value lands, and where Bernstein is the wrong tool |
| workflows | declarative YAML DAGs of agent / command / loop nodes |
| web UI | browser dashboard on the same API the TUI uses |
| cloud execution | experimental: run agents on Cloudflare Workers with R2 workspace sync against your own account. The hosted api.bernstein.run service is not yet available |
| datasources | read-only query receipts, plus a query driver that binds each result to the schema snapshot it was derived against |
| security | scorecard, fuzzing, hardening |
| architecture | how it works under the hood |
Bernstein is named after Leonard Bernstein, the American conductor and composer. The project orchestrates a crew of CLI coding agents the way Bernstein conducted the New York Philharmonic: every player on cue, the score deterministic, the conductor accountable for the result. He is the original orchestrator the project takes its name from.
i wrote bernstein because i was paying $400/month in claude bills running three coding agents in parallel and getting nondeterministic merges. Apache 2.0, solo maintained. Live stats: bernstein.run.
Listed in vinta/awesome-python, covered in Augment Code's open-source agent orchestrators roundup, cited by awesome-agentic-patterns as the production implementation of deterministic zero-LLM orchestration, featured in Python Weekly #742, and ranked as the orchestration layer in a ten-repo Claude Code agent-system breakdown.
The full tracked list, including every awesome-list entry, catalog listing, prior-art citation, and newsletter mention, lives in docs/mentions.md. Entries are added as they appear; corrections welcome by issue or PR.
PRs welcome; CONTRIBUTING.md has setup and code style. Security reports go through SECURITY.md. If Bernstein saves you time: GitHub Sponsors. Contact: forte@bernstein.run.
Citation metadata lives in CITATION.cff. License: Apache-2.0; the project name is covered separately in TRADEMARKS.md.
Alex Chernysh ยท GitHub ยท X ยท bernstein.run
.aider.conf.yml
.bandit
.bandit-baseline.json
.bernstein/
rules.yaml
scenarios/
docs/
rfc-drafting.yaml
wiki-refresh-from-code.yaml
enterprise/
legacy-modernization-program.yaml
regulator-audit-evidence-pack.yaml
supply-chain-hardening.yaml
growth/
contributor-onboarding.yaml
issue-triage-workflow.yaml
research/
market-scan.yaml
paper-digest-pipeline.yaml
software/
api-breaking-migration.yaml
ci-remediation.yaml
dead-code-removal.yaml
dependency-upgrade-sweep.yaml
docs-upgrade.yaml
large-codebase-audit.yaml
monorepo-extraction.yaml
security-fix-sweep.yaml
test-coverage-uplift.yaml
workflows/
audit-evidence-pack.yaml
ci-pipeline.yaml
parallel-review-merge.yaml
sequential-deprecation-rollout.yaml
.clusterfuzzlite/
build.sh
Dockerfile
fuzz_seed_parser.py
project.yaml
requirements.txt
.coverage-baseline.json
.cursor/
rules/
architecture.mdc
build-test.mdc
directory-context.mdc
documentation-duty.mdc
git-workflow.mdc
module-map.mdc
overview.mdc
roles.mdc
setup.mdc
.devcontainer/
devcontainer.json
.gitattributes
.github/
actions/
bootstrap/
action.yml
CODEOWNERS
codeql/
codeql-config.yml
copilot-instructions.md
FUNDING.yml
ISSUE_TEMPLATE/
bug_report.yml
config.yml
evolve-candidate.md
feature_request.yml
new_adapter.yml
security.md
verification_failure.yml
labeler.yml
pull_request_template.md
r-counter-allowlist.txt
windows-lane-baseline.json
workflows/
a2a-federation-e2e.yml
adapter-conformance-canary.yml
adapter-contract-drift.yml
airgap-e2e.yml
auto-heal.yml
auto-release.yml
bernstein-ci-fix.yml
bernstein-issues-decompose.yml
bernstein-pr-review.yml
bisect-on-red.yml
branch-protection-audit.yml
ci-gate-stub.yml
ci-macos-nightly.yml
ci-topology-heal.yml
ci-weekly-digest.yml
ci.yml
cifuzz-pr.yml
cleanup-runs.yml
cluster-e2e.yml
cluster-tunnel-e2e.yml
codeql.yml
contract-drift-autofix.yml
coverage-ratchet-weekly.yml
coverage-ratchet.yml
dependabot-auto-merge.yml
dependency-review.yml
docs-drift.yml
docs-observability-snapshot.yml
eval-nightly.yml
hotfix-r-tracker.yml
license-compliance.yml
main-sha-marker.yml
mutation-fixed.yml
nightly-canary.yml
nightly-deep-tests.yml
nightly-drift-sweep.yml
pentest.yml
post-ci-dispatcher.yml
pr-labels.yml
pr-observability-summary.yml
pr-policy.yml
publish-docker.yml
publish-extension.yml
publish-homebrew.yml
publish.yml
reconcile-release.yml
release-major-minor.yml
required-check-canary.yml
review-bot-ack-publish.yml
review-bot-ack.yml
review-bot-sweep.yml
sbom.yml
scorecard.yml
soc2-evidence-nightly.yml
spa-bundle-freshness.yml
spiffe-extra-e2e.yml
stale.yml
static-analysis-extended.yml
trufflehog.yml
trunk-health-slo.yml
typecheck-ts.yml
zizmor.yml
.gitignore
.goosehints
.importlinter
.mailmap
.mcp.json
.plugin/
plugin.json
.pre-commit-config.yaml
.python-version
.readthedocs.yaml
.semgrep.yml
.well-known/
security.txt
action/
action.yml
entrypoint.sh
agents/
AGENTS.md
orchestrator.md
benchmarks/
bench_orchestrator.py
bench_quality_gates.py
bench_startup.py
bench_task_store.py
issues.json
README.md
run_benchmark.py
swe_bench/
__init__.py
harness.py
metrics.py
public_site.py
report.py
run.py
scenarios.py
tasks/
task_001_rest_endpoints.yaml
task_002_refactor_clean_arch.yaml
task_003_auth_middleware.yaml
task_004_lint_fixes.yaml
task_005_error_handling.yaml
task_006_integration_tests.yaml
task_007_rate_limiting.yaml
task_008_openapi_spec.yaml
task_009_logging_monitoring.yaml
task_010_security_audit.yaml
bernstein-skills.toml
bernstein.yaml
CHANGELOG.md
CITATION.cff
CLAUDE.md
CODE_OF_CONDUCT.md
codecov.yml
commands/
run.md
status.md
stop.md
community/
awesome-bernstein-plugins.md
config/
eu_ai_act_clause_map.yaml
context7.json
CONTRIBUTING.md
CONTRIBUTORS.md
CONVENTIONS.md
deploy/
github-app/
app.yml
README.md
grafana/
dashboard.json
dashboards/
bernstein-otel.json
provisioning/
dashboards/
bernstein.yml
datasources/
prometheus.yml
helm/
bernstein/
.helmignore
Chart.yaml
crds/
bernsteinplan.yaml
bernsteinrun.yaml
README.md
templates/
_helpers.tpl
configmap.yaml
deployment-operator.yaml
deployment-server.yaml
hpa.yaml
ingress.yaml
NOTES.txt
prometheusrule.yaml
pvc-server.yaml
rbac-operator.yaml
secret-auth.yaml
service-grpc.yaml
service.yaml
servicemonitor.yaml
statefulset-orchestrator.yaml
statefulset-worker.yaml
values.yaml
prometheus-adapter-values.yaml
otel-collector/
otel-collector-config.yaml
prometheus/
prometheus.yml
docker/
docker-compose.yaml
demo/
Caddyfile
demo-cycle.sh
docker-compose.yaml
Dockerfile
sandbox/
Caddyfile
docker-compose.researcher.yaml
docker-compose.yaml
Dockerfile
docs/
_internal/
observability/
snapshots/
2026-05-22.json
2026-05-24.json
2026-07-02.json
2026-07-04.json
2026-07-05.json
2026-07-06.json
2026-07-11.json
2026-07-12.json
2026-07-16.json
review-bot/
deferred-2026-05-19.md
.nojekyll
adapter-deferred.md
adapters/
ADAPTER_GUIDE.md
admission-receipts.md
agy.md
antigravity.md
capability_contract.md
capability_profiles.md
clm.md
compatibility.md
computer_use.md
conformance-canary.md
deepseek.md
gemini.md
index.md
openai-agents-comparison.md
openai-agents.md
schemas.md
security-floor.md
session_isolation.md
stream_signals.md
test-adapter.md
agents-md.md
agents.txt
api/
supervisor.md
architecture/
a2a.md
adaptive-parallelism.md
ARCHITECTURE.md
batch-routing.md
cas-store.md
context-degradation-detector.md
deadlock-detection.md
DEPENDENCY_RESOLVER.md
DESIGN.md
fast-path-execution.md
graphs.md
index.md
LIFECYCLE.md
memory_tiers.md
model-routing.md
orchestration-approaches.md
permission-modes.md
plans.md
protocol-negotiation.md
quality-pipeline.md
sandbox.md
schema-registry.md
skills.md
state-persistence.md
storage.md
subagent-delegation.md
warm-pool.md
WHY_DETERMINISTIC.md
assets/
architecture.svg
ascii_logo.md
banner_one_command_1536x1024.png
banner-readme.png
demo-run/
demo.cast
demo.gif
run-receipt.json
run-receipt.pub.pem
icon.jpeg
loading.gif
logo_square_200.png
logo_square.png
logo-dark.svg
logo-light.svg
reddit-feedback.png
tui-agents.png
tui-banner.png
tui-live.svg
tui-loading.png
tui.svg
web-dashboard.png
webui-agents-diffs.png
webui-agents-panel.png
webui-agents.png
webui-approvals.png
webui-audit.png
webui-costs.png
webui-fleet.png
webui-renders.json
webui-settings.png
webui-tasks.png
autofix/
ladder.md
telemetry-grounded.md
benchmarks/
BENCHMARKS.md
leaderboard.html
blog/
cobol-modernization.md
multi-agent-benchmark.md
self-evolution-30-days.md
ten-agents-one-release.md
v1.9-four-commands-last-mile.md
zero-llm-coordination.md
CHANGELOG.md
ci/
extended-static-analysis.md
cloudflare/
cloudflare-adapters.md
cloudflare-ai.md
cloudflare-analytics.md
cloudflare-bridges.md
cloudflare-browser-rendering.md
cloudflare-cli.md
cloudflare-codex-sandbox.md
cloudflare-mcp.md
cloudflare-overview.md
cloudflare-setup.md
cluster/
deployment-patterns.md
mtls-setup.md
CODE_REVIEW.md
compliance/
eu-ai-act-article-12-bundle.md
eu-residency-customer-setup.md
finos-aigf-mapping.md
lineage-export.md
... 1600 moreShowing a partial view of a very large repo.
FAQ
bernstein is a Claude Code plugin with 26 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes bernstein-agents, bernstein-alerts, bernstein-approve. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.